Java——Log4j1與Log4j2

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爲複寫模式

RollingRandomAccessFileAppender,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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章