日誌框架之Log4j

Log4j介紹

本博文相關代碼GitHub

核心概念

Log4j官方文檔:

Log4j has three main components: loggers, appenders and layouts. These three types of components work together to enable developers to log messages according to message type and level, and to control at runtime how these messages are formatted and where they are reported.1

就是說Log4j三大組件:loggers, appenders 和layouts

Logger: 日誌記錄器,日誌記錄的核心類,用於輸出不同日誌級別的消息。
Appender: 日誌輸出目標,用於指定日誌輸出的目的地,如控制檯、文件等等。
Layout: 日誌格式化器,用於指定日誌按照什麼格式輸出,是日誌輸出的格式化器。

日誌級別

Log4j中的日誌級別以及優先級(詳細請參考我的博文Java系統中常用日誌框架中關於消息級別的描述):

TRACE<DEBUG(調試)<INFO(消息)<WARN(警告)<ERROR(錯誤)<FATAL(致命)

配置文件讀取

  • BasicConfigurator.configure () : 自動快速地使用缺省 Log4j 環境;
  • PropertyConfigurator.configure ( String configFilename) :讀取使用 Java 的特性文件編寫的配置文件,即properties文件;
  • DOMConfigurator.configure ( String filename ) :讀取 XML 形式的配置文件;

Log4j使用

Logger

  • 日誌記錄器是Log4j使用的核心類,通過Logger類可以設置日誌消息的輸出級別、輸出目的地以及輸出格式;
  • 日誌記錄器具有繼承性,子類本身沒有記錄器的會繼承上一層父類記錄器;
  • 一般使用Logger log = Logger.getLogger(XXXX.class),參數爲當前所在類的類文件,也可以是使用Logger log = Logger.getLogger(String name),負責指定名成的所有日誌。
  • 對於同一參數的Logger其本身引用的是同一個Logger;
 package com.frank;

import org.apache.log4j.Level;
import org.apache.log4j.Logger;

/**
 * 測試Log4j
 *
 * @AUTHOR:Frank
 * @DATE:06/04/2019
 */
public class Log4jDemo {

    //創建日誌記錄器 Logger
    static final Logger logger = Logger.getLogger(Log4jDemo.class);

    public static void main(String[] args) {

        logger.setLevel(Level.WARN);
        // debug level
        logger.debug("This is debug level  log");
        // info level
        logger.info("This is info level log");
        // warning level
        logger.warn("This is warning level log");
        // error level
        logger.error("This is error level log");
    }

}

輸出結果:
在這裏插入圖片描述

Appender

Log4j中用於控制日誌輸出的目的地,每一個Appender就表示一個輸出目標,有以下幾種:

  • ConsoleAppender:輸出到控制檯;
  • FileAppender:輸出到指定文件;
  • DailyRollingFileAppender:每天產生一個單獨的日誌文件;
  • RollingFileAppender:限制日誌文件大小,每當達到大小限制時生成一個新的日誌文件;
  • WriterAppender:將日誌信息以流格式發送到任意指定的地方;

首先這幾個Appender的類關係圖:
在這裏插入圖片描述
由此我們可以知道他們之間的關係,我們日常使用ConsoleAppender、FileAppender、DailyRollingFileAppender、RollingFileAppender即可。
公共屬性:

屬性名 屬性值類型 描述
Threshold String 日誌輸出級別
Threshold String 日誌輸出級別
ImmediateFlush Boolean 是否立即輸出
Encoding String 日誌輸出編碼
layout Layout 日誌輸出佈局
ConversionPattern String 當日志輸出佈局爲自定義時,使用選項

不同的Appender具有其不同的屬性設置:
ConsoleAppender:

屬性名 屬性值類型 描述
Target System.out 輸出到控制檯

DailyRollingFileAppender:

屬性名 屬性值類型 描述
File String 文件路徑
Append Boolean 是否尾部附加
DatePattern String 生成周期

RollingFileAppender:

屬性名 屬性值類型 描述
File String 文件路徑
Append Boolean 是否尾部附加
MaxFileSize String 單個文件大小
MaxBackupIndex Number 備份文件記錄數
#### ConsoleAppender:控制檯輸出 ####

