log日誌配置簡述(轉)
原文連結:https://blog.csdn.net/qiuqiu886/article/details/77606636#commentsedit
近期進行log升級,簡單配置了下幾種常用日誌,分別是log4j、log4j2、logback。簡單整理,不全不深,僅備後用。
需求:將應用日誌以控制檯或檔案的形式輸出。
一、log4j
(1)引入jar包
下載並引入log4j的jar包,log4j-1.*.jar,筆者用的是 log4j-1.2.17.jar。
(2)log的主要節點
log配置檔案主要包含三個節點:Logger、Appender、Layout。
Logger:配置列印日誌的級別,輸出日誌的程式範圍,以及關聯的Appender。
Appender:配置日誌的輸出形式,輸出策略等。
Layout:配置每條日誌的內容格式。
(3)配置log4j.properties檔案,示例:
#配置根節點 log4j.rootLogger=INFO,Log4jConsole,Log4jFile #log不向上層傳遞 log4j.additivity.org.appache=false #設定變數,儲存路徑 ${catalina.home}/logs logDir=D:/tomcat/logs #控制檯輸出 log4j.appender.Log4jConsole=org.apache.log4j.ConsoleAppender log4j.appender.Log4jConsole.Threshold=INFO log4j.appender.Log4jConsole.ImmediateFlush=true log4j.appender.Log4jConsole.Target=System.out #輸出格式 log4j.appender.Log4jConsole.layout=org.apache.log4j.PatternLayout log4j.appender.Log4jConsole.layout.ConversionPattern=[%p][%d{yyyy-MM-dd HH:mm:ss,SSS}] [%c:%M:%L] %m%n #檔案輸出 log4j.appender.Log4jFile=org.apache.log4j.DailyRollingFileAppender log4j.appender.Log4jFile.Threshold=INFO log4j.appender.Log4jFile.ImmediateFlush=true log4j.appender.Log4jFile.Append=true log4j.appender.Log4jFile.File=${logDir}/log4j.log log4j.appender.Log4jFile.DatePattern='.'yyyy-MM-dd #輸出格式 log4j.appender.Log4jFile.layout=org.apache.log4j.PatternLayout log4j.appender.Log4jFile.layout.ConversionPattern=[%p][%d{yyyy-MM-dd HH:mm:ss,SSS}] [%c:%M:%L] %m%n
說明:
1.Logger節點配置,“log4j.rootLogger=INFO,Log4jConsole,Log4jFile”。
rootLogger為根節點,必須配置項。日誌輸出範圍為整個project。
若需配置logger子節點,支援以包名或類名控制日誌範圍。如:log4j.logger.com.demo=*,“com.demo”為程式包名,表示配置該包名範圍內的日誌。
2.INFO為日誌級別,表示輸出INFO級別及以上的日誌。
常用日誌級別:DEBUG < INFO < WARN < ERROR。
3.log4j.additivity屬性,表示根據程式的層級結構,下層日誌是否向上層傳遞。
4.Appender節點,示例中的Log4jConsole,Log4jFile均為Appender名稱。常用的Appender型別有:
org.apache.log4j.ConsoleAppender,控制檯形式輸出日誌。
org.apache.log4j.DailyRollingFileAppender,按時間策略,檔案形式輸出日誌。
org.apache.log4j.RollingFileAppender,按檔案大小策略,檔案形式輸出日誌。
其中:log4j.appender. * .File,設定當前日誌檔名稱。
log4j.appender.*.DatePattern,設定時間維度,支援按天、按小時等精度生成日誌。
5.若以檔案形式輸出日誌,可設定檔案儲存的相對路徑,如tomcat的“${catalina.home}”。
6.Layout設定每條日誌內容的輸出格式,Layout支援多種型別格式,筆者此次使用的是“org.apache.log4j.PatternLayout”。
設定格式:
[%p][%d{yyyy-MM-dd HH:mm:ss,SSS}] [%c:%M:%L] %m%n
程式碼呼叫:
logger.info("it is a log for log4j!");
執行效果:
[INFO][2017-08-26 10:22:23][com.demo.log.Log4jTest:writeLog:41]it is a log for log4j!
格式化符號 | 意義 | 備註 |
---|---|---|
%p | 日誌級別 | 如:INFO、WARN |
%d | 時間 | 可設定格式,%d{yyyy_MM_dd HH:mm:ss} |
%t | 執行緒名 | |
%c | 類名 | 如:%-20c,表示,左對齊,最大長度20 |
%M | 方法名 | |
%L | 行號 | |
%m | 日誌內容 | 程式碼輸出的內容 |
%n | 換行 |
(4)程式碼引用
此處為了說明,程式碼使用log4j自身的類寫log。具體運用建議使用slf4j形式,具體後面講解。
import org.apache.log4j.Logger;
......
private static Logger logger = Logger.getLogger(Log4j2Test.class);
......
logger.info("it is a log for log4j!");
log4j、log4j2、logback的配置項相似,只是語法不同,後面僅簡述不同的地方,不重複說明。
二、log4j2
(1)引入jar包
下載並引入log4j的jar包,log4j-api-2.*.jar,log4j-core-2.*.jar。筆者用的是 log4j-api-2.8.2.jar,log4j-core-2.8.2.jar。
(2)配置log4j2.xml檔案,示例:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" monitorInterval="60">
<Properties>
<!-- 日誌輸出路徑變數 ${sys:catalina.home}/logs -->
<Property name="logDir" value="D:/tomcat/logs" />
<Appenders>
<!-- 控制檯輸出 -->
<Console name="Log4j2Console" target="SYSTEM_OUT">
<PatternLayout
pattern="[%p][%d{yyyy-MM-dd HH:mm:ss,SSS}] [%c:%M:%L] %m%n" />
</Console>
<!-- 檔案輸出 -->
<RollingFile name="Log4j2File" fileName="${logDir}/log4j2.log"
filePattern="${logDir}/log4j2.log.%d{yyyy-MM-dd}">
<PatternLayout
pattern="[%p][%d{yyyy-MM-dd HH:mm:ss,SSS}] [%c:%M:%L] %m%n" />
<Policies>
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="100MB" />
</Policies>
</RollingFile>
</Appenders>
<Loggers>
<Root level="INFO">
<appender-ref ref="Log4j2Console" />
<appender-ref ref="Log4j2File"/>
</Root>
</Loggers>
</Configuration>
說明:
1.Configuration標籤中的monitorInterval屬性,表示自動掃描的間隔秒數。log4j2定時掃描配置檔案,當配置檔案發生變化,將重新載入生效。
2.status屬性,表示檢視log4j2內部日誌的日誌級別,應用可檢視log4j2內部的載入日誌。
3.若設定tomcat的相對路徑儲存日誌檔案,使用 ${sys:catalina.home},和log4j有區別。
4.RollingFile 檔案形式輸出日誌,支援通過時間、檔案大小兩種策略生成檔案。
5.RollingFile節點的filename屬性,可設定當前檔名包含時間戳。如:
fileName="${log.dir}/log4j2.log.${date:yyyy-MM-dd}"
- 6.本例項中僅配置了root根日誌節點,若需配置子節點,在中新增子節點即可。
<Logger level="INFO" name="com.demo.log" additivity="false">
<appender-ref ref="Log4j2Console" />
</Logger>
7.log4j2支援配置非同步寫log,以提升日誌列印效率。配置如下:
<Appenders>
<RollingRandomAccessFile name="Log4j2File"
fileName="${logDir}/log4j2.log" filePattern="${log.dir}/log4j2.log.%d{yyyy-MM-dd}">
<PatternLayout>
<Pattern>[%p] %d{MM-dd HH:mm:ss,SSS}-(%c:%M:%L) %m%n</Pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy />
</Policies>
</RollingRandomAccessFile>
......
</Appenders>
<Loggers>
<AsyncLogger name="com.demo.log"
level="INFO" additivity="false">
<AppenderRef ref="Log4j2File" />
</AsyncLogger>
......
</Loggers>
(3)程式碼引用
此處為了說明,程式碼使用log4j2自身的類寫log。具體運用建議使用slf4j形式,具體後面講解。
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
......
private static Logger logger = LogManager.getLogger(Log4j2Test.class);
......
logger.info("it is a log for log4j2!");
三、logback
(1)引入jar包
下載並引入jar包,筆者用的是:slf4j-api-1.7.7.jar,logback-core-1.1.2.jar,logback-classic-1.1.2.jar。
(2)配置logback.xml檔案,配置檔案示例:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration scan="true" scanPeriod="60 seconds" debug="true">
<!-- 60s 自動掃描配置 -->
<!-- 檔案路徑變數 ${catalina.home}/logs -->
<Property name="logDir" value="D:/tomcat/logs" />
<!-- 控制檯輸出 -->
<Appender name="LogbackConsole" class="ch.qos.logback.core.ConsoleAppender">
<Encoder>
<Pattern>[%p][%d{yyyy-MM-dd HH:mm:ss,SSS}][%C:%M:%L]%m%n
</Pattern>
</Encoder>
</Appender>
<!-- 檔案輸出 -->
<Appender name="LogbackFile"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>${logDir}/logback.log</File>
<Append>true</Append>
<RollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>${logDir}/logback.log.%d{yyyy-MM-dd}.%i
</FileNamePattern>
</RollingPolicy>
<TriggeringPolicy
class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>100MB</MaxFileSize>
</TriggeringPolicy>
<Encoder>
<Pattern>[%p][%d{yyyy-MM-dd HH:mm:ss,SSS}][%C:%M:%L]%m%n
</Pattern>
</Encoder>
</Appender>
<Root level="INFO">
<Appender-ref ref="LogbackConsole" />
<Appender-ref ref="LogbackFile" />
</Root>
</Configuration>
說明:
1.logback可設定歷史日誌檔案自動壓縮,設定fileNamePattern屬性新增“.gz”字尾即可。
<fileNamePattern>${log.dir}/logback.log.%i.%d{yyyy-MM-dd}.gz</fileNamePattern>
- 1
logback、log4j2的配置檔案較相似,讀懂了上面log4j2的配置檔案,再看logback的配置就很輕鬆,不做過多說明。
(3)程式碼引用
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
......
private final static Logger logger = LoggerFactory
.getLogger(LogbackTest.class);
......
logger.info("it is a log for logback!");
四、slf4j
slf4j,Simple Logging Facade for Java,Java簡單日誌門面。它不實現日誌列印,只是通過門面模式提供log的api。
此處假裝有圖的樣子
(1)引入jar包,以slf4j+log4j為例:
1. slf4j-api.jar,提供api給應用,如LoggerFactory工廠類。
2. slf4j-log4j.jar,橋接包,關聯slf4j及log4j。
3. log4j-*jar,log4j的jar包,實現log列印。
(2)程式碼採用slf4j形式,同logback的程式碼示例:
private final static Logger logger = LoggerFactory
.getLogger(LogbackTest.class);
......
logger.info("it is a log for {}!",type);
......
(3)slf4j的好處:1、統一使用slf4j形式寫log,不用修改原始碼,便於日誌升級。2、log引數使用佔位符{},不使用字串拼接,語句清晰,效能更好。