JavaWeb筆記(十二)日志


日志

日志信息根據用途與記錄內容的不同,分為調試日志、運行日志、異常日志等。

Java常用記錄日志

  • logger
  • log4j
  • log4j2
  • logback

其中除了logger使用的概率較小,因此主要介紹后面三個

日志級別

為了方便日志信息的輸出顯示,對日志內容進行了分級管理。 日志級別由高到低,共分 6 個級別:

  1. fatal(致命的)
  2. error
  3. warn
  4. info
  5. debug
  6. trace(堆棧)

為什么要對日志進行分級呢?

將日志輸出到控制台,或者寫入到文件中,這些操作都會降低程序的運行效率。但由於開發需要、便於維護等原因,要將必要的日志信息記錄,這時就需要在代碼中加入記錄日志的相關語句。假設在開發調試程序時需要記錄日志信息,等到系統上線后這些信息就沒必要記錄了,此時需要將記錄日志信息相關代碼全部刪除,這個過程費時費力。

將日志信息進行分級管理之后,便可方便的控制信息輸出內容及輸出位置,哪些信息需要輸出,哪些信息不需要輸出,只需在一個日志控制文件中稍加修改即可,不用修改代碼中的內容。即在開發調試程序時,將日志信息級別設置低一些,這樣輸出的日志信息會非常多,當系統上線之后,將日志信息級別設置的高一些,此時只有少部分日志信息被記錄。

log4j

最終版本是log4j 1.2.17的版本

jar包下載 http://mirrors.tuna.tsinghua.edu.cn/apache/logging/log4j/1.2.17/log4j-1.2.17.zip

為了控制日志的輸出,在Log4j中提供了日志輸出控制文件,該文件主要由三個部分構成:

日志信息的輸出位置:控制日志信息將要輸出的位置,是控制台還是文件等。
日志信息的輸出格式:控制日志信息的顯示格式,即以怎樣的字符串形式顯示。
日志信息的輸出級別:控制日志信息的顯示內容,即顯示哪些級別的日志信息。
有了日志輸出控制文件,代碼中只要設置好日志信息內容及其級別即可,通過控制文件
便可控制這些日志信息的輸出了。

使用log4j記錄日志

  1. 導入jar包

  2. 放入日志輸出控制文件

    在src目錄下創建log4j.properties文件,將下面內容拷貝到文件中保存。

     log4j.rootLogger=info,console
     
     #控制台附加器
     log4j.appender.console = org.apache.log4j.ConsoleAppender
     log4j.appender.console.Target = System.out
     log4j.appender.console.layout = org.apache.log4j.PatternLayout
     log4j.appender.console.layout.ConversionPattern= [%-5p][%d{yyyy-MM-dd HH:mm:ss}]%m%n
     
     #文件附加器
     log4j.appender.file = org.apache.log4j.FileAppender
     log4j.appender.file.File = f:/monkey1024/monkey.log
     log4j.appender.file.layout = org.apache.log4j.PatternLayout
     log4j.appender.file.layout.ConversionPattern= [%-5p][%d{yyyy-MM-dd HH:mm:ss}]%m%n
     
     #滾動文件附加器
     log4j.appender.rollfile = org.apache.log4j.RollingFileAppender
     log4j.appender.rollfile.File = f:/monkey1024/monkey.log
     log4j.appender.rollfile.MaxFileSize = 10KB
     log4j.appender.rollfile.layout = org.apache.log4j.PatternLayout
     log4j.appender.rollfile.layout.ConversionPattern= [%-5p][%d{yyyy-MM-dd HH:mm:ss}]%m%n
    

3.代碼中實現日志記錄

//創建記錄日志的對象
Logger log = Logger.getLogger(Log4jTest01.class);

//下面語句會根據log4j.properties中的日志級別輸出
log.debug("debug信息");
log.info("info信息");
log.warn("warn信息");
log.error("error信息");

上面代碼中的日志輸出語句,會根據 log4j.properties 文件中日志級別的設置進行輸出,會輸出到指定位置。 其輸出結果是:輸出指定級別及其更高級別的信息。如指定 info 級別,則會輸出 fatal、 error、warn、info 級別的信息。就本例而言,上面代碼不會執行 debug()方法。

log4j.properties文件分析

日志屬性文件 log4j.properties 是專門用於控制日志輸出的。其主要進行三方面控制:

  • 輸出位置:控制日志將要輸出的位置,是控制台還是文件等
  • 輸出布局:控制日志信息的顯示形式
  • 輸出級別:控制要輸出的日志級別

