Log4J.xml配置詳解

獵手家園發表於2020-09-08

Appender

Appender:日誌輸出器,配置日誌的輸出級別、輸出位置等,包括以下幾類:

  • ConsoleAppender: 日誌輸出到控制檯;
  • FileAppender:輸出到檔案;
  • RollingFileAppender:輸出到檔案,檔案達到一定閾值時,自動備份日誌檔案;
  • DailyRollingFileAppender:可定期備份日誌檔案,預設一天一個檔案,也可設定為每分鐘一個、每小時一個;
  • WriterAppender:可自定義日誌輸出位置。

日誌級別

  • 一般日誌級別包括:ALL,DEBUG, INFO, WARN, ERROR,FATAL,OFF
  • Log4J推薦使用:DEBUG, INFO, WARN, ERROR

輸出格式

Log4J最常用的日誌輸出格式為:org.apache.log4j.PatternLayOut,其主要引數為:

  • %n - 換行
  • %m - 日誌內容
  • %p - 日誌級別(FATAL, ERROR,WARN, INFO,DEBUG or custom)
  • %r - 程式啟動到現在的毫秒數
  • %t - 當前執行緒名
  • %d - 日期和時間, 一般使用格式 %d{yyyy-MM-dd HH:mm:ss, SSS}
  • %l - 輸出日誌事件的發生位置, 同 %F%L%C%M
  • %F - java 原始檔名
  • %L - java 原始碼行數
  • %C - java 類名,%C{1} 輸出最後一個元素
  • %M - java 方法名

程式碼示例

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC "-//log4j/log4j Configuration//EN" "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

    <!-- 日誌輸出到控制檯 -->
    <appender name="console" class="org.apache.log4j.ConsoleAppender">
        <!-- 日誌輸出格式 -->
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="[%p][%d{yyyy-MM-dd HH:mm:ss SSS}][%c]-[%m]%n"/>
        </layout>

        <!--過濾器設定輸出的級別-->
        <filter class="org.apache.log4j.varia.LevelRangeFilter">
            <!-- 設定日誌輸出的最小級別 -->
            <param name="levelMin" value="INFO"/>
            <!-- 設定日誌輸出的最大級別 -->
            <param name="levelMax" value="ERROR"/>
        </filter>
    </appender>


    <!-- 輸出日誌到檔案 -->
    <appender name="fileAppender" class="org.apache.log4j.FileAppender">
        <!-- 輸出檔案全路徑名-->
        <param name="File" value="/data/applogs/own/fileAppender.log"/>
        <!--是否在已存在的檔案追加寫:預設時true,若為false則每次啟動都會刪除並重新新建檔案-->
        <param name="Append" value="false"/>
        <param name="Threshold" value="INFO"/>
        <!--是否啟用快取,預設false-->
        <param name="BufferedIO" value="false"/>
        <!--快取大小,依賴上一個引數(bufferedIO), 預設快取大小8K  -->
        <param name="BufferSize" value="512"/>
        <!-- 日誌輸出格式 -->
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="[%p][%d{yyyy-MM-dd HH:mm:ss SSS}][%c]-[%m]%n"/>
        </layout>
    </appender>


    <!-- 輸出日誌到檔案,當檔案大小達到一定閾值時,自動備份 -->
    <!-- FileAppender子類 -->
    <appender name="rollingAppender" class="org.apache.log4j.RollingFileAppender">
        <!-- 日誌檔案全路徑名 -->
        <param name="File" value="/data/applogs/RollingFileAppender.log" />
        <!--是否在已存在的檔案追加寫:預設時true,若為false則每次啟動都會刪除並重新新建檔案-->
        <param name="Append" value="true" />
        <!-- 儲存備份日誌的最大個數,預設值是:1  -->
        <param name="MaxBackupIndex" value="10" />
        <!-- 設定當日志檔案達到此閾值的時候自動回滾,單位可以是KB,MB,GB,預設單位是KB,預設值是:10MB -->
        <param name="MaxFileSize" value="10KB" />
        <!-- 設定日誌輸出的樣式 -->`
        <layout class="org.apache.log4j.PatternLayout">
            <!-- 日誌輸出格式 -->
            <param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss:SSS}] [%-5p] [method:%l]%n%m%n%n" />
        </layout>
    </appender>


    <!-- 日誌輸出到檔案,可以配置多久產生一個新的日誌資訊檔案 -->
    <appender name="dailyRollingAppender" class="org.apache.log4j.DailyRollingFileAppender">
        <!-- 檔案檔案全路徑名 -->
        <param name="File" value="/data/applogs/own/dailyRollingAppender.log"/>
        <param name="Append" value="true" />
        <!-- 設定日誌備份頻率,預設:為每天一個日誌檔案 -->
        <param name="DatePattern" value="'.'yyyy-MM-dd'.log'" />

        <!--每分鐘一個備份-->
        <!--<param name="DatePattern" value="'.'yyyy-MM-dd-HH-mm'.log'" />-->
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="[%p][%d{HH:mm:ss SSS}][%c]-[%m]%n"/>
        </layout>
    </appender>



    <!--
        1. 指定logger的設定,additivity是否遵循預設的繼承機制
        2. 當additivity="false"時,root中的配置就失靈了,不遵循預設的繼承機制
        3. 程式碼中使用Logger.getLogger("logTest")獲得此輸出器,且不會使用根輸出器
    -->
    <logger name="logTest" additivity="false">
        <level value ="INFO"/>
        <appender-ref ref="dailyRollingAppender"/>
    </logger>


    <!-- 根logger的設定,若程式碼中未找到指定的logger,則會根據繼承機制,使用根logger-->
    <root>
        <appender-ref ref="console"/>
        <appender-ref ref="fileAppender"/>
        <appender-ref ref="rollingAppender"/>
        <appender-ref ref="dailyRollingAppender"/>
    </root>

</log4j:configuration>

測試程式碼

@Component
public class LogTest {
    Logger logger = Logger.getLogger("logTest1");

    @PostConstruct
    public void test(){
        for (int i=0; i<1000; i++) {
            logger.info(i + "----Log.Info----");
            logger.info(i + "----Log.Info----");
            logger.info(i + "----Log.Info----");
        }
    }
}

測試結果

控制檯日誌輸出展示:
這裡寫圖片描述

日誌輸出到檔案:
日誌檔案