簡體   English   中英

PatternLayout不替換Java中ThreadContext的值

[英]PatternLayout not substituting values from ThreadContext in Java

我打算使用%X (和%d)占位符在Java代碼中創建一個PatternLayout對象,該對象將從ThreadContext中替換其值。

private PatternLayout patternLayout = PatternLayout.newBuilder()
                                                   .withPattern("op1=%X{op1}|op2=%X{op2}|timestamp=%d{HH:mm:ss.SSS}")
                                                   .build();

我還實現了Log4J Message接口:

private final PatternLayout pattern;

MyLoggingMessage(final PatternLayout pattern) {
    this.pattern = pattern;
}

@Override
public String getFormattedMessage() {

    // I have also tried return pattern.getContentFormat();
    return pattern.toString();
}

但是,當將其記錄在Graylog中時,這些值尚未被替換掉,並保持為op1=%X{op1}|op2=%X{op2}|timestamp=%d{HH:mm:ss.SSS} 但是,如果我在追加程序中使用相同模式的XML實現,...

<PatternLayout pattern="op1=%X{op1}|op2=%X{op2}|timestamp=%d{HH:mm:ss.SSS}" />

這一切都被取代了。 如何獲取log4j來評估Java模式? 從我所看到的,這兩種方法都只是設置pattern字段。

所以這對我有用:

private final StringMap params;

MyLoggingMessage(final PatternLayout pattern) {
    this.pattern = pattern;
    this.params = (StringMap) ThreadContext.getContext();
}

@Override
public String getFormattedMessage() {

    LogEvent logEvent = Log4jLogEvent.newBuilder()
                                     .setContextData(params)
                                     .build();

    return pattern.toSerializable(logEvent);
}

暫無
暫無

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

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