java 中使用logback日志,並實現日志按天分類壓縮保存。


以maven項目作為構建工具為例,首先引入使用logback需要的3個依賴,需要注意使用logback是需要引入slf4j-api的,因為logback是基於slf4j的

<!--logback-->
<dependency>
  <groupId>ch.qos.logback</groupId>
  <artifactId>logback-core</artifactId>
  <version>1.2.3</version>
</dependency>
<dependency>
  <groupId>ch.qos.logback</groupId>
  <artifactId>logback-classic</artifactId>
  <version>1.2.3</version>
</dependency>
<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-api</artifactId>
  <version>1.7.25</version>
</dependency>

引入依賴之后下面,我們可以在classpath下創建logback.xml文件,並按需要進行相應的配置。

下面的配置案例中實現的是按照每天將debug info error的日志進行壓縮,並分別存儲到對應的文件夾下

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">


    <!-- 日志級別
    trace<debug<info<warn<error
    若定義的日志級別為info,則不會打印出 trace和debug的相關日志。
     -->

    <!-- 定義全局參數常量 -->
    <property name="log.level" value="debug"/>
    <property name="log.maxHistory" value="30"/><!-- 30表示30個 -->
    <!-- 日志的存放位置 -->                    <!--catalina.base表示tomcat的根路徑  -->
    <property name="log.filePath" value="${catalina.base}/logs/webapps"/>
    <!-- 日志的展現格式 -->
    <property name="log.pattern" value="%d{yyyy-MM-dd : HH:mm:ss.SSS}[%thread]%-5level%logger{50}-%msg%n"/>

    <!-- 定義appender (日志的輸出和存放位置等). -->
    <!-- 控制台設置 -->
    <appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${log.pattern}</pattern>  <!-- 控制台日志輸出格式 -->
        </encoder>
    </appender>

    <!-- DEBUG -->
    <appender name="debugAppender" class="ch.qos.logback.core.rolling.RollingFileAppender"><!-- 日志文件會滾動 -->
        <!-- 文件路徑 -->
        <file>${log.filePath}/debug.log</file><!-- 當前的日志文件存放路徑 -->
        <!-- 日志滾動策略 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 歷史日志文件的存放路徑和名稱 -->
            <fileNamePattern>${log.filePath}/debug/debug.%d{yyyy-MM-dd}.log.gz</fileNamePattern>
            <!-- 日志文件最大的保存歷史 數量-->
            <maxHistory>${log.maxHistory}</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${log.pattern}</pattern>  <!-- 日志文件中日志的格式 -->
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>DEBUG</level>
            <onMatch>ACCEPT</onMatch>  <!-- 用過濾器,只接受DEBUG級別的日志信息,其余全部過濾掉 -->
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- INFO -->
    <appender name="infoAppender" class="ch.qos.logback.core.rolling.RollingFileAppender"><!-- 日志文件會滾動 -->
        <!-- 文件路徑 -->
        <file>${log.filePath}/info.log</file><!-- 當前的日志文件存放路徑 -->
        <!-- 日志滾動策略 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 歷史日志文件的存放路徑和名稱 -->
            <fileNamePattern>${log.filePath}/info/info.%d{yyyy-MM-dd}.log.gz</fileNamePattern>
            <!-- 日志文件最大的保存歷史 數量-->
            <maxHistory>${log.maxHistory}</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${log.pattern}</pattern>  <!-- 日志文件中日志的格式 -->
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>  <!-- 用過濾器,只接受INFO級別的日志信息,其余全部過濾掉 -->
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- ERROR-->
    <appender name="errorAppender" class="ch.qos.logback.core.rolling.RollingFileAppender"><!-- 日志文件會滾動 -->
        <!-- 文件路徑 -->
        <file>${log.filePath}/error.log</file><!-- 當前的日志文件存放路徑 -->
        <!-- 日志滾動策略 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- TimeBased默認是一天更新一次 -->
            <!-- 歷史日志文件的存放路徑和名稱 -->
            <fileNamePattern>${log.filePath}/error/error.%d{yyyy-MM-dd}.log.gz</fileNamePattern>
            <!-- 日志文件最大的保存歷史 數量-->
            <maxHistory>${log.maxHistory}</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${log.pattern}</pattern>  <!-- 日志文件中日志的格式 -->
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>  <!-- 用過濾器,只接受ERROR級別的日志信息,其余全部過濾掉 -->
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- logger標簽用於和appender進行綁定,並告訴logback哪些包(name屬性)的日志信息需要記錄 -->
    <!--logger將會繼承root標簽,在加上additivity="true"的屬性后 root標簽中的level將會被logger的level覆蓋-->
  
  <!--
    additivity
    它是 子Logger 是否繼承 父Logger(這里為root) 的 輸出源(appender)的標志位。
    具體說,默認情況下子Logger會繼承父Logger的appender,也就是說子Logger會在父Logger的appender里輸出。
    若是additivity設為false,則子Logger只會在自己的appender里輸出,而不會在父Logger的appender里輸出。
    子Logger繼承父Logger后,level以子logger配置的level為准
  -->
<logger name="com.me" level="${log.level}" additivity="true">
  <!-- level表示只記錄哪一個級別以上的日志 -->
  <!-- 與appender進行綁定 -->
  <appender-ref ref="debugAppender"/>
  <appender-ref ref="infoAppender"/>
  <appender-ref ref="errorAppender"/>
</logger>

<root level="info">
  <appender-ref ref="consoleAppender"/>
</root>

</configuration>

我們來看一下效果:

即時產生的日志我們會分類存放到 tomcat/logs/webapps(該路徑在log.filePath中進行了配置)下面

等到第二天(與我們的日志rolling策略有關,我們只以天為單位),會生成三個文件夾,文件夾中存放着被壓縮后的日志文件

 


免責聲明!

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



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