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