log4j.appender.STDOUT = org.apache.log4j.ConsoleAppender 
# 輸出到控制檯
log4j.appender.STDOUT.Target = System.out
# 指定控制檯輸出日誌級別
log4j.appender.STDOUT.Threshold = INFO
# 默認值是 true, 表示是否立即輸出
log4j.appender.STDOUT.ImmediateFlush = true
# 設置編碼方式
log4j.appender.STDOUT.Encoding = UTF-8
# 日誌輸出佈局
log4j.appender.STDOUT.layout = org.apache.log4j.PatternLayout
# 如果日誌輸出佈局爲PatternLayout 自定義級別,需要使用ConversionPattern指定輸出格式
log4j.appender.STDOUT.layout.ConversionPattern =[%d{yyyy-MM-dd HH:mm:ss,SSS}]-[%p] -%c -%r -%l.%M(%L) | %m%n

#### FileAppender: 輸出到文件 ####
log4j.appender.FA = org.apache.log4j.FileAppender 
# 指定輸出文件路徑
log4j.appender.FA.File = D:/log/log4j-FA.log
# 指定輸出日誌級別
log4j.appender.FA.Threshold = DEBUG
# 默認爲true,意味着輸出方式爲追加,反之則爲覆蓋
log4j.appender.FA.Append = true
# 默認值是 true, 表示是否立即輸出
log4j.appender.FA.ImmediateFlush = true
# 設置編碼方式
log4j.appender.FA.Encoding = UTF-8
# 日誌輸出佈局
log4j.appender.FA.layout = org.apache.log4j.PatternLayout
# 如果日誌輸出佈局爲PatternLayout 自定義級別,需要使用ConversionPattern指定輸出格式
log4j.appender.FA.layout.ConversionPattern =FA-[framework] [%d{yyyy-MM-dd HH:mm:ss,SSS}]-[%p] -%c -%r -%l.%M(%L) | %m%n


#### DailyRollingFileAppender: 指定週期輸出到新文件 ####
log4j.appender.DFA = org.apache.log4j.DailyRollingFileAppender 
# 指定輸出文件路徑
log4j.appender.DFA.File = D:/log/log4j-DFA.log
# 指定輸出日誌級別
log4j.appender.DFA.Threshold = INFO
# 默認爲true,意味着輸出方式爲追加,反之則爲覆蓋
log4j.appender.DFA.Append = true
# 默認值是 true, 表示是否立即輸出
log4j.appender.DFA.ImmediateFlush = true
# 設置編碼方式
log4j.appender.DFA.Encoding = UTF-8
# 指定分隔週期:月,周,天,時,分
# '.': 每月
# '.'yyyy-ww: 每週
# '.'yyyy-MM-dd: 每天
# '.'yyyy-MM-dd-a: 每天兩次
# '.'yyyy-MM-dd-HH: 每小時
# '.'yyyy-MM-dd-HH-mm: 每分鐘
log4j.appender.DFA.DatePattern ='.'yyyy-MM-dd-HH-mm
# 日誌輸出佈局
log4j.appender.DFA.layout = org.apache.log4j.PatternLayout
# 如果日誌輸出佈局爲PatternLayout 自定義級別,需要使用ConversionPattern指定輸出格式
log4j.appender.DFA.layout.ConversionPattern =DFA-[framework] [%d{yyyy-MM-dd HH:mm:ss,SSS}]-[%p] -%c -%r -%l.%M(%L) | %m%n

Layout

  • HTMLLayout:以HTML表格形式佈局輸出;
  • PatternLayout:以自定義的格式輸出;
  • SimpleLayout:簡單格式,是包含日誌信息的級別和信息字符串;
  • TTCCLayout:包含日誌產生的時間、線程、類別等等信息

當使用自定義格式輸出時,需要使用ConversionPattern自定義輸出格式,Log4j採用的是C語言中Printf函數的格式,

  • %p: 輸出日誌信息優先級,即DEBUG,INFO,WARN,ERROR,FATAL,
  • %d: 輸出日誌時間點的日期或時間,默認格式爲ISO8601,也可以在其後指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},輸出類似:2002年10月18日 22:10:28,921
  • %r: 輸出自應用啓動到輸出該log信息耗費的毫秒數
  • %c: 輸出日誌信息所屬的類目,通常就是所在類的全名
  • %t: 輸出產生該日誌事件的線程名
  • %l: 輸出日誌事件的發生位置,相當於%C.%M(%F:%L)的組合,包括類目名、發生的線程,以及在代碼中的行數。舉例:Log4jDemo.main(Log4jDemo.Java:23)
  • %x: 輸出和當前線程相關聯的NDC(嵌套診斷環境),尤其用到像Java servlets這樣的多客戶多線程的應用中。
  • %%: 輸出一個”%”字符
  • %F: 輸出日誌消息產生時所在的文件名稱
  • %L: 輸出代碼中的行號
  • %m: 輸出代碼中指定的消息,產生的日誌具體信息
  • %n: 輸出一個回車換行符,Windows平臺爲”\r\n”,Unix平臺爲”\n”輸出日誌信息換行