日志屬性文件由下面兩個對象組成:

  • 根日志,即為 Java 代碼中的日志記錄器,可以控制日志輸出級別與添加附加器
  • 附加器,可以設置輸出布局、文件位置、文件大小等內容

定義日志附加器 appender

附加器的本質是一個接口,其定義語法為:

log4j.appender.appenderName =  輸出位置

appenderName 為自定義名稱。
輸出位置為log4j 指定的類型,是定義好的一些 appender 接口的實現類。打開 log4j解壓目錄下的 site文件夾下的 index.html,在打開的頁面中點擊 JavaDoc,即可可看到 log4j 的 API

在log4j.properties中編寫如下配置:

log4j.appender.console = org.apache.log4j.ConsoleAppender

該配置的appender名字為console,類型是org.apache.log4j.ConsoleAppender即將日志輸出到控制台。

常用的附加器實現類

  • org.apache.log4j.ConsoleAppender:日志輸出到控制台
  • org.apache.log4j.FileAppender:日志輸出到文件
  • org.apache.log4j.RollingFileAppender:當日志文件大小到達指定尺寸的時候將產生一個新的日志文件
  • org.apache.log4j.DailyRollingFileAppender:每天產生一個日志文件

通過上面附加器可以指定日志輸出的位置。

修飾日志附加器

修飾日志附加器,是為定義好的附加器添加一些屬性,以控制到指定位置的輸出。不同的附加器,其修飾屬性不同。

  • 控制台附加器

      log4j.appender.console = org.apache.log4j.ConsoleAppender
      log4j.appender.console.Target = System.out
      log4j.appender.console.layout = org.apache.log4j.PatternLayout
      log4j.appender.console.layout.ConversionPattern= [%-5p][%d{yyyy-MM-dd HH:mm:ss}]%m%n
    

    Target:控制輸出到控制台的使用目標。其值為 System.out 或 Sytem.err。它們的區別是,
    System.out 是以黑色字體顯示到控制台,而 System.err 則是以紅色字體顯示。

  • 文件附加器

      log4j.appender.file = org.apache.log4j.FileAppender
      log4j.appender.file.File = f:/monkey1024/monkey.log
      log4j.appender.file.layout = org.apache.log4j.PatternLayout
      log4j.appender.file.layout.ConversionPattern= [%-5p][%d{yyyy-MM-dd HH:mm:ss}]%m%n
    

    log4j.appender.file.File:日志要輸出的文件位置及文件名稱。

  • 滾動文件附加器

      log4j.appender.rollfile = org.apache.log4j.RollingFileAppender
      log4j.appender.rollfile.File = f:/monkey1024/monkey.log
      log4j.appender.rollfile.MaxFileSize = 10KB
      log4j.appender.rollfile.layout = org.apache.log4j.PatternLayout
      log4j.appender.rollfile.layout.ConversionPattern= [%-5p][%d{yyyy-MM-dd HH:mm:ss}]%m%n
    

    MaxFileSize:用於指定日志文件的最大值。若文件超過指定值,將自動產生另一個日志文件。

  • 常用layout布局

    在上面的配置文件中都出現了layout,該項可以配置日志的布局類型,常用的如下:

    • org.apache.log4j.HTMLLayout:網頁布局,以 HTML 表格形式布局
    • org.apache.log4j.SimpleLayout:簡單布局,包含日志信息的級別和信息字符串
    • org.apache.log4j.PatternLayout:匹配器布局,可以靈活地指定布局模式。其主要是通過設置 PatternLayout 的 - --和 - ConversionPattern 屬性值來控制具體輸出格式的。ConversionPattern 的值中有很多控制字符,這些字符的意義可以百度:ConversionPattern取值說明。
  • 配置根Logger

    配置 rootLogger,以便於代碼加載來控制日志的輸出。其語法為:

      log4j.rootLogger = [ level ] , appenderName1,appenderName2, …
    

    其中,level 是日志記錄的優先級,分為 OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL。建議只使用四個級別,優先級從高到低分別是 ERROR、WARN、INFO、DEBUG。OFF 為關閉日志功能。

    低級別的可以顯示高級別的,但高級別的不能顯示低級別的。所以,級別越高,將來顯示的信息就越少。

    例如:

      log4j.rootLogger=info,console,file
      
      #控制台附加器
      log4j.appender.console = org.apache.log4j.ConsoleAppender
      log4j.appender.console.Target = System.out
      log4j.appender.console.layout = org.apache.log4j.PatternLayout
      log4j.appender.console.layout.ConversionPattern= [%-5p][%d{yyyy-MM-dd HH:mm:ss}]%m%n
      
      #文件附加器
      log4j.appender.file = org.apache.log4j.FileAppender
      log4j.appender.file.File = f:/monkey1024/monkey.log
      log4j.appender.file.layout = org.apache.log4j.PatternLayout
      log4j.appender.file.layout.ConversionPattern= [%-5p][%d{yyyy-MM-dd HH:mm:ss}]%m%n
    

