簡體   English   中英

有沒有一種方法可以在Log4j2中使用RoutingAppender來基於Marker路由日志

[英]Is there a way to Route logs based on Marker with the RoutingAppender in Log4j2

可以使用標記來過濾消息,例如:

      <MarkerFilter marker="FLOW" onMatch="ACCEPT" onMismatch="DENY"/>

但是,我正在嘗試使用RoutingAppender基於標記路由消息。 我不想在多個Appender中多次過濾相同的參數。 這是我的配置示例(yaml):

Routing:
  name: ROUTING_APPENDER
  Routes:
    pattern: "$${ctx:marker}" #<-- How to use Marker here?
    Route:
      - key: MyRoutingKey
        ref: MyCustomAppender

該文件規定:

針對所有已注冊的查找評估模式,結果用於選擇路線

但是,似乎沒有對標記的查找 ,對LogLevel也是如此。 可以在ThreadContextMap中添加自定義MarkerValueLogLevelValue ,但是我發現該解決方案並不十分有效,它會復制已知信息。

它沒有記載或只是不可能? 是否應該有一種內置的方法來訪問Lookup中的那些值?

RoutingAppender的文檔顯示了ThreadContext查找,但是路由也可以與其他查找一起使用。 一種想法是創建自定義查找。

自定義查找被實現為log4j2插件。 為了幫助log4j2找到您的插件,您可以在配置文件中啟用packages =“ yourCustomPackage” 您的插件類必須位於類路徑上,以便log4j可以找到它。 這是自定義查找的插件代碼:

import org.apache.logging.log4j.Marker;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.config.plugins.Plugin;
import org.apache.logging.log4j.core.lookup.StrLookup;

@Plugin(name = "marker", category = "Lookup")
public class MarkerLookup implements StrLookup {

    public String lookup(String key) {
        return null
    }

    public String lookup(LogEvent event, String key) {
        final Marker marker = event.getMarker();
        return marker == null ? null : marker.getName();
    }
}

並在配置文件中:

Routing:
  name: ROUTING_APPENDER
  Routes:
    pattern: "$${marker:}"
    Route:
    - key: PERFORMANCE
      ref: PERFORMANCE_APPENDER
    - key: PAYLOAD
      ref: PAYLOAD_APPENDER
    - key: FATAL
      ref: FATAL_APPENDER
    - ref: APPLICATION_APPENDER #Default route

感謝Log4j2開發人員( https://issues.apache.org/jira/browse/LOG4J2-1015 )。

更新 :據他們說,它應該內置在下一版本(2.4)中。 因此,此后無需編寫自定義插件。

暫無
暫無

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

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