log4j簡易入門
package test.log4j;
import org.apache.log4j.Logger;
publicclass HelloLog4j {
privatestaticfinal Logger logger = Logger.getLogger(HelloLog4j.class);
publicstaticvoid main(String[] args) {
logger.debug("This is debug message");
logger.info("This is info message");
logger.warn("This is warn message");
logger.error("This is error message");
}
}
log4j簡單配置log4j.properties
#可以設置級別:debug < info < warn < error
#debug: 顯示debug, info, warn, error
#info: 顯示info, warn, error
#warn: 顯示warn, error
#error: 只顯示error
#日志的輸出級別由rootLogger和普通Logger設置的最高級別決定。
#log4j.rootLogger=debug,appender1
#log4j.rootLogger=info,appender1
log4j.rootLogger=warn,appender1
#log4j.rootLogger=error,appender1
#輸出到控制台
log4j.appender.appender1=org.apache.log4j.ConsoleAppender
#樣式為TTCCLayout
log4j.appender.appender1.layout=org.apache.log4j.TTCCLayout
#這里配置的是類所在的包test.log4j, 逗號之前未配置日志輸出級別,默認為根logger的級別
log4j.logger.test.log4j=, TEST
log4j.appender.TEST=org.apache.log4j.ConsoleAppender
log4j.appender.TEST.layout=org.apache.log4j.TTCCLayout
log4j提供的Appender
org.apache.log4j.ConsoleAppender(控制台),
org.apache.log4j.FileAppender(文件),
org.apache.log4j.DailyRollingFileAppender(每天產生一個日志文件),
org.apache.log4j.RollingFileAppender(文件大小到達指定尺寸的時候產生一個新的文件),
org.apache.log4j.WriterAppender(將日志信息以流格式發送到任意指定的地方)
log4j提供的Layout
org.apache.log4j.HTMLLayout(以HTML表格形式布局),
org.apache.log4j.PatternLayout(可以靈活地指定布局模式),
org.apache.log4j.SimpleLayout(包含日志信息的級別和信息字符串),
org.apache.log4j.TTCCLayout(包含日志產生的時間、線程、類別等等信息)
Log4J采用類似C語言中的printf函數的打印格式格式化日志信息,打印參數如下:
%m 輸出代碼中指定的消息
%p 輸出優先級,即DEBUG,INFO,WARN,ERROR,FATAL
%r 輸出自應用啟動到輸出該log信息耗費的毫秒數
%c 輸出所屬的類目,通常就是所在類的全名
%t 輸出產生該日志事件的線程名
%n 輸出一個回車換行符,Windows平台為“rn”,Unix平台為“n”
%d 輸出日志時間點的日期或時間,默認格式為ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},輸出類似:2002年10月18日 22:10:28,921
%l 輸出日志事件的發生位置,包括類目名、發生的線程,以及在代碼中的行數。舉例:Testlog4.main(TestLog4.java:10)
以上資料參考:http://www.iteye.com/topic/378077
slf4j簡介
SLF4J不是具體的日志解決方案,它只服務於各種各樣的日志系統。按照官方的說法,SLF4J是一個用於日志系統的簡單Facade,允許最終用戶在部署其應用時使用其所希望的日志系統。
實際上,SLF4J所提供的核心API是一些接口以及一個LoggerFactory的工廠類。從某種程度上,SLF4J有點類似JDBC,不過比JDBC更簡單,在JDBC中,你需要指定驅動程序,而在使用SLF4J的時候,不需要在代碼中或配置文件中指定你打算使用那個具體的日志系統。如同使用JDBC基本不用考慮具體數據庫一樣,SLF4J提供了統一的記錄日志的接口,只要按照其提供的方法記錄即可,最終日志的格式、記錄級別、輸出方式等通過具體日志系統的配置來實現,因此可以在應用中靈活切換日志系統。
slf4j簡單示例
package test.slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
publicclass HelloSlf4j {
privatestaticfinal Logger logger = LoggerFactory.getLogger(HelloSlf4j.class);
publicstaticvoid main(String[] args) {
logger.debug("This is debug message");
logger.info("This is info message");
logger.warn("This is warn message");
logger.error("This is error message");
}
}
假設使用log4j做為底層日志工具,運行以上程序需要三個包:log4j-1.2.xx.jar、slf4j-api-x.x.x.jar、以及slf4j-log4j12-x.x.x.jar,后兩個包由slf4j提供,包名中的x表示版本號。
獲得logger對象:
java代碼:
- private static final Logger logger = LoggerFactory.getLogger(Test.class);
- 輸出日志信息:
- logger.debug(“debug”);
slf4j中的占位符—不再需要冗長的級別判斷
大家應該還記得,在log4j中,為了提高運行效率,往往在輸出信息之前,還要進行級別判斷,以避免無效的字符串連接操作。如下:
if (logger.isDebugEnabled()){
logger.debug(“debug:“+name);
}
slf4j巧妙的解決了這個問題:先傳入帶有占位符的字符串,同時把其他參數傳入,在slf4j的內容部實現中,如果級別合適再去用傳入的參數去替換字符串中的占位符,否則不用執行。
logger.info("{} is {}", new String[]{“x",“y"});