####測試輸出佈局:HTMLLayout ####
log4j.appender.HHT = org.apache.log4j.RollingFileAppender 
# 指定輸出文件路徑
log4j.appender.HHT.File = D:/log/log4jHtml.html
# 指定輸出日誌級別
log4j.appender.HHT.Threshold = DEBUG
# 默認爲true,意味着輸出方式爲追加,反之則爲覆蓋
log4j.appender.HHT.Append = true
# 默認值是 true, 表示是否立即輸出
log4j.appender.HHT.ImmediateFlush = true
# 設置編碼方式
log4j.appender.HHT.Encoding = UTF-8
# 設置單個文件大小限制
log4j.appender.HHT.MaxFileSize = 2MB
# 設置最大備份文件記錄數
log4j.appender.HHT.MaxBackupIndex = 20
# 日誌輸出佈局
log4j.appender.HHT.layout = org.apache.log4j.HTMLLayout

####測試輸出佈局:SimpleLayout ####
log4j.appender.SL = org.apache.log4j.RollingFileAppender 
# 指定輸出文件路徑
log4j.appender.SL.File = D:/log/log4jSL.html
# 指定輸出日誌級別
log4j.appender.SL.Threshold = INFO
# 默認爲true,意味着輸出方式爲追加,反之則爲覆蓋
log4j.appender.SL.Append = true
# 默認值是 true, 表示是否立即輸出
log4j.appender.SL.ImmediateFlush = true
# 設置編碼方式
log4j.appender.SL.Encoding = UTF-8
# 設置單個文件大小限制
log4j.appender.SL.MaxFileSize = 2MB
# 設置最大備份文件記錄數
log4j.appender.SL.MaxBackupIndex = 20
# 日誌輸出佈局
log4j.appender.SL.layout = org.apache.log4j.HTMLLayout


####測試輸出佈局:TTCCLayout ####
log4j.appender.TCC = org.apache.log4j.RollingFileAppender 
# 指定輸出文件路徑
log4j.appender.TCC.File = D:/log/log4jTCC.log
# 指定輸出日誌級別
log4j.appender.TCC.Threshold = INFO
# 默認爲true,意味着輸出方式爲追加,反之則爲覆蓋
log4j.appender.TCC.Append = true
# 默認值是 true, 表示是否立即輸出
log4j.appender.TCC.ImmediateFlush = true
# 設置編碼方式
log4j.appender.TCC.Encoding = UTF-8
# 設置單個文件大小限制
log4j.appender.TCC.MaxFileSize = 2MB
# 設置最大備份文件記錄數
log4j.appender.TCC.MaxBackupIndex = 20
# 日誌輸出佈局
log4j.appender.TCC.layout = org.apache.log4j.SimpleLayout

配置文件

Log4j 支持兩種配置文件格式,一種是 XML 格式的文件,一種是 Java 特性文件(鍵 = 值 properties 文件)。

Properties配置文件

#log4j.rootLogger=[level],[Appender1],[Appender2],[Appender3]....
#這一句的意思就是設置日誌輸出級別以及輸出目的地,可以設置多個輸出目的地,
# 以逗號分隔,輸出目的地的詳細設置爲下面的Appender設置.
# 注意:此處設置的Appender名稱應與下面詳細設置相對應,包括大小寫;
# 此處配置了幾個Appender,下面就應設置幾個。
log4j.rootLogger=DEBUG, STDOUT,INF,ERR,HHT,SL,TCC

