簡體   English   中英

如何配置Log4j(1或2)以在針對Slf4j的代碼中使用自定義日志文件名

[英]How to configure Log4j (1 or 2) to use custom log file name while code against Slf4j

我知道有很多與此相關的問題,但是我找不到與我正在看的場景相匹配的問題,所以這就是問題。

當前的日志記錄設置:記錄器使用帶有Log4j 1.2綁定的Slf4j進行編碼。 DailyRollingAppender使用。

程序:處理表中數據並調用相關Web服務的多線程后端Java程序。

出現了一個新請求,要求日志文件名基於某個數據,我們稱其為match_code 這樣,每當一個線程正在處理時,說MatchA ,則該線程使用的日志文件應設置為MatchA.log

我搜索了一段時間,並了解到每當進程啟動時我都需要以編程方式配置Log4j配置,問題是我應如何更改日志文件名設置,而又不影響其他設置(例如Patterns

我願意切換到Log4j 2.x,如果這可以解決我的問題,那么到目前為止還沒有運氣來尋找樣本。

任何建議表示贊賞。 謝謝。

關於嘗試的更新

嘗試使用System.setProperty方法動態設置日志文件。 這是屬性設置:

log4j.appender.file.File=/log/${logfile.name}.log

在主類中,在其他任何內容之前添加以下兩行:

    static{
        System.setProperty("logfile.name","output");
    }

    private static Logger logger = LoggerFactory.getLogger(Engine.class);

在流程發現要處理的數據之后,添加了此權限:

System.setProperty("logfile.name",match_code+"_output");

其中match_code是數據庫中的值,例如“ MatchA”

結果是,主類DID的日志名為output.log 但是,如果我輸入數據進行測試,則日志仍將轉到output.log並且不會基於該數據創建新的日志文件。

Dunno,如果我理解您的問題:您希望將同一條日志消息轉到不同的日志文件,具體取決於要處理的數據?

如果使用LogBack,則可以通過MDC + SiftingAppender的組合來完成。 例如,在您的代碼中,您可以執行以下操作:

(以代碼形式)

MDC.put("match_code", "MatchA");
logger.debug("whatever message");  // just log it normally

(在logback.xml中)

  <appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender">
    <discriminator>
      <key>match_code</key>
      <defaultValue>unknown</defaultValue>
    </discriminator>
    <sift>
      <appender name="FILE-${match_code}" class="ch.qos.logback.core.FileAppender">
        <file>${match_code}.log</file>
        <layout class="ch.qos.logback.classic.PatternLayout">
          <pattern>%d [%thread] %level %mdc %logger{35} - %msg%n</pattern>
        </layout>
      </appender>
    </sift>
  </appender>

請注意,這里我使用LogBack作為日志記錄后端。 Log4j 1沒有正式的篩選附加程序。我有點記得Log4j 2中的類似內容。希望如果您確實堅持使用Log4j,可以將此作為您搜索的起點

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM