概述
為什么使用SLF4J
log4j簡介
slf4j+log4j環境搭建
為什么使用SLF4J
參考: https://www.oschina.net/translate/why-use-sl4j-over-log4j-for-logging
SLF4J 即 Simple Logging Facade for Java
1.SLF4J的主要動機是讓你的程序獨立於任何特定的日志記錄庫,這些日志記錄庫可能需要與你現在配置不同的配置,而且還會引入更多令人頭疼的維護問題
日志的框架Log4J,logback和java.util.Logging
2.SLF4J API還有一個讓你使用SLF4J而不是用長期感興趣的 Log4j 更讓人信服的功能,也就是占位符功能,在代碼中用{}來表示。
占位符功能與 String的format()方法中 的%s非常相似,因為它在運行時刻才提取所提供的真正的字符串。
這不僅縮減了代碼中的許多字符串連接,而且減少了創建String對象所需要的資源。
不使用slf4j的寫法
if (logger.isDebugEnabled()) {
logger.debug("Processing trade with id: " + id + " symbol: " + symbol);
}
使用slf4j的寫法
logger.debug("Processing trade with id: {} and symbol : {} ", id, symbol);
log4j簡介
參考:log4j介紹 http://www.cnblogs.com/wangzhuxing/p/7753420.html
1.Log4j三個主要的組件
Loggers(記錄器),Appenders (輸出源)和Layouts(布局)。
記錄器決定日志類別-描述日志信息的重要程度,輸出源決定日志要輸出的地方、布局決定日志以何種形式輸出。
綜合使用這三個組件可以輕松地記錄信息的類型和級別,並可以在運行時控制日志輸出的樣式和位置。
2.日志的五個級別
DEBUG、INFO、WARN、ERROR和FATAL。
這五個級別是有順序的,DEBUG < INFO < WARN < ERROR < FATAL,分別用來指定這條日志信息的重要程度
Log4j有一個規則:只輸出級別不低於設定級別的日志信息,假設Loggers級別設定為INFO,則INFO、WARN、ERROR和FATAL級別的日志信息都會輸出,而級別比INFO低的DEBUG則不會輸出。
3.配置根Logger
log4j.rootLogger = [ level ] , appenderName1, appenderName2
4.Appenders
禁用和使用日志請求只是Log4j的基本功能。
Log4j日志系統還提供許多強大的功能,比如允許把日志輸出到不同的地方,如控制台(Console)、文件(Files)等,
可以根據天數或者文件大小產生新的文件,
可以以流的形式發送到其它地方等等。
org.apache.log4j.ConsoleAppender(控制台)
org.apache.log4j.FileAppender(文件)
org.apache.log4j.DailyRollingFileAppender(每天產生一個日志文件)
org.apache.log4j.RollingFileAppender(文件大小到達指定尺寸的時候產生一個新的文件)
org.apache.log4j.WriterAppender(將日志信息以流格式發送到任意指定的地方)
配置模式:
log4j.appender.appenderName = className
log4j.appender.appenderName.Option1 = value1
log4j.appender.appenderName.OptionN = valueN
5.Layout
#以HTML表格形式布局
log4j.appender.appenderName.layout=org.apache.log4j.HTMLLayout
#包含日志信息的級別和信息字符串
log4j.appender.appenderName.layout=org.apache.log4j.SimpleLayout
#包含日志產生的時間、線程、類別等等信息
log4j.appender.appenderName.layout=org.apache.log4j.TTCCLayout
#可以靈活地指定布局模式 --常用
log4j.appender.appenderName.layout=org.apache.log4j.PatternLayout
格式化符號說明:
%p:輸出日志信息的優先級,即DEBUG,INFO,WARN,ERROR,FATAL。
%d:輸出日志時間點的日期或時間,默認格式為ISO8601,也可以在其后指定格式,如:%d{yyyy/MM/dd HH:mm:ss,SSS}。
%r:輸出自應用程序啟動到輸出該log信息耗費的毫秒數。
%t:輸出產生該日志事件的線程名。
%l:輸出日志事件的發生位置,相當於%c.%M(%F:%L)的組合,包括類全名、方法、文件名以及在代碼中的行數。例如:test.TestLog4j.main(TestLog4j.java:10)。
%c:輸出日志信息所屬的類目,通常就是所在類的全名。
%M:輸出產生日志信息的方法名。
%F:輸出日志消息產生時所在的文件名稱。
%L::輸出代碼中的行號。
%m::輸出代碼中指定的具體日志信息。
%n:輸出一個回車換行符,Windows平台為"rn",Unix平台為"n"。
%x:輸出和當前線程相關聯的NDC(嵌套診斷環境),尤其用到像java servlets這樣的多客戶多線程的應用中。
%%:輸出一個"%"字符。
另外,還可以在%與格式字符之間加上修飾符來控制其最小長度、最大長度、和文本的對齊方式。如:
1) c:指定輸出category的名稱,最小的長度是20,如果category的名稱長度小於20的話,默認的情況下右對齊。
2)%-20c:"-"號表示左對齊。
3)%.30c:指定輸出category的名稱,最大的長度是30,如果category的名稱長度大於30的話,就會將左邊多出的字符截掉,但小於30的話也不會補空格。
slf4j+log4j環境搭建
引入jar
slf4j-api-1.7.23.jar 這個是slf4j定義了日志的抽象層
slf4j-log4j12-1.7.6.jar 這個是專為log4j寫的適配器,實現了抽象層定義的方法
log4j-1.2.17.jar log4j 具體的日志框架
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.21</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<!-- 依賴log4j,因此會自動引入相關jar包-->
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.21</version>
</dependency>
配置文件log4j.properties
配置文件放在class下的任何路徑下即可,框架會自動查詢的。
#配置根Logger 定義缺省的日志級別為INFO 自定義多個輸出對象appender:一個是控制台console、一個是按照時間產生新文件 log4j.rootLogger=debug,console,dailyRolling #針對package定義日志級別 log4j.logger.org.apache=WARN log4j.logger.com.paic.pafademo=WARN log4j.logger.org.quartz=INFO log4j.logger.org.springframework.scheduling.quartz=INFO # 如果要查看MBATIS的SQL日志信息,確保有下面配置 log4j.logger.com.ibatis=DEBUG log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=DEBUG log4j.logger.com.ibatis.common.jdbc.ScriptRunner=DEBUG log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=DEBUG log4j.logger.java.sql.ResultSet=DEBUG log4j.logger.java.sql.Connection=DEBUG log4j.logger.java.sql.Statement=DEBUG log4j.logger.java.sql.PreparedStatement=DEBUG # 設定控制台console的輸出模式 log4j.appender.console=org.apache.log4j.ConsoleAppender log4j.appender.console.Encoding=UTF-8 log4j.appender.console.layout=org.apache.log4j.PatternLayout #指定日志信息的最低輸出級別,默認為DEBUG log4j.appender.console.Threshold=DEBUG log4j.appender.console.layout.ConversionPattern=[%d{yyyy-MM-dd HH:mm:ss}] [%-3p] %c{1}: %X{MDCString} %m%n # 設定dailyRolling的輸出模式,按照時間產生新文件 log4j.appender.dailyRolling=org.apache.log4j.DailyRollingFileAppender # ${log.home}通過參數-D指定,比如啟動WebLogic時加入參數-Dlog.home=D:/ log4j.appender.dailyRolling.File=${log.home}/testProject.log #'.'yyyy-MM:每月 #'.'yyyy-ww:每周 #'.'yyyy-MM-dd:每天 #'.'yyyy-MM-dd-a:每天兩次 #'.'yyyy-MM-dd-HH:每小時 #'.'yyyy-MM-dd-HH-mm:每分鍾 log4j.appender.dailyRolling.DatePattern='.'yyyy-MM-dd-HH-mm log4j.appender.dailyRolling.layout=org.apache.log4j.PatternLayout log4j.appender.dailyRolling.layout.ConversionPattern=%x %d{yyyy-MM-dd HH:mm:ss} [%-3p] %c{1}: %m%n #針對package定義日志級別 #單獨將某一模塊(某包下)的日志信息輸出到某一個文件 log4j.logger.com.person=DEBUG,personModelLogger #確保寫入personModelLogger.log文件信息不重復出現到其他日志文件中 log4j.additivity.com.person=false #設置最低日志輸出級別 log4j.appender.personModelLogger.Threshold=INFO #按照大小產生新文件 log4j.appender.personModelLogger=org.apache.log4j.RollingFileAppender log4j.appender.personModelLogger.File=d:/personModelLogger.log log4j.appender.personModelLogger.Append=true #后綴可以是KB, MB 或者GB log4j.appender.personModelLogger.MaxFileSize=1MB #指定可以產生的滾動文件的最大數,例如,設為2則可以產生personModelLogger.log.1,personModelLogger.log.2兩個滾動文件和一個personModelLogger.log文件 log4j.appender.personModelLogger.MaxBackupIndex=2 log4j.appender.personModelLogger.layout=org.apache.log4j.PatternLayout log4j.appender.personModelLogger.layout.ConversionPattern=%x %d{MM/dd HH:mm:ss} [%-3p] %c{1}: %m%n #單獨將一個類的日志輸出到一個文件中 log4j.logger.com.person.log4j.Log4jTest=DEBUG,Log4jTestLogger,console #additivity設置為false,則不會輸出到rootLogger定義的console,dailyRolling輸出對象,但是如果我還是只想輸出到控制台,可以修改為如下即可 #log4j.logger.com.person.log4j.Log4jTest=DEBUG,Log4jTestLogger,console #確保寫入Log4jTestLogger.log文件信息不重復出現到其他日志文件中,Log4jTestLogger比personModelLogger的范圍更小,因此personModelLogger中不會出現類Log4jTest的日志 log4j.additivity.com.person.log4j.Log4jTest=false log4j.appender.Log4jTestLogger=org.apache.log4j.FileAppender log4j.appender.Log4jTestLogger.File=d:/Log4jTestLogger.log log4j.appender.Log4jTestLogger.layout=org.apache.log4j.PatternLayout log4j.appender.Log4jTestLogger.layout.ConversionPattern=%x %d{MM/dd HH:mm:ss} [%-3p] %c{1}: %m%n #類中獲得自定義的記錄器,在類中使用myLogger時會將日志寫在myLogger.log中。 #類中獲得該記錄器: private static final Logger myLogger = LoggerFactory.getLogger("myLogger"); log4j.logger.myLogger=DEBUG,myLogger #默認true,自定義的日志默認是同時輸出到log4j.rootLogger所配置的日志中的 log4j.additivity.com.person.log4j.Log4jTest=true log4j.appender.myLogger=org.apache.log4j.FileAppender log4j.appender.myLogger.File=d:/myLogger.log log4j.appender.myLogger.layout=org.apache.log4j.PatternLayout log4j.appender.myLogger.layout.ConversionPattern=%x %d{MM/dd HH:mm:ss} [%-3p] %c{1}: %m%n
測試類
package com.person.log4j; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class Log4jTest { private static final Logger LOGGER = LoggerFactory.getLogger(Log4jTest.class); private static final Logger myLogger = LoggerFactory.getLogger("myLogger"); public static void main(String[] args) { String topic = "交易"; String id="31242341"; LOGGER.info("Receive check msg:[msgTopic:{},msgId:{}]", topic, id); myLogger.info("this msg should be output to d:/myLogger.log"); } }