log4j2

下載jar包

http://logging.apache.org/log4j/2.x/download.html

導入

  • log4j-api-2.9.1.jar
  • log4j-core-2.9.1.jar

添加日志輸出控制文件

在log4j2中的配置文件是 XML 格式的文件,不再支持properties 文件。在src目錄下創建log4j2.xml文件,里面寫上下面內容。

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="OFF">
    <Appenders>
        <!-- console -->
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
        </Console>
        <!-- file -->
        <File name="file" fileName="log/output.log" append="true">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
        </File>
        <!-- rollingFile -->
        <RollingFile name="roolingFlie" fileName="logs/app.log"
            filePattern="logs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
            <SizeBasedTriggeringPolicy size="1kb" />
        </RollingFile>
    </Appenders>
    <Loggers>
        <Root level="info">
            <AppenderRef ref="Console" />
        </Root>
    </Loggers>
</Configuration>

編寫日志記錄代碼

導包的時候注意Logger 與 LogManager 都是 org.apache.logging.log4j 包中的類,而不是org.apache.log4j包中的。另外在創建記錄日志對象時,使用的是LogManager類

//創建記錄日志的對象
Logger log = LogManager.getLogger(Log4j2Test01.class);

//下面語句會根據log4j2.xml中的日志級別輸出
log.debug("debug信息");
log.info("info信息");
log.warn("warn信息");
log.error("error信息");

上面代碼會將info以上級別的日志信息輸出到控制台中。

日志輸出控制文件分析

若開發者沒有設置 log4j2.xml,則系統會使用默認的日志配置:只會輸出到控制台 error 級別的信息。

configuration標簽

configuration標簽的 status 屬性用於設置 Log4j2 自身運行的日志顯示級別,一般為OFF,不顯示,也可以設置為 ERROR、DEBUG 等其它級別。

Console標簽

Console標簽的 target 屬性用於設置輸出的目標形式,其值一般為:SYSTEM_OUT 或 SYSTEM_ERR

File標簽

File標簽的 fileName 屬性用於設置文件的文件保存路徑及文件名。如本例的意思是,日志文件名為 output.log,將其存放在當前項目的根目錄下的 log 子目錄中,如果log目錄不存在會自動創建。

append 屬性用於設置是否以追加方式將日志寫入文件中。

RollingFile標簽

fileName 指定存放目錄及第一個日志文件名。filePattern 指定新創建的日志文件的文件名。本例還會對文件進行壓縮。

SizeBasedTriggeringPolicy子標簽用於指定每一個日志文件最大文件大小。當達到這個指定值后,會自動再新建一個日志文件。

loggers標簽

用於配置根Logger 對象,用來指定所使用的日志記錄器,及顯示的級別。
其子標簽root用於指定所使用的日志記錄器。該子標簽的屬性 level 用於指定顯示級別,主要是通過root的子標簽appender-ref來引用appenders中定義好的記錄器。
需要注意的是,只要在appenders中定義了File、 RollingFile等,且在其中指定了日志存放的目錄,無論是否在appender-ref中引用,這些目錄都會自動創建。

日志規范slf4j

將log4j改成slf4j

  1. 導入相關jar包

  2. 加入日志輸出控制文件log4j.properties文件

    將之前寫的配置文件拷貝過來即可

  3. 代碼中實現日志記錄

    通過LoggerFactory獲取創建記錄的日志對象,導包時需要導入org.slf4j下的類

     //創建記錄日志的對象
     Logger log = LoggerFactory.getLogger(Slf4jTest01.class);
    
     log.debug("debug信息");
     log.info("info信息");
     log.warn("warn信息");
     log.error("error信息");
    

將log4j2改成slf4j

在slf4j的1.7.25(含)版本之前,沒有提供log4j2相關的jar,不過在log4j2中提供了相關的jar包。

  1. 導入相關jar包

  2. 添加日志輸出控制文件log4j2.xml
    將之前寫過的拷貝過來

  3. 編寫日志記錄代碼
    通過LoggerFactory獲取創建記錄的日志對象,導包時需要導入org.slf4j下的類

     //創建記錄日志的對象
     Logger log = LoggerFactory.getLogger(Slf4jTest02.class);
    
     log.debug("debug信息");
     log.info("info信息");
     log.warn("warn信息");
     log.error("error信息");
    