# 輸出目的地詳細設置:
#定義對應輸出目的地:log4j.appender.appenderName = fully.qualified.name.of.appender.class.
#### ConsoleAppender:控制檯輸出 ####
log4j.appender.STDOUT = org.apache.log4j.ConsoleAppender 
# 輸出到控制檯
log4j.appender.STDOUT.Target = System.out
# 指定控制檯輸出日誌級別
log4j.appender.STDOUT.Threshold = INFO
# 默認值是 true, 表示是否立即輸出
log4j.appender.STDOUT.ImmediateFlush = true
# 設置編碼方式
log4j.appender.STDOUT.Encoding = UTF-8
# 日誌輸出佈局
log4j.appender.STDOUT.layout = org.apache.log4j.PatternLayout
# 如果日誌輸出佈局爲PatternLayout 自定義級別,需要使用ConversionPattern指定輸出格式
log4j.appender.STDOUT.layout.ConversionPattern =[%d{yyyy-MM-dd HH:mm:ss,SSS}]-[%p] -%c -%r -%l.%M(%L) | %m%n

#### DailyRollingFileAppender: 指定週期輸出到新文件 ####
log4j.appender.INF = org.apache.log4j.DailyRollingFileAppender 
# 指定輸出文件路徑
log4j.appender.INF.File = D:/log/info.log
# 指定輸出日誌級別
log4j.appender.INF.Threshold = INFO
# 默認爲true,意味着輸出方式爲追加,反之則爲覆蓋
log4j.appender.INF.Append = true
# 默認值是 true, 表示是否立即輸出
log4j.appender.INF.ImmediateFlush = true
# 設置編碼方式
log4j.appender.INF.Encoding = UTF-8
# 指定分隔週期:月,周,天,時,分
# '.': 每月
# '.'yyyy-ww: 每週
# '.'yyyy-MM-dd: 每天
# '.'yyyy-MM-dd-a: 每天兩次
# '.'yyyy-MM-dd-HH: 每小時
# '.'yyyy-MM-dd-HH-mm: 每分鐘
log4j.appender.INF.DatePattern ='.'yyyy-MM-dd-HH-mm
# 日誌輸出佈局
log4j.appender.INF.layout = org.apache.log4j.PatternLayout
# 如果日誌輸出佈局爲PatternLayout 自定義級別,需要使用ConversionPattern指定輸出格式
log4j.appender.INF.layout.ConversionPattern =DFA-[framework] [%d{yyyy-MM-dd HH:mm:ss,SSS}]-[%p] -%c -%r -%l.%M(%L) | %m%n


#### RollingFileAppender: 限定單個文件大小,達到閥值輸出到新文件 ####
log4j.appender.ERR = org.apache.log4j.RollingFileAppender 
# 指定輸出文件路徑
log4j.appender.ERR.File = D:/log/error.log
# 指定輸出日誌級別
log4j.appender.ERR.Threshold = INFO
# 默認爲true,意味着輸出方式爲追加,反之則爲覆蓋
log4j.appender.ERR.Append = true
# 默認值是 true, 表示是否立即輸出
log4j.appender.ERR.ImmediateFlush = true
# 設置編碼方式
log4j.appender.ERR.Encoding = UTF-8
# 設置單個文件大小限制
log4j.appender.ERR.MaxFileSize = 2MB
# 設置最大備份文件記錄數
log4j.appender.ERR.MaxBackupIndex = 20
# 日誌輸出佈局
log4j.appender.ERR.layout = org.apache.log4j.PatternLayout
# 如果日誌輸出佈局爲PatternLayout 自定義級別,需要使用ConversionPattern指定輸出格式
log4j.appender.ERR.layout.ConversionPattern =RFA-[framework] [%d{yyyy-MM-dd HH:mm:ss,SSS}]-[%p] -%c -%r -%l.%M(%L) | %m%n


####測試輸出佈局:HTMLLayout ####
log4j.appender.HHT = org.apache.log4j.RollingFileAppender 
# 指定輸出文件路徑
log4j.appender.HHT.File = D:/log/log4jHtml.html
# 指定輸出日誌級別
log4j.appender.HHT.Threshold = DEBUG
# 默認爲true,意味着輸出方式爲追加,反之則爲覆蓋
log4j.appender.HHT.Append = true
# 默認值是 true, 表示是否立即輸出
log4j.appender.HHT.ImmediateFlush = true
# 設置編碼方式
log4j.appender.HHT.Encoding = UTF-8
# 設置單個文件大小限制
log4j.appender.HHT.MaxFileSize = 2MB
# 設置最大備份文件記錄數
log4j.appender.HHT.MaxBackupIndex = 20
# 日誌輸出佈局
log4j.appender.HHT.layout = org.apache.log4j.HTMLLayout

