有没有一种方法可以使用 Log4j2 中的 RoutingAppender 基于标记来路由日志
Is there a way to Route logs based on Marker with the RoutingAppender in Log4j2
可以使用标记 filter 消息,例如:
<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
文档规定:
The pattern is evaluated against all the registered Lookups and the
result is used to select a Route
然而似乎没有 Lookup for Markers, same for LogLevel. It would be possible to add a custom MarkerValue or LogLevelValue in the ThreadContextMap 但我发现该解决方案不是很有效,它重复了已知信息。
是没有记录还是根本不可能?是否应该有一种内置的方式来访问 Lookup 中的这些值?
RoutingAppender 的文档显示了 ThreadContext 查找,但路由也可以与其他查找一起使用。一种想法是创建自定义查找。
自定义查找作为 log4j2 插件实现。为了帮助 log4j2 找到您的插件,您可以在配置文件中启用 packages="yourCustomPackage"。您的插件 class 需要位于 class 路径上,这样 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)中。所以之后就不需要再写自定义插件了。
可以使用标记 filter 消息,例如:
<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
文档规定:
The pattern is evaluated against all the registered Lookups and the result is used to select a Route
然而似乎没有 Lookup for Markers, same for LogLevel. It would be possible to add a custom MarkerValue or LogLevelValue in the ThreadContextMap 但我发现该解决方案不是很有效,它重复了已知信息。
是没有记录还是根本不可能?是否应该有一种内置的方式来访问 Lookup 中的这些值?
RoutingAppender 的文档显示了 ThreadContext 查找,但路由也可以与其他查找一起使用。一种想法是创建自定义查找。
自定义查找作为 log4j2 插件实现。为了帮助 log4j2 找到您的插件,您可以在配置文件中启用 packages="yourCustomPackage"。您的插件 class 需要位于 class 路径上,这样 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)中。所以之后就不需要再写自定义插件了。