天天看點

【轉載】logback自定義目錄及輸出格式

轉載自 https://blog.csdn.net/qq_39762975/article/details/102741912

上一篇文章 回顧 中,我們介紹了一種方法自定義日志輸出格式:

  1. 首先,自定義格式轉換器,也就是繼承 ClassicConverter,實作他的 convert 方法;
  2. 然後,在 logback.xml 中配置

    <conversionRule>

    标簽,定義其屬性 conversionWord 和 converterClass;
  3. 最後,在日志輸出格式中,通過

    %ip

    來動态擷取IP值(假設 conversionWord="ip");

但是,這個

%ip

卻不能用來定義檔案路徑,接下來介紹另一種方式,既可以自定義日志目錄路徑,又可以自定義日志輸出格式。

一、解決方案

1.1 PropertyDefinerBase實作類

我們建立一個類

com.xxx.utils.IPConverterConfig

并繼承

ch.qos.logback.core.PropertyDefinerBase

,内容如下:

package com.xxx.utils;

import ch.qos.logback.core.PropertyDefinerBase;

import java.net.InetAddress;
import java.net.UnknownHostException;

public class NodeIpProperty extends PropertyDefinerBase  {
  private static String nodeIP;
  static {
    try {
      nodeIP = InetAddress.getLocalHost().getHostAddress();
    } catch (UnknownHostException e) {
      e.printStackTrace();
      nodeIP = "unknown";
    }
  }

  @Override
  public String getPropertyValue() {
    return NodeIpProperty.nodeIP;
  }
}
           

1.2 <define>标簽

logback.xml

中添加如下配置,該配置位于

<configuration>

标簽下

<define name="NODE_IP" class="com.xxx.utils.NodeIpProperty"/>
           

1.3 ${屬性名}

繼續在

logback.xml

中使用 ${NODE_IP} 動态擷取屬性值:

【轉載】logback自定義目錄及輸出格式

二、測試結果

如果是 Windows 平台,如果你的項目代碼在 F: 盤,那麼你的日志就會在

F:\opt\192.168.137.1\logs

【轉載】logback自定義目錄及輸出格式

如果是 Linux 平台,日志就在

/opt/192.168.137.1/logs

檔案夾;

列印出的日志形如:

2022-01-12 15:38:40.621 [192.168.137.1] INFO [main] Main Hello World!
           

三、完整的 logback.xml

logback.xml

中用

${NODE_IP}

來表示該變量:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <define name="NODE_IP" class="com.xxx.utils.NodeIpProperty"/>
  <property name="LOG_PATH" value="/opt/${NODE_IP}/logs" />

  <!-- 輸出日志到檔案,可選擇按照時間與每個檔案大小進行滾動 -->
  <appender name="FILE"
            class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${LOG_PATH}/biz.log</file>
    <rollingPolicy
            class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
      <!-- rollover daily -->
      <fileNamePattern>/opt/app/logs/logback/biz-%d{yyyy-MM-dd_HH}.%i.txt</fileNamePattern>
      <!-- 每個檔案最大100MB,即在機關時間(例如一個小時)内,可能會産生多個檔案,各檔案以1、2、3…阿拉伯數字來标示 -->
      <maxFileSize>100MB</maxFileSize>
      <!-- 保留60天(或小時,根據fileNamePattern來決定機關)的曆史日志 -->
      <maxHistory>60</maxHistory>
      <!-- 所有歸檔檔案(不包括目前檔案)的總大小不超過1GB -->
      <totalSizeCap>1GB</totalSizeCap>
    </rollingPolicy>
    <encoder>
        <pattern>%date{yyyy-MM-dd HH:mm:ss.SSS} [${NODE_IP}] %level [%thread] %logger{36} %msg%n</pattern>
    </encoder>
  </appender>
  <!--将上面配置的“FILE” appender包裝成異步方式來提高性能,但是在高并發寫日志請求的情況下預設會丢棄低級别日志,當然也可以選擇配置不丢棄日志,但業務線程阻塞,注意隻有logback-classic
  1.0.4+才支援AsyncAppender -->
  <appender name="ASYNC_FILE" class="ch.qos.logback.classic.AsyncAppender">
    <!-- 注意一個AsyncAppender隻能引用一個appender,不能引用多個 -->
    <appender-ref ref="FILE" />
    <!-- 隊列大小(整型,預設值為256,相當于最大可以同時緩存256個寫日志請求到記憶體),值越大,高并發寫日志請求的情況下越能提升程式性能,但同時也會占用更多的堆記憶體。建議結合壓測來調整合适的隊列大小 -->
    <queueSize>256</queueSize>
    <!-- 門檻值(整型,預設值為隊列大小queueSize的20%)。預設當隊列的剩餘空間小于此門檻值時, 則會丢棄TRACE、DEBUG、INFO級别的日志,保留WARN、ERROR級别的日志
    。如果設定為0,表示不丢棄日志,但當隊列滿時,業務線程(不是寫日志的異步線程)會阻塞 -->
    <discardingThreshold>0</discardingThreshold>
  </appender>

  <root level="INFO">
    <appender-ref ref="ASYNC_FILE" />
  </root>
</configuration>