1. Log4j 1
引入Log4j:
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
重點講解Log4j的配置文件log4j.properties
(classpath下):
log4j.rootLogger=info, A, B, C
# 使用的輸出器
log4j.appender.A=org.apache.log4j.ConsoleAppender
# 輸出目標
log4j.appender.A.Target=System.out
# 輸出格式
log4j.appender.A.layout=org.apache.log4j.PatternLayout
# 自定義格式
log4j.appender.A.layout.conversionPattern=%d{yyyy-MM-dd HH:mm:ss, SSS} [%t] [%p]:%L - %m%n
log4j.appender.B=org.apache.log4j.DailyRollingFileAppender
# 輸出文件路徑,當前項目下的log/info.log文件
log4j.appender.B.File=log/info.log
# 文件編輯模式,true爲追加模式,false爲複寫模式
log4j.appender.B.Append=true
# 保存INFO級別,ERROR等更高級別不保存
log4j.appender.B.Threshold=INFO
log4j.appender.B.layout=org.apache.log4j.PatternLayout
log4j.appender.B.layout.conversionPattern=%d{yyyy-MM-dd HH:mm:ss, SSS} [%t] [%p]:%L - %m%n
log4j.appender.C=org.apache.log4j.DailyRollingFileAppender
log4j.appender.C.File=log/error.log
log4j.appender.C.Append=true
log4j.appender.C.Threshold=ERROR
log4j.appender.C.layout=org.apache.log4j.PatternLayout
log4j.appender.C.layout.conversionPattern=%d{yyyy-MM-dd HH:mm:ss, SSS} [%t] [%p]:%L - %m%n
Logger4j的使用:
org.apache.log4j.Logger logger = Logger.getLogger(xxx.class);
2. Log4j 2
Log4j2主要由Appender和Logger組成,一個Logger可以包含多個Appender,即一種日誌可以同時輸出到多個地方。
Logger一般使用類名作爲名稱。
2.1 helloworld
導入log4j 2依賴:
<dependencies>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.11.2</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.11.2</version>
</dependency>
</dependencies>
獲取Logger實例:
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class HelloWorld {
private static final Logger logger = LogManager.getLogger(HelloWorld.class);
public static void main(String[] args) {
logger.info("Hello, World!");
}
}
log4j2提供了無參獲取方式,即LogManager.getLogger()
會生成以當前類爲名稱的logger。
輸出參數可以使用{}
形式:logger.debug("logger with username = {}", user.getName())
;
參數格式化第一種可以使用formatterLogger
:
public static Logger logger = LogManager.getFormatterLogger("Foo");
logger.debug("Logging in user %s with birthday %s", user.getName(), user.getBirthdayCalendar());
第二種可以使用普通logger的printf()
:
public static Logger logger = LogManager.getLogger("Foo");
logger.printf(Level.INFO, "Logging in user %1$s with birthday %2$tm %2$te,%2$tY", user.getName(), user.getBirthdayCalendar());
默認加載classpath:log4j2.xml
配置文件,若無則使用默認配置,以下爲與默認配置一樣效果的log4j2.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" monitorInterval="30">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
</Appenders>
<Loggers>
<Root level="error">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
2.2 結合slf
引入
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.11.2</version>
</dependency>
即可使用slf的api,底層用的是l4j2。
再加上一個lombok庫,IDEA同時啓用lombok插件,即可使用@slf
,無需手動創建logger。
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.6</version>
</dependency>
2.3 Configuration
Configuration
標籤可以設置的主要屬性:
status
:設置log4j2本身的運行日誌級別。monitorInterval
:自動重新加載配置文件的間隔(秒)。name
:配置組名稱。
日誌級別高低:TRACE < DEBUG < INFO < WARN < ERROR < FATAL
Configuration
標籤的主要子標籤:
properties
:定義屬性Appenders
Loggers
屬性的定義及使用:
<configuration>
<properties>
<property name="LOG_HOME">D:/logs</property>
<property name="FILE_NAME">mylog</property>
</properties>
<Appenders>
<File name="File" fileName="${LOG_HOME}/${FILE_NAME}.log" append="false">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</File>
</Appenders>
</configuration>
2.4 Appenders
Appenders
標籤用來配置日誌輸出對象,例如控制檯、文件等。
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
<File name="File" fileName="log/info.log" append="false">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</File>
</Appenders>
File
標籤用來定義文件類型的輸出對象,常用屬性如下:
name
:Appender名稱,用來給Logger進行引用fileName
:輸出的文件路徑,可以是相對於項目根目錄的路徑,例如logs/info.log
,或者絕對路徑D:/logs/app.log
append
:文件寫入模式,true爲續寫模式,false爲複寫模式
RollingRandomAccessFile
Appender,rolling表示滿足某個條件即重命名原日誌文件,重新生成新的日誌文件,例如按天生成日誌文件,或超過指定大小重新生成日誌文件。
<Appenders>
<RollingRandomAccessFile name="MyFile"
fileName="${LOG_HOME}/${FILE_NAME}.log"
filePattern="${LOG_HOME}/$${date:yyyy-MM}/${FILE_NAME}-%d{yyyy-MM-dd HH-mm}-%i.log">
<PatternLayout
pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
<Policies>
<TimeBasedTriggeringPolicy interval="1" />
<SizeBasedTriggeringPolicy size="10 MB" />
</Policies>
<DefaultRolloverStrategy max="20" />
</RollingRandomAccessFile>
</Appenders>
主要屬性或標籤說明如下:
fileName
:當前日誌文件名稱。filePattern
:觸發rolling時,將原有日誌重命名的格式。%i
表示同一時間段中,超出臨界值文件大小而重命名的日誌文件序號。SizeBasedTriggeringPolicy
:日誌文件大小臨界值。TimeBasedTriggeringPolicy
:日誌文件時間點臨界值,以filePattern
中最小的時間粒度爲單位,例如HH-mm
,則interval="1"
表示1分鐘。DefaultRolloverStrategy
:最多保存的日誌文件個數。
PatternLayout
標籤用來配置日誌格式,常見的格式符號:
%d{yyyy-MM-dd HH:mm:ss.SSS}
:輸出時間,格式爲年-月-日 時:分:秒.毫秒%t
:輸出當前線程名稱%-5level
:輸出當前日誌級別,-5表示左對齊並且固定輸出5個字符,不足在右邊補0%logger
:輸出logger名稱%msg
:日誌內容%n
:換行符%L
:輸出行號,可能影響性能,慎用。
2.6 Loggers
Loggers
標籤用來配置所有Logger的屬性,對於Java代碼中使用的Logger,會根據其名稱在這裏查找對應的Logger屬性配置並應用,如果沒找到,則會使用ROOT Logger的配置。
自定義Logger屬性:
<Loggers>
<Logger name="mylog" level="trace" additivity="false">
<AppenderRef ref="Console"/>
</Logger>
<Root level="error">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
name
:即LogManager.getLogger()
傳入的字符串或類對象的名稱。level
:當前日誌的輸出級別,小於該級別的則不會輸出。additivity
:當前日誌經由Logger輸出後,是否繼續交由ROOT Logger配置輸出。默認情況下,所有日誌輸出後都會再交由ROOT Logger輸出。
2.7 自定義配置文件位置
web項目配置web.xml
:
<context-param>
<param-name>log4jConfiguration</param-name>
<param-value>/WEB-INF/conf/log4j2.xml</param-value>
</context-param>
<listener>
<listener-class>org.apache.logging.log4j.web.Log4jServletContextListener</listener-class>
</listener>
2.8 Web應用結合Log4j 2
爲了讓Log4j 2可以自動根據Web應用的生命週期進行資源釋放等操作,需要導入以下依賴:
<dependencies>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-web</artifactId>
<version>2.11.2</version>
</dependency>
</dependencies>
參考:詳解log4j2(上) - 從基礎到實戰
參考:Using Log4j 2 in Web Applications