[英]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中添加自定義MarkerValue或LogLevelValue ,但是我發現該解決方案並不十分有效,它會復制已知信息。
它沒有記載或只是不可能? 是否應該有一種內置的方法來訪問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.