簡體   English   中英

log4j的優點

[英]Advantage of log4j

log4j優於設置System.outSystem.err輸出到日志文件的優勢是什么?

從較高的層面來說,Log4j在手動記錄方面的勝利是,您可以將日志記錄代碼與實際要記錄的內容以及記錄位置和方式進行分離。 有關記錄詳細程度/過濾,格式化,日志位置甚至日志類型(文件,網絡等)的詳細信息都是使用配置以可擴展方式通過自定義appender以聲明方式處理的,而您必須自己編寫這種靈活性的代碼。

這非常重要,因為開發人員通常很難預測一旦軟件投入生產后日志記錄需求將如何變化。 管理該軟件的運營團隊可能需要更少的詳細日志,可能需要多個日志,可能需要將這些日志發送到多個服務器,有時可能需要獲得真正詳細的數據以進行故障排除等。如果需要,運營團隊通常不可能改變日志記錄的工作方式,說服開發人員進行大的代碼更改。 這通常會導致生產停工,運營和開發之間的摩擦,以及浪費時間。

從開發人員的角度來看,Log4j使您不必進行代碼更改以支持日志記錄,並使您不會被希望記錄更改的人所困擾。 它使管理代碼的人能夠抓住自己的癢而不是煩擾你!

此外,由於Log4j是Java日志記錄的事實標准,因此有許多工具可以使用Log4j做很酷的事情 - 此外還會阻止您和您的運營團隊重新發明輪子。

我最喜歡的功能是能夠輕松編寫appender將數據發送到非文件源,如SYSLOGSplunk等,這使您的應用程序可以輕松自定義登錄到您的IT部門已經使用的操作管理工具。

實際上,這些天您應該查看slf4j的外觀,因為它允許您使用{} -placeholders來獲得最簡潔的語句。 然后,您可以使用slf4j后面的相應日志記錄框架來處理日志語句的實際處理。 這可能是log4j或slf4j-simple,它只打印出所有的INFO,WARN和ERROR,並丟棄其余部分。

您需要做的關鍵觀察是,在編寫代碼時完成日志語句的寫入,並且在部署代碼時完成所需內容的決策,這可能是代碼編寫和測試后的數年。 System.out.println要求您在物理上更改代碼以擺脫它們,這在嚴格的write-test-deploy循環中是不可接受的。 如果代碼發生變化,則必須重新測試。 使用slf4j,您只需啟用想要查看的人。

我們在測試階段進行了完整的日志記錄,而在生產部署的初始階段進行了詳細的日志記錄,之后我們僅查看信息。 這為我們提供了完整的信息,在這種情況下很少能夠調試案例。

您可能會發現我寫的這篇文章很有趣。 目標受眾正在開始Java程序員,我打算從一開始就給他們良好的習慣。 http://runjva.appspot.com/logging101/index.html

看看你會明白log4j的強大功能:

log4j.properties我曾經用過一次項目:

# ALL < DEBUG < INFO < WARN < ERROR < FATAL < OFF

# No appenders for rootLogger 
log4j.rootLogger=OFF

folder=..
prefix=
fileExtension=.log
htmlExtension=${fileExtension}.html
datestamp=yyyy-MM-dd/HH:mm:ss.SSS/zzz
layout=%d{${datestamp}} ms=%-4r [%t] %-5p %l %n%m %n%n

# myLogger logger
log4j.logger.myLogger=ALL, stdout, infoFile, infoHtml, errorFile

# stdout 
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=${layout}
# infoFile 
log4j.appender.infoFile=org.apache.log4j.FileAppender
log4j.appender.infoFile.File=${folder}/${prefix}_info${fileExtension}
log4j.appender.infoFile.layout=org.apache.log4j.PatternLayout
log4j.appender.infoFile.layout.ConversionPattern=${layout}
# infoHtml 
log4j.appender.infoHtml=org.apache.log4j.FileAppender
log4j.appender.infoHtml.File=${folder}/${prefix}_info${htmlExtension}
log4j.appender.infoHtml.layout=org.apache.log4j.HTMLLayout
log4j.appender.infoHtml.layout.Title=Logs
log4j.appender.infoHtml.layout.LocationInfo=true
# errorFile 
log4j.appender.errorFile=org.apache.log4j.FileAppender
log4j.appender.errorFile.File=${folder}/${prefix}_error${fileExtension}
log4j.appender.errorFile.layout=org.apache.log4j.PatternLayout
log4j.appender.errorFile.layout.ConversionPattern=${layout}

# APPENDERS SETTINGS
log4j.appender.stdout.Threshold = ALL
log4j.appender.infoFile.Threshold = INFO
log4j.appender.infoHtml.Threshold = INFO
log4j.appender.errorFile.Threshold = WARN.

要更改java代碼中的變量,您可以執行以下操作:

加載配置

如果配置存儲在名為“log4j.properties”的文件中並且存在於“”下的類路徑上(例如WEB-INF / classes / log4j.properties),Log4j將自動加載配置。

我不喜歡這種方法,並且更喜歡通過調用以下方式顯式加載配置:

PropertyConfigurator.configure(Config.ETC +“/ log4j.properties”); 這樣,只要我的應用程序仍在運行,我就可以隨時重新加載配置。 我想在管理jsp中添加一個按鈕,“Reload Log4J”。

動態日志文件位置

許多人抱怨Log4j強迫您硬編碼保存日志的位置。 實際上,可以動態選擇日志文件位置,特別是如果您使用上面的$ {log.dir}屬性替換技術。 這是如何做:

String dynamicLog = // log directory somehow chosen... 
Properties p = new Properties( Config.ETC + "/log4j.properties" ); 
p.put( "log.dir", dynamicLog ); // overwrite "log.dir" 
PropertyConfigurator.configure( p );

我的最愛(不是全部)

  • 能夠設置登錄配置的參數,無需重新編譯
  • 能夠設置日志的寫入方式(從文本文件到SMTP發送方)
  • 能夠按嚴重程度過濾

級別,格式化,記錄到多個文件......如果在代碼運行時可能出現任何問題,則日志框架(即使它是java.util.logging)非常有用。

Log4j提供了根據大小旋轉日志文件的功能,並根據數量(logrotate)刪除它們,因此您的服務器不會填滿其磁盤。 我個人認為這是Log4j中更有價值的功能之一。

Log4j也受到許多開發人員的歡迎和理解。 我工作過的最后三家公司都在大多數項目中都使用過Log4j。

log4j允許您登錄各種資源,例如事件日志,電子郵件,文件系統等,同時允許您的應用程序與所有這些資源保持分離。 此外,您可以使用通用接口登錄所有各種資源,而無需學習或集成相應的API。

  • 記錄(記錄發生的歷史業務事件,您可以檢查舊日志)
  • 跟蹤應用程序(項目流程)
  • 調試應用程序(詳細信息在粒度級別的方法中發生的事情//數據,值和所有內部方法)
  • 錯誤處理(有關發生的特定錯誤的信息)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM