log4j配置_是时候了解一下log4j2各种配置的含义了!
來源:http://i7q.cn/54K3Uw
1.日志框架
日志接口(slf4j)
slf4j是對所有日志框架制定的一種規(guī)范、標準、接口,并不是一個框架的具體的實現(xiàn),因為接口并不能獨立使用,需要和具體的日志框架實現(xiàn)配合使用(如log4j、logback)
日志實現(xiàn)(log4j、logback、log4j2)
log4j是apache實現(xiàn)的一個開源日志組件
logback同樣是由log4j的作者設(shè)計完成的,擁有更好的特性,用來取代log4j的一個日志框架,是slf4j的原生實現(xiàn)
log4j2是log4j 1.x和logback的改進版,據(jù)說采用了一些新技術(shù)(無鎖異步、等等),使得日志的吞吐量、性能比log4j 1.x提高10倍,并解決了一些死鎖的bug,而且配置更加簡單靈活。
2.為什么需要日志接口,直接使用具體的實現(xiàn)不就行了嗎?
接口用于定制規(guī)范,可以有多個實現(xiàn),使用時是面向接口的(導(dǎo)入的包都是slf4j的包而不是具體某個日志框架中的包),即直接和接口交互,不直接使用實現(xiàn),所以可以任意的更換實現(xiàn)而不用更改代碼中的日志相關(guān)代碼。
比如:slf4j定義了一套日志接口,項目中使用的日志框架是logback,開發(fā)中調(diào)用的所有接口都是slf4j的,不直接使用logback,調(diào)用是 自己的工程調(diào)用slf4j的接口,slf4j的接口去調(diào)用logback的實現(xiàn),可以看到整個過程應(yīng)用程序并沒有直接使用logback,當項目需要更換更加優(yōu)秀的日志框架時(如log4j2)只需要引入Log4j2的jar和Log4j2對應(yīng)的配置文件即可,完全不用更改Java代碼中的日志相關(guān)的代碼logger.info(“xxx”),也不用修改日志相關(guān)的類的導(dǎo)入的包(import org.slf4j.Logger; import org.slf4j.LoggerFactory;)
使用日志接口便于更換為其他日志框架
log4j、logback、log4j2都是一種日志具體實現(xiàn)框架,所以既可以單獨使用也可以結(jié)合slf4j一起搭配使用。
本文使用Log4j2作為slf4j的具體實現(xiàn),引入的包如下:
<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配置文件的優(yōu)先級
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配置文件的理解
配置文件結(jié)構(gòu):
Appdenders部分
Appender
Filter
Layout
Policies
Strategy
Appender
Loggers部分
Logger
RootLogger
6.對于Appender的理解
簡單說Appender就是一個管道,定義了日志內(nèi)容的去向(保存位置)。
配置一個或者多個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標簽的實現(xiàn)類
其實這些標簽都是類名或者類名去掉后綴。
Appender的常用的實現(xiàn)類有:
ConsoleAppender(Console)
FileAppender(File)、RandomAccessFileAppender(RandomAccessFile)
RollingFileAppender(RollingFile)、RollingRandomAccessFileAppender(RollingRandomAccessFile)
打開這些實現(xiàn)類的源碼,你一定會恍然大明白,括號中的是實現(xiàn)類在log4j2.xml配置文件中的標簽名。
10.ConsoleAppender(Console)
該實現(xiàn)類會把日志輸出到控制臺中。
它有兩種輸出方式:
SYSTEM_OUT(System.out)
SYSTEM_ERR(System.err)
如果不配置,默認使用SYSTEM_OUT進行輸出。括號中是調(diào)用的方法。
簡單示例:
<?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實現(xiàn)類不同,前者使用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:來指定文件位置,文件或目錄不存在則會自動創(chuàng)建。
immediateFlush:是否每次寫入都要立刻刷新到硬盤中。默認true,如果使用默認值可能會影響性能。
其它屬性可以參見官方文檔:
http://logging.apache.org/log4j/2.x/manual/appenders.html#RandomAccessFileAppender
10-2.RollingFileAppender(RollingFile)、RollingRandomAccessFileAppender(RollingRandomAccessFile)
這一對之間的區(qū)別與上一對之間的區(qū)別是一樣的。
上一對的實現(xiàn)類不能進行日志滾動,所謂日志滾動就是當達到設(shè)定的條件后,日志文件進行切分。
比如:工程師想讓系統(tǒng)中的日志按日進行切分,并且按月歸檔。
這時候這一對的作用就體現(xiàn)出來了。
簡單示例:
<?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)進行翻滾,并且指定了最大翻滾次數(shù)(影響%i參數(shù)值),超過次數(shù)之后會按照相應(yīng)的規(guī)則刪除舊日志。
3.Policies:?這里就是規(guī)定了何時進行滾動(When),可以有多個Policy。
CronTriggeringPolicy設(shè)置了每 5s 進行一次翻滾
SizeBasedTriggeringPolicy設(shè)置了的話,如果當前文件超過了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
一直到設(shè)定的翻滾次數(shù)10之后,會把舊的日志內(nèi)容覆蓋。
app.2.lop?->?app.1.lopapp.3.lop?->?app.2.lop
...
app.10.lop?->?app.9.lop
app.log?->?app.10.lop
一直這樣循環(huán)下去,直到創(chuàng)建新文件。
11.Filters
Filters決定日志事件能否被輸出。過濾條件有三個值:ACCEPT(接受),DENY(拒絕),NEUTRAL(中立)。
11-1.常用的Filter實現(xiàn)類有
LevelRangeFilter
TimeFilter
ThresholdFilter
11-2.上文中提到log4j2中的Filter與Servlet中的有差別。那么有什么差別呢?
簡單說就是log4j2中的過濾器ACCEPT和DENY之后,后續(xù)的過濾器就不會執(zhí)行了,只有在NEUTRAL的時候才會執(zhí)行后續(xù)的過濾器。
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>
輸出結(jié)果:
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.則會經(jīng)過下一個過濾器,然后依次類推。
12.PatternLayout
這是常用的日志格式化類,其它日志格式化類很少用。
關(guān)于其它日志類,可以打開PatternLayout類,找到其父類AbstractStringLayout, 看父類的實現(xiàn)類有哪些。
簡單示例:
"%d{HH:mm:ss.SSS}?[%t]?%-5level?%logger{36}?-?%msg%n"?charset="UTF-8"/>授人以魚不如授人以漁。關(guān)于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常用的實現(xiàn)類:
SizeBasedTriggeringPolicy
CronTriggeringPolicy
TimeBasedTriggeringPolicy
13-1-1.SizeBasedTriggeringPolicy
根據(jù)日志文件的大小進行滾動。
<SizeBasedTriggeringPolicy?size="10MB"/>單位有:KB,MB,GB
13-1-2.CronTriggeringPolicy
使用Cron表達式進行日志滾動,很靈活。
<CronTriggeringPolicy?schedule="0/5?*?*?*?*??"?/>13-1-3.TimeBasedTriggeringPolicy
這個滾動策略依賴于filePattern中配置的最具體的時間單位,根據(jù)最具體的時間單位進行滾動。
這種方式比較簡潔。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常用的實現(xiàn)類
DefaultRolloverStrategy
DirectWriteRolloverStrategy
這兩個Strategy都是控制如何進行日志滾動的,至于他們的區(qū)別我還是不太明白,大佬解釋一下吧。
平時大部分用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.比較重要的問題: 日志重復(fù)打印
如果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表達式。
具體的語法很簡單,這里就不粘貼復(fù)制了,查看官方文檔:
http://logging.apache.org/log4j/2.x/manual/lookups.html
相信你用半個小時就學(xué)會了。
16.示例
為了大家快速開發(fā)(方便懶惰的同學(xué)),寫一些示例。
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>
技術(shù)交流群
總結(jié)
以上是生活随笔為你收集整理的log4j配置_是时候了解一下log4j2各种配置的含义了!的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前五大厂全线暴跌 联想依旧第一 最新西欧
- 下一篇: 要运行python程序要安装什么_傲视天