logback

logback是log4j作者的開發的又一個記錄日志的開源技術,相比於log4j而言,logback在很多方面都有很大的提升。logback分為三個模塊:logback-core, logback-classic和logback-access。其中 logback-core是另外兩個的基礎模塊,logback-classic是log4j的升級版本,同時也實現了SLF4j的API,因此可以方便的使用SLF4j,還有一點要說的就是SLF4j和logback的作者是同一個人,所以說logback是原生的實現了SLF4j。logback-access集成了一些servlet容器,比如tomcat

  1. 下載jar包

    https://logback.qos.ch/download.html

    下載完畢解壓后,需要將下面三個jar包導入到項目中:

    • logback-access-1.2.3.jar
    • logback-classic-1.2.3.jar
    • logback-core-1.2.3.jar

    如果要是用slf4j的話需要下載slf4j的jar包,因為slf4j和logback無縫集成,所以這里不用下載slf4j連接logback的jar包了。

  2. 添加日志輸出控制文件

    在src目錄下創建一個logback.xml文件,里面寫上下面內容:

     <statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" />
    
     <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
         <encoder>
             <pattern>%d{HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n
             </pattern>
         </encoder>
     </appender>
    
    
     <appender name="FILE" class="ch.qos.logback.core.FileAppender">
         <file>file.log</file>
         <append>true</append>
         <encoder>
             <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n
             </pattern>
         </encoder>
     </appender>
    
     <appender name="ROLLINGFILE"
         class="ch.qos.logback.core.rolling.RollingFileAppender">
         <file>mylog.txt</file>
         <rollingPolicy
             class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
             <!-- rollover daily -->
             <fileNamePattern>mylog-%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern>
             <!-- 每個日志文件大小不超過100MB,在日志文件總大小不超過20GB的情況下保存60天, -->
             <maxFileSize>100MB</maxFileSize>
             <maxHistory>60</maxHistory>
             <totalSizeCap>20GB</totalSizeCap>
         </rollingPolicy>
         <encoder>
             <pattern>%d{HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n
             </pattern>
         </encoder>
     </appender>
    
     <root level="INFO">
         <appender-ref ref="STDOUT" />
     </root>
    
  3. 編寫日志記錄代碼

    因為logback原生就實現了SLF4j的API,所以這里使用SLF4j。

     // 創建記錄日志的對象
     Logger log = LoggerFactory.getLogger(Slf4jTest01.class);
    
     log.debug("debug信息");
     log.info("info信息");
     log.warn("warn信息");
     log.error("error信息");
    

日志輸出控制文件分析

configuration

scan=”true”表示logback會自動加載修改后的xml配置文件,默認情況下,每隔一分鍾掃描一次,可以通過scanPeriod=”3 seconds”設置為每3秒掃描一次。

DEBUG=”true”該配置並不是設置日志級別為debug,而是會打印logback內部運行的一些信息,可以查看logback的運行狀態,默認是false。

statusListener

可以通過設置監聽器來監聽logback內部運行的信息和狀態。

appender

可以編寫多個appender來實現不同的日志輸出方式。

其中name屬性用於指定appender的名稱,即給appender命名
class屬性用於指定日志的輸出方式。

  • ch.qos.logback.core.ConsoleAppender:將日志信息輸出到控制台
  • ch.qos.logback.core.FileAppender:日志輸出到文件
  • ch.qos.logback.core.rolling.RollingFileAppender:當日志文件大小到達指定尺寸的時候將產生一個新的日志文件。

encoder

在logback0.9.19版本中引入了encoder來替代layout。該標簽默認使用PatternLayoutEncoder,其中pattern標簽可以設置日志的輸出格式。

file

該標簽在appender標簽下,用於指定輸出日志的文件名。

append

該標簽在appender標簽下,是否以追加的方式寫出到日志文件中。

rollingPolicy

該標簽在appender標簽下,用來指定產生新文件的方式。
常用的有SizeAndTimeBasedRollingPolicy(根據日期和文件大小產生新的文件)和FixedWindowRollingPolicy(根據文件大小產生新的文件)

maxFileSize

該標簽在rollingPolicy下,當文件大小超過該標簽中指定的大小時會創建新的文件,例如:5kb,5MB,5GB,默認單位是字節b,如果只寫500的話,則表示500b

maxHistory

該標簽在rollingPolicy下,用來指定日志保存的天數。

totalSizeCap

該標簽在rollingPolicy下,保存日志的總大小,通常寫在maxHistory的后面。

level

該標簽在root下,用來表示日志的打印級別

appender-ref

該標簽在root下,用來添加appender。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM