使用详解_Log4j2使用详解
日志框架簡(jiǎn)單比較(slf4j、j.u.l、log4j、logback、log4j2 )
- slf4j:slf4j是對(duì)所有日志框架制定的一種規(guī)范、標(biāo)準(zhǔn)、接口,并不是一個(gè)框架的具體的實(shí)現(xiàn),因?yàn)榻涌诓⒉荒塥?dú)立使用,需要和具體的日志框架實(shí)現(xiàn)配合使用(如log4j、logback、log4j2)。
- j.u.l:j.u.l是java.util.logging包的簡(jiǎn)稱,是JDK在1.4版本中引入的Java原生日志框架。
- log4j:log4j是apache實(shí)現(xiàn)的一個(gè)開(kāi)源日志組件。
- logback:logback同樣是由log4j的作者設(shè)計(jì)完成的,擁有更好的特性,用來(lái)取代log4j的一個(gè)日志框架,是slf4j的原生實(shí)現(xiàn)。
- log4j2:Log4j2是log4j 1.x和logback的改進(jìn)版,據(jù)說(shuō)采用了一些新技術(shù)(無(wú)鎖異步等),使得日志的吞吐量、性能比log4j 1.x提高了10倍,并解決了一些死鎖的bug,而且配置更加簡(jiǎn)單靈活。
- 為什么需要日志接口,直接使用具體的實(shí)現(xiàn)不就行了嗎?
接口用于定制規(guī)范,可以有多個(gè)實(shí)現(xiàn),使用時(shí)是面向接口的(導(dǎo)入的包都是slf4j的包而不是具體某個(gè)日志框架中的包),即直接和接口交互,不直接使用實(shí)現(xiàn),所以可以任意的更換實(shí)現(xiàn)而不用更改代碼中的日志相關(guān)代碼。
對(duì)于Java工程師來(lái)說(shuō),關(guān)于日志工具的使用,最佳實(shí)踐就是在應(yīng)用中使用如log4j2 + slf4j這樣的組合來(lái)進(jìn)行日志輸出。這樣做的最大好處,就是業(yè)務(wù)層的開(kāi)發(fā)不需要關(guān)心底層日志框架的實(shí)現(xiàn)及細(xì)節(jié),在編碼的時(shí)候也不需要考慮日后更換框架所帶來(lái)的成本。這也是日志接口(門面模式)所帶來(lái)的好處。
日志級(jí)別
Log4j2中日志有六個(gè)級(jí)別(level):
- trace:追蹤,是最低的日志級(jí)別,相當(dāng)于追蹤程序的執(zhí)行,一般不怎么使用
- debug:調(diào)試,一般在開(kāi)發(fā)中,都將其設(shè)置為最低的日志級(jí)別
- info:信息,輸出重要的信息,使用較多
- warn:警告,有些時(shí)候,雖然程序不會(huì)報(bào)錯(cuò),但是還是需要告訴程序員的
- error:錯(cuò)誤,這個(gè)在開(kāi)發(fā)中也挺常用的
- fatal:嚴(yán)重錯(cuò)誤,這個(gè)一旦發(fā)生,程序基本上也要停止了
當(dāng)日志級(jí)別設(shè)置為某個(gè)值的時(shí)候,低于它的日志信息將不會(huì)被記錄,只有高于設(shè)置的級(jí)別的信息會(huì)被記錄。
Spring Boot集成log4j2
1. pom.xml
Spring Boot默認(rèn)使用LogBack,但是我們沒(méi)有看到顯示依賴的jar包,其實(shí)是因?yàn)樗诘膉ar包spring-boot-starter-logging都是作為spring-boot-starter-web或者spring-boot-starter依賴的一部分。
如果這里要使用Log4j2,需要從spring-boot-starter-web中去掉spring-boot-starter-logging依賴,同時(shí)顯示聲明使用Log4j2的依賴jar包,具體如下:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions><!-- 去掉默認(rèn)配置 --><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-logging</artifactId></exclusion></exclusions> </dependency><!-- 引入log4j2依賴 --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-log4j2</artifactId> </dependency>2. log4j2.xml
- 在application.properties中指定log4j2.xml的位置
logging.config=classpath:log4j2.xml
如果不想在application.properties中指定log4j2.xml的位置,可以把log4j2.xml重命名為log4j2-spring.xml,這樣也是可以按照配置打印日志信息的。
- log4j2.xml簡(jiǎn)單示例
3. 打印日志
只使用log4j2的話,獲取Logger對(duì)象一般是使用LogManager去獲取的,但是如果使用slf4j的話,使用LoggerFactory去獲取
private final static org.slf4j.Logger logger = LoggerFactory.getLogger(Log4j2Controller.class);logger.trace("trace level"); logger.debug("debug level"); logger.info("info level"); logger.warn("warn level"); logger.error("error level");使用lombok插件(詳細(xì)安裝方法請(qǐng)上網(wǎng)查詢),可以簡(jiǎn)化Logger對(duì)象的獲取,首先在相關(guān)的類上面添加@Slf4j注解(該注解由lombok提供),然后通過(guò)下面的方式打印日志:
log.trace("trace level"); log.debug("debug level"); log.info("info level"); log.warn("warn level"); log.error("error level");log4j2配置文件詳解
1. Configuration
Configuration為根節(jié)點(diǎn),有status和monitorInterval等多個(gè)屬性。
- status的值有trace、debug、info、warn、error和 fatal,用于控制log4j2日志框架本身的日志級(jí)別,如果將status設(shè)置為較低的級(jí)別(如trace)就會(huì)看到很多關(guān)于log4j2本身的日志,如加載log4j2配置文件的路徑等信息,一般不用設(shè)置。
- monitorInterval,含義是每隔多少秒重新讀取配置文件,可以不重啟應(yīng)用的情況下修改配置。
- name:配置名稱
- strict: 是否使用嚴(yán)格的XML格式,推薦使用,規(guī)范開(kāi)發(fā)者的配置編寫。
2. properties
properties:配置文件全局的參數(shù)變量,用于減少自定義配置信息的重復(fù)編碼,該配置是可選的,例如定義日志的存放位置D:/logs
3. Appenders
Appenders是輸出源,用于定義日志輸出的地方,log4j2支持的輸出源有很多,有控制臺(tái)Console、文件File、RollingRandomAccessFile、MongoDB、Flume等。
- Console:控制臺(tái)輸出源是將日志打印到控制臺(tái)上,開(kāi)發(fā)的時(shí)候一般都會(huì)配置,以便調(diào)試
- File:文件輸出源,用于將日志寫入到指定的文件,需要配置輸入到哪個(gè)位置(例如:D:/logs/mylog.log)
- RollingRandomAccessFile: 該輸出源也是寫入到文件,不同的是比File更加強(qiáng)大,可以指定當(dāng)文件達(dá)到一定大小(如20MB)時(shí),另起一個(gè)文件繼續(xù)寫入日志,另起一個(gè)文件就涉及到新文件的名字命名規(guī)則,因此需要配置文件命名規(guī)則 這種方式更加實(shí)用,因?yàn)槟悴豢赡芤恢蓖粋€(gè)文件中寫,如果一直寫,文件過(guò)大,打開(kāi)就會(huì)卡死,也不便于查找日志。
- fileName:指定當(dāng)前日志文件的位置和文件名稱
- filePattern:指定當(dāng)發(fā)生Rolling時(shí),文件的轉(zhuǎn)移和重命名規(guī)則
- SizeBasedTriggeringPolicy:指定當(dāng)文件體積大于size指定的值時(shí),觸發(fā)Rolling
- DefaultRolloverStrategy:指定最多保存的文件個(gè)數(shù)
- TimeBasedTriggeringPolicy 這個(gè)配置需要和filePattern結(jié)合使用,注意filePattern中配置的文件重命名規(guī)則是${FILE_NAME}-%d{yyyy-MM-dd HH-mm}-%i,最小的時(shí)間粒度是mm,即分鐘
- TimeBasedTriggeringPolicy指定的size是1,結(jié)合起來(lái)就是每1分鐘生成一個(gè)新文件。如果改成%d{yyyy-MM-dd HH},最小粒度為小時(shí),則每一個(gè)小時(shí)生成一個(gè)文件
- RollingFile:同上,與RollingRandomAccessFile不同的是,RollingRandomAccessFile默認(rèn)日志文件寫入策略為異步刷盤,RollingRandomAccessFile會(huì)將日志信息先寫入到緩沖區(qū),然后緩沖區(qū)滿后刷到磁盤,并清空緩沖區(qū),默認(rèn)緩沖區(qū)的大小在8-256kb,具體大小需要自己設(shè)置。
- NoSql:MongoDb, 輸出到MongDb數(shù)據(jù)庫(kù)中
- Flume:輸出到Apache Flume(Flume是Cloudera提供的一個(gè)高可用的,高可靠的,分布式的海量日志采集、聚合和傳輸?shù)南到y(tǒng),Flume支持在日志系統(tǒng)中定制各類數(shù)據(jù)發(fā)送方,用于收集數(shù)據(jù);同時(shí),Flume提供對(duì)數(shù)據(jù)進(jìn)行簡(jiǎn)單處理,并寫到各種數(shù)據(jù)接受方(可定制)的能力。)
- Async:異步,需要通過(guò)AppenderRef來(lái)指定要對(duì)哪種輸出源進(jìn)行異步(一般用于配置RollingRandomAccessFile)
PatternLayout:控制臺(tái)或文件輸出源(Console、File、RollingRandomAccessFile)都必須包含一個(gè)PatternLayout節(jié)點(diǎn),用于指定輸出文件的格式(如日志輸出的時(shí)間、文件、方法、行數(shù)等格式),例如pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n",各標(biāo)記符詳細(xì)含義如下:
%d{HH:mm:ss.SSS} 表示輸出到毫秒的時(shí)間 %t 輸出當(dāng)前線程名稱 %-5level 輸出日志級(jí)別,-5表示左對(duì)齊并且固定輸出5個(gè)字符,如果不足在右邊補(bǔ)0 %logger 輸出logger名稱,因?yàn)镽oot Logger沒(méi)有名稱,所以沒(méi)有輸出 %msg 日志文本 %n 換行其他常用的占位符有: %F 輸出所在的類文件名,如Log4j2Test.java %L 輸出行號(hào) %M 輸出所在方法名 %l 輸出語(yǔ)句所在的行數(shù), 包括類名、方法名、文件名、行數(shù)4. Loggers
日志器分根日志器Root和自定義日志器,當(dāng)根據(jù)日志名字獲取不到指定的日志器時(shí)就使用Root作為默認(rèn)的日志器,自定義時(shí)需要指定每個(gè)Logger的名稱name(對(duì)于命名可以以包名作為日志的名字,不同的包配置不同的級(jí)別等),日志級(jí)別level,相加性additivity(是否繼承下面配置的日志器), 對(duì)于一般的日志器(如Console、File、RollingRandomAccessFile)一般需要配置一個(gè)或多個(gè)輸出源AppenderRef。
每個(gè)logger可以指定一個(gè)level(TRACE, DEBUG, INFO, WARN, ERROR, ALL or OFF),不指定時(shí)level默認(rèn)為ERROR。
additivity指定是否同時(shí)輸出log到父類的appender,缺省為true。
詳細(xì)配置示例
<?xml version="1.0" encoding="UTF-8"?> <configuration monitorInterval="30"><appenders><console name="Console" target="SYSTEM_OUT"><PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/></console><!--文件會(huì)打印出所有信息,這個(gè)log每次運(yùn)行程序會(huì)自動(dòng)清空,由append屬性決定,這個(gè)也挺有用的,適合臨時(shí)測(cè)試用--><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><!-- 這個(gè)會(huì)打印出所有的info及以下級(jí)別的信息,每次大小超過(guò)size,則這size大小的日志會(huì)自動(dòng)存入按年份-月份建立的文件夾下面并進(jìn)行壓縮,作為存檔--><RollingFile name="RollingFileInfo" fileName="logs/info.log"filePattern="logs/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log"><Filters><!--控制臺(tái)只輸出level及以上級(jí)別的信息(onMatch),其他的直接拒絕(onMismatch)--><ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/><ThresholdFilter level="WARN" onMatch="DENY" onMismatch="NEUTRAL"/></Filters><PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/><Policies><TimeBasedTriggeringPolicy/><SizeBasedTriggeringPolicy size="100 MB"/></Policies></RollingFile><RollingFile name="RollingFileWarn" fileName="logs/warn.log"filePattern="logs/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log"><Filters><ThresholdFilter level="WARN" onMatch="ACCEPT" onMismatch="DENY"/><ThresholdFilter level="ERROR" onMatch="DENY" onMismatch="NEUTRAL"/></Filters><PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/><Policies><TimeBasedTriggeringPolicy/><SizeBasedTriggeringPolicy size="100 MB"/></Policies><!-- DefaultRolloverStrategy屬性如不設(shè)置,則默認(rèn)為最多同一文件夾下7個(gè)文件,這里設(shè)置了20 --><DefaultRolloverStrategy max="20"/></RollingFile><RollingFile name="RollingFileError" fileName="logs/error.log"filePattern="logs/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log"><ThresholdFilter level="ERROR"/><PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/><Policies><TimeBasedTriggeringPolicy/><SizeBasedTriggeringPolicy size="100 MB"/></Policies></RollingFile></appenders><!--然后定義logger,只有定義了logger并引入的appender,appender才會(huì)生效--><loggers><!--過(guò)濾掉spring和hibernate的一些無(wú)用的debug信息--><logger name="org.springframework" level="INFO"></logger><logger name="org.mybatis" level="INFO"></logger><root level="all"><appender-ref ref="Console"/><appender-ref ref="RollingFileInfo"/><appender-ref ref="RollingFileWarn"/><appender-ref ref="RollingFileError"/></root></loggers></configuration>更多Java相關(guān),請(qǐng)查看:
總結(jié)
以上是生活随笔為你收集整理的使用详解_Log4j2使用详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: git上传分支的原理_GIT分支,创建分
- 下一篇: 华为acl怎么生效_华为ACL配置教程(