log4j2的簡單學習:html
package com.book.web.controller; import org.slf4j.Logger; import org.slf4j.LoggerFactory; //import org.apache.commons.logging.Log; //import org.apache.commons.logging.LogFactory; //import org.apache.logging.log4j.LogManager; //import org.apache.logging.log4j.Logger; /** * log4j2測試 * @author liweihan * */ public class TestLog4j2Log { /** 1. <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.5</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.5</version> </dependency> 若是是web環境能夠加入:由於會提示: Log4j appears to be running in a Servlet environment, but there's no log4j-web module available. If you want better web container support, please add the log4j-web JAR to your web archive or server lib directory. <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-web</artifactId> <version>2.2</version> </dependency> 2. log4j2與log4j1發生了很大的變化,不兼容。 log4j1僅僅做爲一個實際的日誌框架, slf4j、commons-logging做爲門面,統一各類日誌框架的混亂格局, 如今log4j2也想跳出來充當門面了,也想統一你們了!! 3.log4j2分紅2個部分: log4j-api: 做爲日誌接口層,用於統一底層日誌系統 log4j-core : 做爲上述日誌接口的實現,是一個實際的日誌框架 4.log4j 2.x版本再也不支持像1.x中的.properties後綴的文件配置方式, 2.x版本配置文件後綴名只能爲」.xml」,」.json」或者」.jsn」。 log4j2默認會在classpath目錄下尋找: <1.>log4j2-test.json 或者log4j2-test.jsn的文件 <2.>log4j2-test.xml的文件. <3.>log4j2.json 或者log4j2.jsn的文件. <4.>log4j2.xml的文件. 若是都沒有找到,則會按默認配置輸出,也就是輸出到控制檯 5.和log4j1是不一樣的。此時Logger是log4j-api中定義的接口,而log4j1中的Logger則是類 6.若是要log4j2與commons-logging集成,還須要引入jar包: <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-jcl</artifactId> <version>2.2</version> </dependency> commons-logging log4j-api (log4j2的API包) log4j-core (log4j2的API實現包) log4j-jcl (log4j2與commons-logging的集成包) private static Log logger = LogFactory.getLog(TestLog4j2Log.class); 使用commons-logging的Log接口和LogFactory來進行編寫,看不到log4j2的影子。 可是這時候含有上述幾個jar包,log4j2就與commons-logging集成了起來。 common-logging貌似不支持佔位符! 7.若是log4j2與slf4j集成,還須要引入jar包: <!-- log4j2與slf4j集成 --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.7</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> <version>2.5</version> </dependency> log4j-slf4j-impl : 用於log4j2與slf4j集成 獲取logger的方式: private static Logger logger=LoggerFactory.getLogger(Log4j2Slf4jTest.class); */ // private static final Logger logger = LogManager.getLogger(TestLog4j2Log.class); // private static Log logger = LogFactory.getLog(TestLog4j2Log.class); private static Logger logger = LoggerFactory.getLogger(TestLog4j2Log.class); public static void main(String[] args) { if (logger.isTraceEnabled()) { logger.trace(" ===== log4j2 trace meassge"); } if (logger.isDebugEnabled()) { logger.debug(" ===== log4j2 debug message"); logger.debug(" ------ test log4j2:{},{}","Hello ","HANCHo"); } if (logger.isInfoEnabled()) { logger.info(" ===== log4j2 info message"); } if (logger.isErrorEnabled()) { logger.error(" ===== log4j2 error message "); } // Object[] params = {"HAN",1,"CHAO"}; logger.info(" ===== test:{}, 加班 {} 天, {}要回家了!",params); } }
配置文件:log4j2.xmljava
<?xml version="1.0" encoding="UTF-8"?> <Configuration status="info" monitorInterval="300"> <Properties> <Property name="log.pattern"> <!--%d %-5p [%t] %C{2} (%F:%L) - %m%n--> %date{yyyy-MM-dd HH:mm:ss.SSS} %level [%thread][%file:%line] - %msg%n </Property> </Properties> <Appenders> <!-- 控制檯 --> <Console name="Console" target="SYSTEM_OUT" > <ThresholdFilter level="debug"/> <PatternLayout pattern="${log.pattern}"/> <!-- 本地測試能夠用這個 <PatternLayout pattern="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/> --> <!-- <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] [%-5level] %class{36} %L %M - %msg%n"/> --> <!-- %d{yyyy-MM-dd HH:mm:ss, SSS} : 日誌生產時間 %p : 日誌輸出格式 %c : logger的名稱 %m : 日誌內容,即 logger.info("message") %n : 換行符 %C : Java類名 %L : 日誌輸出所在行數 %M : 日誌輸出所在方法名 hostName : 本地機器名 hostAddress : 本地ip地址 --> </Console> <!-- 文件會打印出全部信息,這個log每次運行程序會自動清空,由append屬性決定,這個也挺有用的,適合臨時測試用 append爲TRUE表示消息增長到指定文件中,false表示消息覆蓋指定的文件內容,默認值是true --> <File name="log" fileName="./logs/test.log" append="false"> <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/> </File> <!-- 打印全部的日誌到stdout.log文件 --> <RollingFile name="Stdout" fileName="./logs/stdout.log" filePattern="./logs/stdout.log.%d{yyyy-MM-dd}-%i"> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger{36} %L %M - %msg%xEx%n"/> <Policies> <!-- 基於時間的滾動策略,interval屬性用來指定多久滾動一次,默認是1 hour。 modulate=true用來調整時間:好比如今是早上3am,interval是4, 那麼第一次滾動是在4am,接着是8am,12am...而不是7am. --> <!-- 時間觸發,一天一個日誌 --> <TimeBasedTriggeringPolicy interval="24" modulate="true"/> <!-- 大小觸發,達到50M的時候進行分割 --> <SizeBasedTriggeringPolicy size="50 MB" /> </Policies> <!-- 用來指定同一個文件夾下最多有幾個日誌文件時開始刪除最舊的 --> <!-- DefaultRolloverStrategy屬性如不設置, 則默認爲最多同一文件夾下7個文件,這裏設置了20 --> <DefaultRolloverStrategy max="30" /> </RollingFile> <!-- 只打印error以及以上級別的日誌到stderr.log --> <RollingFile name="Error" fileName="./logs/stderr.log" filePattern="./logs/stderr.log.%d{yyyy-MM-dd}-%i"> <!-- 控制檯只輸出level及以上級別的信息(onMatch),其餘的直接拒絕(onMismatch) --> <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger{36} %L %M - %msg%xEx%n"/> <Policies> <!-- 時間觸發,一天一個日誌 --> <TimeBasedTriggeringPolicy interval="24" modulate="true"/> <!-- 大小觸發,達到50M的時候進行分割 --> <SizeBasedTriggeringPolicy size="50 MB" /> </Policies> <!-- 用來指定同一個文件夾下最多有幾個日誌文件時開始刪除最舊的 --> <DefaultRolloverStrategy max="30" /> </RollingFile> </Appenders> <Loggers> <!--過濾掉spring和mybatis的一些無用的DEBUG信息--> <Logger name="org.mybatis" level="INFO"></Logger> <Logger name="org.springframework" level="INFO"></Logger> <Root level="debug"> <Appender-ref ref="Stdout"/> <Appender-ref ref="Console"/> <Appender-ref ref="Error"/> <!-- just for test temp --> <Appender-ref ref="log"/> </Root> </Loggers> </Configuration>
===============================================================================
1、Configurationweb
有兩個屬性:status和monitorinterval,有兩個子節點:Appenders和Loggers(代表能夠定義多個Appender和Logger).
status : 用來指定log4j自己的打印日誌的級別.spring
monitorinterval : 用於指定log4j自動從新配置的監測間隔時間,單位是s,最小是5s.apache
2、Appenders節點json
常見的有三種子節點:Console、RollingFile、File.
1.Console: Console節點用來定義輸出到控制檯的Appender.api
name:指定Appender的名字.mybatis
target:SYSTEM_OUT 或 SYSTEM_ERR,通常只設置默認:SYSTEM_OUT.app
PatternLayout:輸出格式,不設置默認爲:%m%n.框架
2.File: File節點用來定義輸出到指定位置的文件的Appender.
name:指定Appender的名字.
fileName:指定輸出日誌的目的文件帶全路徑的文件名.
PatternLayout:輸出格式,不設置默認爲:%m%n.
3.RollingFile: RollingFile節點用來定義超過指定大小自動刪除舊的建立新的的Appender.
name:指定Appender的名字.
fileName:指定輸出日誌的目的文件帶全路徑的文件名.
PatternLayout:輸出格式,不設置默認爲:%m%n.
filePattern:指定新建日誌文件的名稱格式.
Policies:指定滾動日誌的策略,就是何時進行新建日誌文件輸出日誌.
TimeBasedTriggeringPolicy:Policies子節點,基於時間的滾動策略,interval屬性用來指定多久滾動一次,默認是1 hour。modulate=true用來調整時間:好比如今是早上3am,interval是4,那麼第一次滾動是在4am,接着是8am,12am…而不是7am.
SizeBasedTriggeringPolicy:Policies子節點,基於指定文件大小的滾動策略,size屬性用來定義每一個日誌文件的大小.
DefaultRolloverStrategy:用來指定同一個文件夾下最多有幾個日誌文件時開始刪除最舊的,建立新的(經過max)
3、Loggers節點
常見子節點的有兩種:Root和Logger.
1.Root:
Root節點用來指定項目的根日誌,若是沒有單獨指定Logger,那麼就會默認使用該Root日誌輸出
level:日誌輸出級別,共有8個級別,按照從低到高爲:All < Trace < Debug < Info < Warn < Error < Fatal < OFF.
AppenderRef:Root的子節點,用來指定該日誌輸出到哪一個Appender.
2.Logger:
Logger節點用來單獨指定日誌的形式,好比要爲指定包下的class指定不一樣的日誌級別等。
level:日誌輸出級別,共有8個級別,按照從低到高爲:All < Trace < Debug < Info < Warn < Error < Fatal < OFF.
name:用來指定該Logger所適用的類或者類所在的包全路徑,繼承自Root節點.
AppenderRef:Logger的子節點,用來指定該日誌輸出到哪一個Appender,若是沒有指定,就會默認繼承自Root.若是指定了,那麼會在指定的這個Appender和Root的Appender中都會輸出,此時咱們能夠設置Logger的additivity=」false」只在自定義的Appender中進行輸出。
4、關於日誌level
共有8個級別,按照從低到高爲:All < Trace < Debug < Info < Warn < Error < Fatal < OFF.
All:最低等級的,用於打開全部日誌記錄.
Trace:是追蹤,就是程序推動如下,你就能夠寫個trace輸出,因此trace應該會特別多,不過不要緊,咱們能夠設置最低日誌級別不讓他輸出.
Debug:指出細粒度信息事件對調試應用程序是很是有幫助的.
Info:消息在粗粒度級別上突出強調應用程序的運行過程.
Warn:輸出警告及warn如下級別的日誌.
Error:輸出錯誤信息日誌.
Fatal:輸出每一個嚴重的錯誤事件將會致使應用程序的退出的日誌.
OFF:最高等級的,用於關閉全部日誌記錄.
程序會打印高於或等於所設置級別的日誌,設置的日誌等級越高,打印出來的日誌就越少
5、參考
log4j2:
http://blog.csdn.net/vergilgeekopen/article/details/61417342
http://www.cnblogs.com/hanfight/p/5721855.html
性能對比:
https://my.oschina.net/OutOfMemory/blog/789267
http://blog.csdn.net/yjh1271845364/article/details/70888262
其餘日誌系統瞭解:
http://blog.csdn.net/xudan1010/article/details/52890102
http://www.cnblogs.com/Leo_wl/p/3417215.html
https://my.oschina.net/pingpangkuangmo/blog/406618
6、遇到的一個問題
日誌忽然不打印了。查看日誌,發現log4j2自己的日誌顯示:在加載log4j2.xml文件時發生錯誤。
log4j2使用本身默認的log4j2的配置,只能打印error日誌。
默認配置:
<?xml version="1.0" encoding="UTF-8"?> <Configuration status="WARN"> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> </Console> </Appenders> <Loggers> <Root level="error"> <AppenderRef ref="Console"/> </Root> </Loggers> </Configuration>
分析緣由: