新聞中心
本文轉(zhuǎn)載自微信公眾號「Java極客技術」,作者鴨血粉絲 。轉(zhuǎn)載本文請聯(lián)系Java極客技術公眾號。

一、摘要
不管是使用何種編程語言,何種框架,日志輸出幾乎無處不再,也是任何商業(yè)軟件中必不可少的一部分。
總結(jié)起來,日志的用途大致可以歸納成以下三種:
問題追蹤:通過日志不僅僅包括我們程序的一些bug,也可以在安裝配置時,通過日志可以發(fā)現(xiàn)問題。
狀態(tài)監(jiān)控:通過實時分析日志,可以監(jiān)控系統(tǒng)的運行狀態(tài),做到早發(fā)現(xiàn)問題、早處理問題。
安全審計:審計主要體現(xiàn)在安全上,通過對日志進行分析,可以發(fā)現(xiàn)是否存在非授權(quán)的操作。
以 Java 編程語言為例,打印日志的方式有很多,例如通過System.out.print()方法將關鍵信息輸出到控制臺,也可以通過 JDK 自帶的日志Logger類輸出,雖然 JDK 從1.4開始支持日志輸出,但是功能單一,無法更好的滿足商業(yè)要求,于是誕生了很多第三方日志庫,像我們所熟悉的主流框架log4j、log4j2、logback等,提供的 API 功能都遠勝 JDK 提供的Logger。
二、Log4j
2.1、介紹
Log4j 是一種非常流行的日志框架,由Ceki Gülcü首創(chuàng),之后將其開源貢獻給 Apache 軟件基金會。
Log4j 有三個主要的組件:Loggers(記錄器),Appenders (輸出源)和Layouts(布局)。這里可簡單理解為日志類別、日志要輸出的地方和日志以何種形式輸出。
綜合使用這三個組件可以輕松地記錄信息的類型和級別,并可以在運行時控制日志輸出的樣式和位置。
Log4j 的架構(gòu)大致如下:
當我們使用 Log4j 輸出一條日志時,Log4j 自動通過不同的Appender(輸出源)把同一條日志輸出到不同的目的地。例如:
- console:輸出到屏幕;
- file:輸出到文件;
- socket:通過網(wǎng)絡輸出到遠程計算機;
- jdbc:輸出到數(shù)據(jù)庫
在輸出日志的過程中,通過Filter來過濾哪些log需要被輸出,哪些log不需要被輸出。
在Loggers(記錄器)組件中,級別分五種:DEBUG、INFO、WARN、ERROR和FATAL。
這五個級別是有順序的,DEBUG < INFO < WARN < ERROR < FATAL,分別用來指定這條日志信息的重要程度,明白這一點很重要,Log4j有一個規(guī)則:只輸出級別不低于設定級別的日志信息。
假設Loggers級別設定為INFO,則INFO、WARN、ERROR和FATAL級別的日志信息都會輸出,而級別比INFO低的DEBUG則不會輸出。
最后,通過Layout來格式化日志信息,例如,自動添加日期、時間、方法名稱等信息。
具體輸出樣式配置,可以參考如下內(nèi)容Log4j2 - Layouts布局介紹
2.2、項目應用
以 Java 項目為例,在 Maven 的pom.xml中添加如下依賴!
2.2.1、添加 maven 依賴
org.slf4j slf4j-api 1.6.6 org.slf4j slf4j-log4j12 1.6.6 log4j log4j 1.2.17
2.2.2、創(chuàng)建log4j配置
在實際應用中,要使Log4j在系統(tǒng)中運行須事先設定配置文件。
配置文件實際上也就是對Logger、Appender及Layout進行相應設定。
Log4j支持兩種配置文件格式,一種是XML格式的文件,一種是properties屬性文件,二選一。
創(chuàng)建一個log4j.xml或者log4j.properties,將其放入項目根目錄下。
1、XML格式
2、XML格式
- log4j.rootLogger=INFO,M,C,E
- log4j.additivity.monitorLogger=false
- # INFO級別文件輸出配置
- log4j.appender.M=org.apache.log4j.DailyRollingFileAppender
- log4j.appender.M.File=/logs/info.log
- log4j.appender.M.ImmediateFlush=false
- log4j.appender.M.BufferedIO=true
- log4j.appender.M.BufferSize=16384
- log4j.appender.M.Append=true
- log4j.appender.M.Threshold=INFO
- log4j.appender.M.DatePattern='.'yyyy-MM-dd
- log4j.appender.M.layout=org.apache.log4j.PatternLayout
- log4j.appender.M.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} %p %l %m %n
- # ERROR級別文件輸出配置
- log4j.appender.E=org.apache.log4j.DailyRollingFileAppender
- log4j.appender.E.File=/logs/error.log
- log4j.appender.E.ImmediateFlush=true
- log4j.appender.E.Append=true
- log4j.appender.E.Threshold=ERROR
- log4j.appender.E.DatePattern='.'yyyy-MM-dd
- log4j.appender.E.layout=org.apache.log4j.PatternLayout
- log4j.appender.E.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} %p %l %m %n
- # 控制臺輸出配置
- log4j.appender.C=org.apache.log4j.ConsoleAppender
- log4j.appender.C.Threshold=INFO
- log4j.appender.C.layout=org.apache.log4j.PatternLayout
- log4j.appender.C.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%t] %-5p %l %m %n
2.2.3、log4j使用
在需要打印日志的類中,引入Logger類,在需要的地方打印即可!
- package org.example.log4j.service;
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- public class LogPrintUtil {
- /**log靜態(tài)常量*/
- private static final Logger logger = LoggerFactory.getLogger(LogPrintUtil.class);
- public static void main(String[] args){
- logger.info("info信息");
- logger.warn("warn信息");
- logger.error("error信息");
- }
- }
當然你還可以這樣寫
- if(logger.isInfoEnabled()) {
- logger.info("info信息");
- }
- if(logger.isWarnEnabled()) {
- logger.warn("warn信息");
- }
2.2.4、isInfoEnabled()有何作用呢?
簡單來說,在某些場景下,用isInfoEnabled()方法判斷下是能提升性能的!
例如我們打印這段內(nèi)容logger.info("User:" + userId + appId),程序在打印這行代碼時,先對內(nèi)容("User:" + userId + appId)進行字符串拼接,然后再輸出。
如果當前配置文件中日志輸出級別是info,是直接輸出的,當日志輸出級別是error時,logger.info()的內(nèi)容時不輸出的,但是我們卻進行了字符串拼接,如果加上if(logger.isInfoEnabled())進行一次判定,logger.info()就不會執(zhí)行,從而更好的提升性能,這個尤其是在高并發(fā)和復雜log打印情況下提升非常顯著。
另外,ERROR及其以上級別的log信息是一定會被輸出的,所以只有l(wèi)ogger.isDebugEnabled、logger.isInfoEnabled和logger.isWarnEnabled()方法,而沒有l(wèi)ogger.isErrorEnabled方法。
三、Log4j2
3.1、介紹
log4j2 是 log4j 1.x 的升級版,參考了 logback 的一些優(yōu)秀的設計,并且修復了一些問題,因此帶來了一些重大的提升,主要特點有:
- 異常處理:在logback中,Appender中的異常不會被應用感知到,但是在log4j2中,提供了一些異常處理機制。
- 性能提升, log4j2相較于log4j 1和logback都具有很明顯的性能提升,后面會有官方測試的數(shù)據(jù)。
- 自動重載配置:參考了logback的設計,當然會提供自動刷新參數(shù)配置,最實用的就是我們在生產(chǎn)上可以動態(tài)的修改日志的級別而不需要重啟應用——那對監(jiān)控來說,是非常敏感的。
- 無垃圾機制:log4j2在大部分情況下,都可以使用其設計的一套無垃圾機制,避免頻繁的日志收集導致的jvm gc。
3.2、項目應用
3.2.1、添加 maven 依賴
org.slf4j slf4j-api 1.7.13 org.slf4j jcl-over-slf4j 1.7.13 runtime org.apache.logging.log4j log4j-api 2.4.1 org.apache.logging.log4j log4j-core 2.4.1 org.apache.logging.log4j log4j-slf4j-impl 2.4.1 com.lmax disruptor 3.2.0
3.2.2、創(chuàng)建log4j2配置
在項目的根目錄下創(chuàng)建一個log4j2.xml的文件,與log4j相比,log4j2的異步輸出日志性能非常強勁,配置如下:
1、同步輸出日志
/logs/log4j2 /logs/log4j2/history
2、異步輸出日志
/logs/log4j2 /logs/log4j2/history
詳細 API 可以參考官方網(wǎng)站!
3.2.3、log4j2使用
與 log4j 類似,直接在需要位置打印日志即可
- package org.example.log4j.service;
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- public class LogPrintUtil {
- /**log靜態(tài)常量*/
- private static final Logger logger = LoggerFactory.getLogger(LogPrintUtil.class);
- public static void main(String[] args){
- logger.info("info信息");
- logger.warn("warn信息");
- logger.error("error信息");
- }
- }
四、Logback
4.1、介紹
Logback 也是用 java 編寫一款非常熱門的日志開源框架,由 log4j 創(chuàng)始人寫的,性能比 log4j 要好!
logback 主要分為3個模塊:
- logback-core:核心代碼模塊
- logback-classic:log4j的一個改良版本,同時實現(xiàn)了slf4j的接口,這樣你如果之后要切換其他日志組件也是一件很容易的事
- logback-access:訪問模塊與Servlet容器集成提供通過Http來訪問日志的功能
4.2、項目應用
4.2.1、添加 maven 依賴
ch.qos.logback logback-classic 1.2.3 org.codehaus.janino janino 2.7.8
4.2.2、創(chuàng)建logback配置文件
1、配置說明
logback在啟動的時候,會按照下面的順序加載配置文件:
- 如果java程序啟動時指定了logback.configurationFile屬性,就用該屬性指定的配置文件。如java -Dlogback.configurationFile=/path/to/mylogback.xml Test,這樣執(zhí)行Test類的時候就會加載/path/to/mylogback.xml配置
- 在classpath中查找logback.groovy文件
- 在classpath中查找logback-test.xml文件
- 在classpath中查找logback.xml文件
- 如果是jdk6+,那么會調(diào)用ServiceLoader查找 com.qos.logback.classic.spi.Configurator接口的第一個實現(xiàn)類
- 自動使用ch.qos.logback.classic.BasicConfigurator,在控制臺輸出日志
上面的順序表示優(yōu)先級,使用java -D配置的優(yōu)先級最高,只要獲取到配置后就不會再執(zhí)行下面的流程。相關代碼可以看ContextInitializer#autoConfig()方法。
2、同步輸出日志
- value="%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{90} - %msg%n" />
${CONTEXT_NAME} ${CUSTOM_LOG_PATTERN} UTF-
當前文章:Log配置教程及框架性能比較,看這篇就夠了!
標題來源:http://www.dlmjj.cn/article/cdssggp.html


咨詢
建站咨詢