####測試輸出佈局:SimpleLayout ####
log4j.appender.SL = org.apache.log4j.RollingFileAppender 
# 指定輸出文件路徑
log4j.appender.SL.File = D:/log/log4jSL.html
# 指定輸出日誌級別
log4j.appender.SL.Threshold = INFO
# 默認爲true,意味着輸出方式爲追加,反之則爲覆蓋
log4j.appender.SL.Append = true
# 默認值是 true, 表示是否立即輸出
log4j.appender.SL.ImmediateFlush = true
# 設置編碼方式
log4j.appender.SL.Encoding = UTF-8
# 設置單個文件大小限制
log4j.appender.SL.MaxFileSize = 2MB
# 設置最大備份文件記錄數
log4j.appender.SL.MaxBackupIndex = 20
# 日誌輸出佈局
log4j.appender.SL.layout = org.apache.log4j.HTMLLayout


####測試輸出佈局:TTCCLayout ####
log4j.appender.TCC = org.apache.log4j.RollingFileAppender 
# 指定輸出文件路徑
log4j.appender.TCC.File = D:/log/log4jTCC.log
# 指定輸出日誌級別
log4j.appender.TCC.Threshold = INFO
# 默認爲true,意味着輸出方式爲追加,反之則爲覆蓋
log4j.appender.TCC.Append = true
# 默認值是 true, 表示是否立即輸出
log4j.appender.TCC.ImmediateFlush = true
# 設置編碼方式
log4j.appender.TCC.Encoding = UTF-8
# 設置單個文件大小限制
log4j.appender.TCC.MaxFileSize = 2MB
# 設置最大備份文件記錄數
log4j.appender.TCC.MaxBackupIndex = 20
# 日誌輸出佈局
log4j.appender.TCC.layout = org.apache.log4j.SimpleLayout








XML配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration  debug="true" 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="[%d{yyyy-MM-dd HH:mm:ss:SSS}] [%-5p] [method:%l]%n%m%n%n" />
        </layout>
        <!--過濾器設置輸出的級別-->
        <filter class="org.apache.log4j.varia.LevelRangeFilter">
            <!-- 設置日誌輸出的最小級別 -->
            <param name="levelMin" value="WARN" />
            <!-- 設置日誌輸出的最大級別 -->
            <param name="levelMax" value="ERROR" />
            <!-- 設置日誌輸出的xxx,默認是false -->
            <param name="AcceptOnMatch" value="true" />
        </filter>
    </appender>

    <!-- 輸出到文件: DailyRollingFileAppender-->
    <appender name="daily" class="org.apache.log4j.DailyRollingFileAppender">
        <!-- 設置日誌信息輸出文件全路徑名 -->
        <param name="File" value="D:/log/DailyRollingFileAppender.log" />
        <!-- 設置日誌每分鐘回滾一次,即產生一個新的日誌文件 -->
        <param name="DatePattern" value="'.'yyyy-MM-dd-HH-mm'.log'" />
        <!-- 附加 -->
        <param name="Append" value="true"/>
        <!-- 設置日誌輸出的樣式 -->
        <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>

    <!-- 輸出到文件: RollingFileAppender-->
    <appender name="rolling" class="org.apache.log4j.RollingFileAppender">
        <!-- 設置日誌信息輸出文件全路徑名 -->
        <param name="File" value="D:/log4j/RollingFileAppender.log" />
        <!-- 設置是否在重新啓動服務時,在原有日誌的基礎添加新日誌 -->
        <param name="Append" value="true" />
        <!-- 設置保存備份回滾日誌的最大個數 -->
        <param name="MaxBackupIndex" value="10" />
        <!-- 設置當日志文件達到此閾值的時候自動回滾,單位可以是KB,MB,GB,默認單位是KB -->
        <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>

    <!-- 根logger的設置-->
    <root>
        <level value ="INFO"/>
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="daily"/>
    </root>
</log4j:configuration>

  1. http://logging.apache.org/log4j/1.2/manual.html ↩︎

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