log4j配置_是时候了解一下log4j2各种配置的含义了!
來源:http://i7q.cn/54K3Uw
1.日志框架
日志接口(slf4j)
slf4j是對所有日志框架制定的一種規范、標準、接口,并不是一個框架的具體的實現,因為接口并不能獨立使用,需要和具體的日志框架實現配合使用(如log4j、logback)
日志實現(log4j、logback、log4j2)
log4j是apache實現的一個開源日志組件
logback同樣是由log4j的作者設計完成的,擁有更好的特性,用來取代log4j的一個日志框架,是slf4j的原生實現
log4j2是log4j 1.x和logback的改進版,據說采用了一些新技術(無鎖異步、等等),使得日志的吞吐量、性能比log4j 1.x提高10倍,并解決了一些死鎖的bug,而且配置更加簡單靈活。
2.為什么需要日志接口,直接使用具體的實現不就行了嗎?
接口用于定制規范,可以有多個實現,使用時是面向接口的(導入的包都是slf4j的包而不是具體某個日志框架中的包),即直接和接口交互,不直接使用實現,所以可以任意的更換實現而不用更改代碼中的日志相關代碼。
比如:slf4j定義了一套日志接口,項目中使用的日志框架是logback,開發中調用的所有接口都是slf4j的,不直接使用logback,調用是 自己的工程調用slf4j的接口,slf4j的接口去調用logback的實現,可以看到整個過程應用程序并沒有直接使用logback,當項目需要更換更加優秀的日志框架時(如log4j2)只需要引入Log4j2的jar和Log4j2對應的配置文件即可,完全不用更改Java代碼中的日志相關的代碼logger.info(“xxx”),也不用修改日志相關的類的導入的包(import org.slf4j.Logger; import org.slf4j.LoggerFactory;)
使用日志接口便于更換為其他日志框架
log4j、logback、log4j2都是一種日志具體實現框架,所以既可以單獨使用也可以結合slf4j一起搭配使用。
本文使用Log4j2作為slf4j的具體實現,引入的包如下:
<dependency>????<groupId>org.slf4jgroupId>
????<artifactId>slf4j-apiartifactId>
????<version>1.7.25version>
dependency>
<dependency>
????<groupId>org.apache.logging.log4jgroupId>
????<artifactId>log4j-slf4j-implartifactId>
????<version>2.11.0version>
dependency>
<dependency>
????<groupId>org.apache.logging.log4jgroupId>
????<artifactId>log4j-coreartifactId>
????<version>2.11.0version>
dependency>
<dependency>
????<groupId>org.apache.logging.log4jgroupId>
????<artifactId>log4j-apiartifactId>
????<version>2.11.0version>
dependency>
3.log4j2日志級別
從大到小依次是: off, fatal, error, warn, info, debug, trace, all
由于我們使用的是slf4j接口包,該接口包中只提供了未標有刪除線的日志級別的輸出。
4.log4j2配置文件的優先級
Log4j will inspect the log4j.configurationFile system property and, if set, will attempt to load the configuration using the ConfigurationFactory that matches the file extension.
If no system property is set the properties ConfigurationFactory will look for log4j2-test.properties in the classpath.
If no such file is found the YAML ConfigurationFactory will look for log4j2-test.yaml or log4j2-test.yml in the classpath.
If no such file is found the JSON ConfigurationFactory will look for log4j2-test.json or log4j2-test.jsn in the classpath.
If no such file is found the XML ConfigurationFactory will look for log4j2-test.xml in the classpath.
If a test file cannot be located the properties ConfigurationFactory will look for log4j2.properties on the classpath.
If a properties file cannot be located the YAML ConfigurationFactory will look for log4j2.yaml or log4j2.yml on the classpath.
If a YAML file cannot be located the JSON ConfigurationFactory will look for log4j2.json or log4j2.jsn on the classpath.
If a JSON file cannot be located the XML ConfigurationFactory will try to locate log4j2.xml on the classpath.
If no configuration file could be located the DefaultConfiguration will be used. This will cause logging output to go to the console.
5.對于log4j2配置文件的理解
配置文件結構:
Appdenders部分
Appender
Filter
Layout
Policies
Strategy
Appender
Loggers部分
Logger
RootLogger
6.對于Appender的理解
簡單說Appender就是一個管道,定義了日志內容的去向(保存位置)。
配置一個或者多個Filter,Filter的過濾機制和Servlet的Filter有些差別,下文會進行說明。
配置Layout來控制日志信息的輸出格式。
配置Policies以控制日志何時(When)進行滾動。
配置Strategy以控制日志如何(How)進行滾動。
7.對于Logger的理解
簡單說Logger就是一個路由器,指定類、包中的日志信息流向哪個管道,以及控制他們的流量(日志級別)
8.log4j2配置文件框架
配置文件格式
<?xml ?version="1.0"?encoding="UTF-8"?><Configuration>
????<Appenders>
????????<Appender>
????????????<Filters>
????????????????<LevelRangeFilter?minLevel="..."?maxLevel="..."?onMatch="..."?onMismatch="..."/>
????????????Filters>
????????????<PatternLayout?pattern="..."?charset="..."/>
????????????<Policies>
????????????????<CronTriggeringPolicy?schedule="..."/>
????????????????<SizeBasedTriggeringPolicy?size="..."/>
????????????????<TimeBasedTriggeringPolicy?/>
????????????Policies>
????????Appender>
????????<Appender>
????????????//?...
????????Appender>
????Appenders>
????<Loggers>
????????<Logger>
????????????<AppenderRef?ref="...">
????????Logger>
????????<Root>
????????????<AppenderRef?ref="...">
????????Root>
????Loggers>
Configuration>
9.Appender標簽的實現類
其實這些標簽都是類名或者類名去掉后綴。
Appender的常用的實現類有:
ConsoleAppender(Console)
FileAppender(File)、RandomAccessFileAppender(RandomAccessFile)
RollingFileAppender(RollingFile)、RollingRandomAccessFileAppender(RollingRandomAccessFile)
打開這些實現類的源碼,你一定會恍然大明白,括號中的是實現類在log4j2.xml配置文件中的標簽名。
10.ConsoleAppender(Console)
該實現類會把日志輸出到控制臺中。
它有兩種輸出方式:
SYSTEM_OUT(System.out)
SYSTEM_ERR(System.err)
如果不配置,默認使用SYSTEM_OUT進行輸出。括號中是調用的方法。
簡單示例:
<?xml ?version="1.0"?encoding="UTF-8"?><Configuration?name="baseConf"?status="warn"?monitorInterval="30">
????<Appenders>
????????<Console?name="Console"?target="SYSTEM_OUT">
????????????
????????????<PatternLayout?pattern="%d{HH:mm:ss.SSS}?[%t]?%-5level?%logger{36}?-?%msg%n"?charset="UTF-8"/>
????????Console>
????Appenders>
????<Loggers>
????????
????????<Root?level="info">
????????????
????????????<AppenderRef?ref="RollingFile"/>
????????Root>
????Loggers>
Configuration>
其它屬性可以參見官方文檔:?
http://logging.apache.org/log4j/2.x/manual/appenders.html#ConsoleAppender
10-1.FileAppender(File)、RandomAccessFileAppender(RandomAccessFile)
相同點:寫入日志信息到文件
不同點:使用的I/O實現類不同,前者使用FileOutputStream,后者使用RandomAccessFile。
官方文檔說是在bufferedIO=true(默認是true)的情況下后者比前者性能提升20% ~ 200%,不明覺厲,就用后者吧。
簡單示例:
<?xml ?version="1.0"?encoding="UTF-8"?><Configuration?name="baseConf"?status="warn"?monitorInterval="30">
????<Appenders>
????????<RandomAccessFile?name="File"?fileName="logs/app.log"?immediateFlush="false">
????????????<PatternLayout?pattern="%d{HH:mm:ss.SSS}?[%t]?%-5level?%logger{36}?-?%msg%n"?charset="UTF-8"/>
????????RandomAccessFile>
????Appenders>
????<Loggers>
????????<Root?level="info">
????????????<AppenderRef?ref="File"/>
????????Root>
????Loggers>
Configuration>
常用屬性:
fileName:來指定文件位置,文件或目錄不存在則會自動創建。
immediateFlush:是否每次寫入都要立刻刷新到硬盤中。默認true,如果使用默認值可能會影響性能。
其它屬性可以參見官方文檔:
http://logging.apache.org/log4j/2.x/manual/appenders.html#RandomAccessFileAppender
10-2.RollingFileAppender(RollingFile)、RollingRandomAccessFileAppender(RollingRandomAccessFile)
這一對之間的區別與上一對之間的區別是一樣的。
上一對的實現類不能進行日志滾動,所謂日志滾動就是當達到設定的條件后,日志文件進行切分。
比如:工程師想讓系統中的日志按日進行切分,并且按月歸檔。
這時候這一對的作用就體現出來了。
簡單示例:
<?xml ?version="1.0"?encoding="UTF-8"?><Configuration?name="baseConf"?status="warn"?monitorInterval="30">
????<Appenders>
????????<RollingRandomAccessFile?name="File"?fileName="logs/app.log"filePattern="logs/$${date:hh-mm}/%d{hh-mm-ss}.app.%i.log"?>
????????????<PatternLayout?pattern="%d{HH:mm:ss.SSS}?[%t]?%-5level?%logger{36}?-?%msg%n"?charset="UTF-8"/>
????????????<Policies>
????????????????
????????????????<CronTriggeringPolicy?schedule="0/5?*?*?*?*??"?/>
????????????????<SizeBasedTriggeringPolicy?size="10?MB"/>
????????????Policies>
????????????<DefaultRolloverStrategy?max="10"?/>
????????RollingRandomAccessFile>
????Appenders>
????<Loggers>
????????<Root?level="info">
????????????<AppenderRef?ref="File"/>
????????Root>
????Loggers>
Configuration>
1.filePattern:指定了日志滾動之后的文件命名格式,至于其中的{date:hh-mm}表達式下文介紹。
2.DefaultRolloverStrategy:指定了如何(How)進行翻滾,并且指定了最大翻滾次數(影響%i參數值),超過次數之后會按照相應的規則刪除舊日志。
3.Policies:?這里就是規定了何時進行滾動(When),可以有多個Policy。
CronTriggeringPolicy設置了每 5s 進行一次翻滾
SizeBasedTriggeringPolicy設置了的話,如果當前文件超過了10MB,但是文件的名字還沒有進行翻滾(建立新文件),那么就會用%i的方式進行翻滾。
10-3.翻滾示例
app.log
第一次翻滾:app.log app.1.log // app.log -> app.1.log
第二次翻滾:app.log app.1.log app.2.lop // app.log -> app.2.log
第三次翻滾:app.log app.1.log app.2.lop app.3.lop // app.log -> app.3.log
第四次翻滾:app.log app.1.log app.2.lop app.3.lop app.4.lop // app.log -> app.4.log
一直到設定的翻滾次數10之后,會把舊的日志內容覆蓋。
app.2.lop?->?app.1.lopapp.3.lop?->?app.2.lop
...
app.10.lop?->?app.9.lop
app.log?->?app.10.lop
一直這樣循環下去,直到創建新文件。
11.Filters
Filters決定日志事件能否被輸出。過濾條件有三個值:ACCEPT(接受),DENY(拒絕),NEUTRAL(中立)。
11-1.常用的Filter實現類有
LevelRangeFilter
TimeFilter
ThresholdFilter
11-2.上文中提到log4j2中的Filter與Servlet中的有差別。那么有什么差別呢?
簡單說就是log4j2中的過濾器ACCEPT和DENY之后,后續的過濾器就不會執行了,只有在NEUTRAL的時候才會執行后續的過濾器。
11-3.簡單示例
測試代碼:
public?class?LogMain?{????private?static?Logger?logger?=?LoggerFactory.getLogger(LogMain.class);
????public?static?void?main(String[]?args)?throws?Exception?{
????????logger.trace("trace?Msg.");
????????logger.debug("debug?Msg.");
????????logger.info("info?Msg.");
????????logger.warn("warn?Msg.");
????????logger.error("error?Msg.");
????}
}
配置文件:
<?xml ?version="1.0"?encoding="UTF-8"?><Configuration?name="baseConf"?status="warn"?monitorInterval="30">
????<Appenders>
????????<Console?name="Console">
????????????
????????????<Filters>
????????????????
????????????????<LevelRangeFilter?minLevel="error"?maxLevel="info"?onMatch="ACCEPT"?onMismatch="NEUTRAL"?/>
????????????????
????????????????<TimeFilter?start="08:00:00"?end="08:30:00"?onMatch="ACCEPT"?onMismatch="DENY"?/>
????????????Filters>
????????????<PatternLayout?pattern="%d{HH:mm:ss.SSS}?[%t]?%-5level?%logger{36}?-?%msg%n"?charset="UTF-8"/>
????????Console>
????Appenders>
????<Loggers>
????????<Root?level="info">
????????????<AppenderRef?ref="Console"/>
????????Root>
????Loggers>
Configuration>
輸出結果:
17:51:53.546?[main]?INFO??me.master.snail.log.LogMain?-?info?Msg.17:51:53.548?[main]?WARN??me.master.snail.log.LogMain?-?warn?Msg.
17:51:53.548?[main]?ERROR?me.master.snail.log.LogMain?-?error?Msg.
如果當前時間不是 8點~8點半 之間,那么沒有日志會輸出。
這里的info Msg.、warn Msg.和error Msg.為什么會輸出呢?
是因為LevelRangeFilter對它們進行了ACCEPT,而剩下的trace Msg.和debug Msg.則會經過下一個過濾器,然后依次類推。
12.PatternLayout
這是常用的日志格式化類,其它日志格式化類很少用。
關于其它日志類,可以打開PatternLayout類,找到其父類AbstractStringLayout, 看父類的實現類有哪些。
簡單示例:
"%d{HH:mm:ss.SSS}?[%t]?%-5level?%logger{36}?-?%msg%n"?charset="UTF-8"/>授人以魚不如授人以漁。關于pattern的格式點擊
http://logging.apache.org/log4j/2.x/manual/layouts.html#PatternLayout
具體的其它屬性可以看源碼也可以參考官方文檔。
13.Policy & Strategy
上文也說了,Policy是用來控制日志文件何時(When)進行滾動的;Strategy是用來控制日志文件如何(How)進行滾動的。
如果配置的是RollingFile或RollingRandomAccessFile,則必須配置一個Policy。
如果想按月歸檔,按日切分日志,然后
13-1.Policy常用的實現類:
SizeBasedTriggeringPolicy
CronTriggeringPolicy
TimeBasedTriggeringPolicy
13-1-1.SizeBasedTriggeringPolicy
根據日志文件的大小進行滾動。
<SizeBasedTriggeringPolicy?size="10MB"/>單位有:KB,MB,GB
13-1-2.CronTriggeringPolicy
使用Cron表達式進行日志滾動,很靈活。
<CronTriggeringPolicy?schedule="0/5?*?*?*?*??"?/>13-1-3.TimeBasedTriggeringPolicy
這個滾動策略依賴于filePattern中配置的最具體的時間單位,根據最具體的時間單位進行滾動。
這種方式比較簡潔。CronTriggeringPolicy策略更強大。
簡單示例:
<?xml ?version="1.0"?encoding="UTF-8"?><Configuration?name="baseConf"?status="warn"?monitorInterval="30">
????<Appenders>
????????<RollingRandomAccessFile?name="File"?fileName="logs/app.log"filePattern="logs/$${date:hh-mm}/%d{hh-mm-ss}.app.%i.log"?>
????????????<PatternLayout?pattern="%d{HH:mm:ss.SSS}?[%t]?%-5level?%logger{36}?-?%msg%n"?charset="UTF-8"/>
????????????<Policies>
????????????????
????????????????
????????????????
????????????????<TimeBasedTriggeringPolicy?interval="5"?modulate="true"/>
????????????????<SizeBasedTriggeringPolicy?size="10?MB"/>
????????????Policies>
????????????<DefaultRolloverStrategy?max="10"?/>
????????RollingRandomAccessFile>
????Appenders>
????<Loggers>
????????<Root?level="info">
????????????<AppenderRef?ref="File"/>
????????Root>
????Loggers>
Configuration>
13-2.Strategy常用的實現類
DefaultRolloverStrategy
DirectWriteRolloverStrategy
這兩個Strategy都是控制如何進行日志滾動的,至于他們的區別我還是不太明白,大佬解釋一下吧。
平時大部分用DefaultRolloverStrategy就可以了。
14.Logger
Logger部分就比較簡單了,分為兩個Logger:
Root(必須配置)
Logger
簡單示例:
<?xml ?version="1.0"?encoding="UTF-8"?><Configuration?name="baseConf"?status="warn"?monitorInterval="30">
????<Appenders>
????????<Console?name="Console">
????????????<PatternLayout>
????????????????<Pattern>%d?%p?%c{1.}?[%t]?%m%nPattern>
????????????PatternLayout>
????????Console>
????Appenders>
????<Loggers>
????????<Root?level="trace">
????????????<AppenderRef?ref="Console"/>
????????????<Filters>
????????????????<LevelRangeFilter?minLevel="error"?maxLevel="info"?onMatch="ACCEPT"?onMismatch="DENY"?/>
????????????Filters>
????????Root>
????Loggers>
Configuration>
注意:Logger中也可以加過濾器的喲~
14-1.比較重要的問題: 日志重復打印
如果Root中的日志包含了Logger中的日志信息,并且AppenderRef是一樣的配置,則日志會打印兩次。
注意:有兩個條件
Root中的日志包含了Logger中的日志信息
且AppenderRef是一樣的配置
這時候我們需要使用一個Logger的屬性來解決,那就是additivity,其默認值為true,需要配置為false。
<?xml ?version="1.0"?encoding="UTF-8"?><Configuration?name="baseConf"?status="warn"?monitorInterval="30">
????<Appenders>
????????<Console?name="Console">
????????????<PatternLayout>
????????????????<Pattern>%d?%p?%c{1.}?[%t]?%m%nPattern>
????????????PatternLayout>
????????Console>
????Appenders>
????<Loggers>
????????<Logger?name="me.master.snail.log.LogMain"?level="info"?additivity="false">
????????????<AppenderRef?ref="Console"/>
????????Logger>
????????<Root?level="trace">
????????????<AppenderRef?ref="Console"/>
????????????<Filters>
????????????????<LevelRangeFilter?minLevel="error"?maxLevel="info"?onMatch="ACCEPT"?onMismatch="DENY"?/>
????????????Filters>
????????Root>
????Loggers>
Configuration>
15.Lookups
這個組件類似于JSTL的EL表達式,或者類似于Spring的SpEL表達式。
具體的語法很簡單,這里就不粘貼復制了,查看官方文檔:
http://logging.apache.org/log4j/2.x/manual/lookups.html
相信你用半個小時就學會了。
16.示例
為了大家快速開發(方便懶惰的同學),寫一些示例。
16-1.輸出到控制臺
<?xml ?version="1.0"?encoding="UTF-8"?><Configuration?name="baseConf"?status="warn"?monitorInterval="30">
????<Appenders>
????????<Console?name="Console"?target="SYSTEM_OUT">
????????????
????????????<PatternLayout?pattern="%d{HH:mm:ss.SSS}?[%t]?%-5level?%logger{36}?-?%msg%n"?charset="UTF-8"/>
????????Console>
????Appenders>
????<Loggers>
????????
????????<Root?level="info">
????????????
????????????<AppenderRef?ref="RollingFile"/>
????????Root>
????Loggers>
Configuration>
16-2.輸出到單個文件
<?xml ?version="1.0"?encoding="UTF-8"?><Configuration?name="baseConf"?status="warn"?monitorInterval="30">
????<Appenders>
????????<RandomAccessFile?name="File"?fileName="logs/app.log"?immediateFlush="false">
????????????<PatternLayout?pattern="%d{HH:mm:ss.SSS}?[%t]?%-5level?%logger{36}?-?%msg%n"?charset="UTF-8"/>
????????RandomAccessFile>
????Appenders>
????<Loggers>
????????<Root?level="info">
????????????<AppenderRef?ref="File"/>
????????Root>
????Loggers>
Configuration>
16-3.按月歸檔日志,按日進行切分,限制單文件大小為 500MB, 一天最多生成20個文件,也就是(20 * 500)MB大小的日志
<?xml ?version="1.0"?encoding="UTF-8"?><Configuration?name="baseConf"?status="warn"?monitorInterval="30">
????<Appenders>
????????<RollingRandomAccessFile?name="File"?fileName="logs/app.log"filePattern="logs/$${date:yyyy-MM}/%d{yyyy-MM-dd}.app.%i.log"?>
????????????<PatternLayout?pattern="%d{HH:mm:ss.SSS}?[%t]?%-5level?%logger{36}?-?%msg%n"?charset="UTF-8"/>
????????????<Policies>
????????????????<TimeBasedTriggeringPolicy?interval="1"?modulate="false"/>
????????????????<SizeBasedTriggeringPolicy?size="500MB"/>
????????????Policies>
????????????<DefaultRolloverStrategy?max="20"?/>
????????RollingRandomAccessFile>
????Appenders>
????<Loggers>
????????<Root?level="info">
????????????<AppenderRef?ref="File"/>
????????Root>
????Loggers>
Configuration>
16-4.限制Spring框架日志的輸出級別
<?xml ?version="1.0"?encoding="UTF-8"?><Configuration?name="baseConf"?status="warn"?monitorInterval="30">
????<Appenders>
????????<RollingRandomAccessFile?name="File"?fileName="logs/app.log"filePattern="logs/$${date:yyyy-MM}/%d{yyyy-MM-dd}.app.%i.log"?>
????????????<PatternLayout?pattern="%d{HH:mm:ss.SSS}?[%t]?%-5level?%logger{36}?-?%msg%n"?charset="UTF-8"/>
????????????<Policies>
????????????????<TimeBasedTriggeringPolicy?interval="1"?modulate="false"/>
????????????????<SizeBasedTriggeringPolicy?size="500MB"/>
????????????Policies>
????????????<DefaultRolloverStrategy?max="20"?/>
????????RollingRandomAccessFile>
????Appenders>
????<Loggers>
????????
????????<logger?name="org.springframework"?level="INFO"/>
????????<Root?level="info">
????????????<AppenderRef?ref="File"/>
????????Root>
????Loggers>
Configuration>
技術交流群
總結
以上是生活随笔為你收集整理的log4j配置_是时候了解一下log4j2各种配置的含义了!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前五大厂全线暴跌 联想依旧第一 最新西欧
- 下一篇: union和union all有什么区别