2015-05-07 23 views
1

有可能filter消息:有沒有一種方法來路由原木基於標記與RoutingAppender在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 

的文件規定:

該模式對所有已註冊的查找評估和 結果來選擇路由

然而,標記似乎沒有Lookup,與LogLevel相同。可以在ThreadContextMap中添加自定義的MarkerValueLogLevelValue,但我不認爲該解決方案真的有效,它會複製已知信息。

它沒有記錄或不可能嗎?在Lookup中是否應該有內置的方式來訪問這些值?

回答

2

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)。

UPDATE:據他們說,它應該內置在下一個版本(2.4)。所以沒有必要編寫自定義插件。

相關問題