天天看點

日志架構4:log4j配置

1.日志級别

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

OFF: 為最高等級 關閉了日志資訊

FATAL: 為可能導緻應用中止的嚴重事件錯誤

ERROR:為嚴重錯誤 主要是程式的錯誤

WARN: 為一般警告,比如session丢失

INFO: 為一般要顯示的資訊,比如登入登出 DEBUG 為程式的調試資訊

TRACE: 為比DEBUG更細粒度的事件資訊 ALL 為最低等級,将打開所有級别的日志

2.Appender

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

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

配置日志資訊輸出目的地

1.org.apache.log4j.ConsoleAppender(控制台)

2.org.apache.log4j.FileAppender(檔案)

3.org.apache.log4j.DailyRollingFileAppender(每天産生一個日志檔案)

4.org.apache.log4j.RollingFileAppender(檔案大小到達指定尺寸的時候産生一個新的檔案)

5.org.apache.log4j.WriterAppender(将日志資訊以流格式發送到任意指定的地方)

3.輸出格式

1.org.apache.log4j.HTMLLayout(以HTML表格形式布局),

2.org.apache.log4j.PatternLayout(可以靈活地指定布局模式),

3.org.apache.log4j.SimpleLayout(包含日志資訊的級别和資訊字元串),

4.org.apache.log4j.TTCCLayout(包含日志産生的時間、線程、類别等等資訊)

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 方法名

詳細配置參數如下表:

參數 說明 例子
%c 列出logger名字空間的全稱,如果加上{<層數>}表示列出從最内層算起的指定層數的名字空間 log4j配置檔案參數舉例 輸出顯示媒介
假設目前logger名字空間是"a.b.c"
%c a.b.c
%c{2} b.c
%20c (若名字空間長度小于20,則左邊用空格填充)
%-20c (若名字空間長度小于20,則右邊用空格填充)
%.30c (若名字空間長度超過30,截去多餘字元)
%20.30c (若名字空間長度小于20,則左邊用空格填充;若名字空間長度超過30,截去多餘字元)
%-20.30c (若名字空間長度小于20,則右邊用空格填充;若名字空間長度超過30,截去多餘字元)
%C 列出調用logger的類的全名(包含包路徑) 假設目前類是"org.apache.xyz.SomeClass"
%C org.apache.xyz.SomeClass
%C{1} SomeClass
%d 顯示日志記錄時間,{<日期格式>}使用ISO8601定義的日期格式 %d{yyyy/MM/dd HH:mm:ss,SSS} 2005/10/12 22:23:30,117
%d{ABSOLUTE} 22:23:30,117
%d{DATE} 12 Oct 2005 22:23:30,117
%d{ISO8601} 2005-10-12 22:23:30,117
%F 顯示調用logger的源檔案名 %F MyClass.java
%l 輸出日志事件的發生位置,包括類目名、發生的線程,以及在代碼中的行數 %l MyClass.main(MyClass.java:129)
%L 顯示調用logger的代碼行 %L 129
%m 顯示輸出消息 %m This is a message for debug.
%M 顯示調用logger的方法名 %M main
%n 目前平台下的換行符 %n

Windows平台下表示rn

UNIX平台下表示n

%p 顯示該條日志的優先級 %p INFO
%r 顯示從程式啟動時到記錄該條日志時已經經過的毫秒數 %r 1215
%t 輸出産生該日志事件的線程名 %t MyClass
%x 按NDC(Nested Diagnostic Context,線程堆棧)順序輸出日志 假設某程式調用順序是MyApp調用com.foo.Bar
%c %x - %m%n

MyApp - Call com.foo.Bar.

com.foo.Bar - Log in Bar

MyApp - Return to MyApp.

%X 按MDC(Mapped Diagnostic Context,線程映射表)輸出日志。通常用于多個用戶端連接配接同一台伺服器,友善伺服器區分是那個用戶端通路留下來的日志。 %X{5} (記錄代号為5的用戶端的日志)
%% 顯示一個百分号 %% %

4.舉例說明

4.1 log4j.xml舉例

<?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>
           

4.2 log4j.properties舉例

#############
# 輸出到控制台
#############

# log4j.rootLogger日志輸出類别和級别:隻輸出不低于該級别的日志資訊DEBUG < INFO < WARN < ERROR < FATAL
# WARN:日志級别     CONSOLE:輸出位置自己定義的一個名字       logfile:輸出位置自己定義的一個名字
log4j.rootLogger=WARN,CONSOLE,logfile
# 配置CONSOLE輸出到控制台
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender 
# 配置CONSOLE設定為自定義布局模式
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout 
# 配置CONSOLE日志的輸出格式  [frame] 2019-08-22 22:52:12,000  %r耗費毫秒數 %p日志的優先級 %t線程名 %C所屬類名通常為全類名 %L代碼中的行号 %x線程相關聯的NDC %m日志 %n換行
log4j.appender.CONSOLE.layout.ConversionPattern=[frame] %d{yyyy-MM-dd HH:mm:ss,SSS} - %-4r %-5p [%t] %C:%L %x - %m%n

################
# 輸出到日志檔案中
################

# 配置logfile輸出到檔案中 檔案大小到達指定尺寸的時候産生新的日志檔案
log4j.appender.logfile=org.apache.log4j.RollingFileAppender
# 儲存編碼格式
log4j.appender.logfile.Encoding=UTF-8
# 輸出檔案位置此為項目根目錄下的logs檔案夾中
log4j.appender.logfile.File=logs/root.log
# 字尾可以是KB,MB,GB達到該大小後建立新的日志檔案
log4j.appender.logfile.MaxFileSize=10MB
# 設定滾定檔案的最大值3 指可以産生root.log.1、root.log.2、root.log.3和root.log四個日志檔案
log4j.appender.logfile.MaxBackupIndex=3  
# 配置logfile為自定義布局模式
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %F %p %m%n

##########################
# 對不同的類輸出不同的日志檔案
##########################

# club.bagedate包下的日志單獨輸出
log4j.logger.club.bagedate=DEBUG,bagedate
# 設定為false該日志資訊就不會加入到rootLogger中了
log4j.additivity.club.bagedate=false
# 下面就和上面配置一樣了
log4j.appender.bagedate=org.apache.log4j.RollingFileAppender
log4j.appender.bagedate.Encoding=UTF-8
log4j.appender.bagedate.File=logs/bagedate.log
log4j.appender.bagedate.MaxFileSize=10MB
log4j.appender.bagedate.MaxBackupIndex=3
log4j.appender.bagedate.layout=org.apache.log4j.PatternLayout
log4j.appender.bagedate.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %F %p %m%n