log4j2自定義配置檔案位置和檔名(附log4j2.xml配置例項)
阿新 • • 發佈:2019-01-22
前言
我們使用log4j2一般做法是將log4j2.xml檔案放在資原始檔夾根目錄。對於有強迫症的開發者來說,我更喜歡在資原始檔夾下新建包或資料夾,然後把配置檔案放在裡面。本部落格將介紹如何自定義log4j2.xml檔案的位置和檔名。
web.xml配置
<!-- 系統日誌配置監聽器 -->
<listener>
<listener-class>edu.example.holder.system.Log4j2ConfigListener</listener-class>
</listener >
<context-param>
<description>日誌配置檔案的路徑</description>
<param-name>log4j.configurationFile</param-name>
<param-value>log4j/log4j2.xml</param-value>
</context-param>
Log4j2ConfigListener類是自定義的類,實現ServletContextListener介面,這樣tomcat啟動時可以更改日誌配置檔案的預設路徑和檔名。
生效配置檔案
package edu.example.holder.system;
import java.util.Enumeration;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import org.apache.logging.log4j.core.config.Configurator;
public class Log4j2ConfigListener implements ServletContextListener
{
private static final String KEY = "log4j.configurationFile";
@Override
public void contextDestroyed(ServletContextEvent arg0)
{
}
@Override
public void contextInitialized(ServletContextEvent arg0)
{
String fileName = getContextParam(arg0);
Configurator.initialize("Log4j2", "classpath:" + fileName);
}
@SuppressWarnings("unchecked")
private String getContextParam(ServletContextEvent event) {
Enumeration<String> names = event.getServletContext().getInitParameterNames();
while (names.hasMoreElements())
{
String name = names.nextElement();
String value = event.getServletContext().getInitParameter(name);
if(name.trim().equals(KEY))
{
return value;
}
}
return null;
}
}
日誌配置檔案例項
<?xml version="1.0" encoding="UTF-8"?>
<!--
status : 這個用於設定log4j2自身內部的資訊輸出,可以不設定,當設定成trace時,會看到log4j2內部各種詳細輸出
monitorInterval : Log4j能夠自動檢測修改配置檔案和重新配置本身, 設定間隔秒數。
注:本配置檔案的目標是將不同級別的日誌輸出到不同檔案,最大2MB一個檔案,
檔案資料達到最大值時,舊資料會被壓縮並放進指定資料夾
-->
<Configuration status="WARN" monitorInterval="600">
<Properties>
<!-- 配置日誌檔案輸出目錄,此配置將日誌輸出到tomcat根目錄下的指定資料夾 -->
<Property name="LOG_HOME">${sys:catalina.home}/WebAppLogs/SSHExample</Property>
</Properties>
<Appenders>
<!--這個輸出控制檯的配置,這裡輸出除了warn和error級別的資訊到System.out-->
<Console name="console_out_appender" target="SYSTEM_OUT">
<!-- 控制檯只輸出level及以上級別的資訊(onMatch),其他的直接拒絕(onMismatch) -->
<ThresholdFilter level="warn" onMatch="DENY" onMismatch="ACCEPT"/>
<!-- 輸出日誌的格式 -->
<PatternLayout pattern="%5p [%t] %d{yyyy-MM-dd HH:mm:ss} (%F:%L) %m%n"/>
</Console>
<!--這個輸出控制檯的配置,這裡輸出warn和error級別的資訊到System.err,在eclipse控制檯上看到的是紅色文字-->
<Console name="console_err_appender" target="SYSTEM_ERR">
<!-- 控制檯只輸出level及以上級別的資訊(onMatch),其他的直接拒絕(onMismatch) -->
<ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
<!-- 輸出日誌的格式 -->
<PatternLayout pattern="%5p [%t] %d{yyyy-MM-dd HH:mm:ss} (%F:%L) %m%n"/>
</Console>
<!-- TRACE級別日誌 -->
<!-- 設定日誌格式並配置日誌壓縮格式,壓縮檔案獨立放在一個資料夾內,
日期格式不能為冒號,否則無法生成,因為檔名不允許有冒號,此appender只輸出trace級別的資料到trace.log -->
<RollingRandomAccessFile name="trace_appender"
immediateFlush="true" fileName="${LOG_HOME}/trace.log"
filePattern="${LOG_HOME}/trace/trace - %d{yyyy-MM-dd HH_mm_ss}.log.gz">
<PatternLayout>
<pattern>%5p [%t] %d{yyyy-MM-dd HH:mm:ss} (%F:%L) %m%n</pattern>
</PatternLayout>
<Policies><!-- 兩個配置任選其一 -->
<!-- 每個日誌檔案最大2MB -->
<SizeBasedTriggeringPolicy size="2MB"/>
</Policies>
<Filters><!-- 此Filter意思是,只輸出debug級別的資料 -->
<!-- DENY,日誌將立即被拋棄不再經過其他過濾器;
NEUTRAL,有序列表裡的下個過濾器過接著處理日誌;
ACCEPT,日誌會被立即處理,不再經過剩餘過濾器。 -->
<ThresholdFilter level="debug" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
</RollingRandomAccessFile>
<!-- DEBUG級別日誌 -->
<!-- 設定日誌格式並配置日誌壓縮格式,壓縮檔案獨立放在一個資料夾內,
日期格式不能為冒號,否則無法生成,因為檔名不允許有冒號,此appender只輸出debug級別的資料到debug.log -->
<RollingRandomAccessFile name="debug_appender"
immediateFlush="true" fileName="${LOG_HOME}/debug.log"
filePattern="${LOG_HOME}/debug/debug - %d{yyyy-MM-dd HH_mm_ss}.log.gz">
<PatternLayout>
<pattern>%5p [%t] %d{yyyy-MM-dd HH:mm:ss} (%F:%L) %m%n</pattern>
</PatternLayout>
<Policies><!-- 兩個配置任選其一 -->
<!-- 每個日誌檔案最大2MB -->
<SizeBasedTriggeringPolicy size="2MB"/>
<!-- 如果啟用此配置,則日誌會按檔名生成新壓縮檔案,
即如果filePattern配置的日期格式為 %d{yyyy-MM-dd HH} ,則每小時生成一個壓縮檔案,
如果filePattern配置的日期格式為 %d{yyyy-MM-dd} ,則天生成一個壓縮檔案 -->
<!-- <TimeBasedTriggeringPolicy interval="1" modulate="true" /> -->
</Policies>
<Filters><!-- 此Filter意思是,只輸出debug級別的資料 -->
<!-- DENY,日誌將立即被拋棄不再經過其他過濾器;
NEUTRAL,有序列表裡的下個過濾器過接著處理日誌;
ACCEPT,日誌會被立即處理,不再經過剩餘過濾器。 -->
<ThresholdFilter level="info" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
</RollingRandomAccessFile>
<!-- INFO級別日誌 -->
<RollingRandomAccessFile name="info_appender"
immediateFlush="true" fileName="${LOG_HOME}/info.log"
filePattern="${LOG_HOME}/info/info - %d{yyyy-MM-dd HH_mm_ss}.log.gz">
<PatternLayout>
<pattern>%5p [%t] %d{yyyy-MM-dd HH:mm:ss} (%F:%L) %m%n</pattern>
</PatternLayout>
<Policies>
<SizeBasedTriggeringPolicy size="2MB"/>
</Policies>
<Filters>
<ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
</RollingRandomAccessFile>
<!-- WARN級別日誌 -->
<RollingRandomAccessFile name="warn_appender"
immediateFlush="true" fileName="${LOG_HOME}/warn.log"
filePattern="${LOG_HOME}/warn/warn - %d{yyyy-MM-dd HH_mm_ss}.log.gz">
<PatternLayout>
<pattern>%5p [%t] %d{yyyy-MM-dd HH:mm:ss} (%F:%L) %m%n</pattern>
</PatternLayout>
<Policies>
<SizeBasedTriggeringPolicy size="2MB"/>
</Policies>
<Filters>
<ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
</RollingRandomAccessFile>
<!-- ERROR級別日誌 -->
<RollingRandomAccessFile name="error_appender"
immediateFlush="true" fileName="${LOG_HOME}/error.log"
filePattern="${LOG_HOME}/error/error - %d{yyyy-MM-dd HH_mm_ss}.log.gz">
<PatternLayout>
<pattern>%5p [%t] %d{yyyy-MM-dd HH:mm:ss} (%F:%L) %m%n</pattern>
</PatternLayout>
<Policies>
<SizeBasedTriggeringPolicy size="2MB"/>
</Policies>
<Filters>
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
</RollingRandomAccessFile>
</Appenders>
<Loggers>
<!-- 配置日誌的根節點 -->
<root level="trace">
<appender-ref ref="console_out_appender"/>
<appender-ref ref="console_err_appender"/>
<appender-ref ref="trace_appender"/>
<appender-ref ref="debug_appender"/>
<appender-ref ref="info_appender"/>
<appender-ref ref="warn_appender"/>
<appender-ref ref="error_appender"/>
</root>
<!-- 第三方日誌系統 -->
<logger name="org.springframework.core" level="info"/>
<logger name="org.springframework.beans" level="info"/>
<logger name="org.springframework.context" level="info"/>
<logger name="org.springframework.web" level="info"/>
<logger name="org.jboss.netty" level="warn"/>
<logger name="org.apache.http" level="warn"/>
</Loggers>
</Configuration>
結束語
本文章追求簡潔時尚,不贅述。轉載請註明出處,謝謝。