Dan*_*tte 3 java configuration logging log4j log4j2
我正在尝试在 Log4j2 中编写我自己的 RewritePolicy。该文件指出:
RewritePolicy 是一个接口,它允许实现在传递给 Appender 之前检查并可能修改 LogEvent。RewritePolicy 声明了一个必须实现的名为 rewrite 的方法。该方法通过 LogEvent 传递,可以返回相同的事件或创建一个新的事件。
这是我的java类:
public final class MarkerInjectorRewritePolicy implements RewritePolicy {
@Override
public LogEvent rewrite(final LogEvent event) {
final Marker marker = event.getMarker();
if (marker == null)
return event;
// If there's a Marker, add it to the ThreadContextMap so the RoutingAppender can properly routes log messages
event.getContextMap().put("_marker", marker.getName());
return event;
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的yaml 配置文件:
Rewrite:
name: REWRITE_APPENDER
AppenderRef:
ref: ROUTING_APPENDER
PropertiesRewritePolicy:
Property:
- name: foo
value: bar
Run Code Online (Sandbox Code Playgroud)
但是我不知道如何将它注入到我的配置文件中。我怎样才能让它在运行时工作?
您的自定义重写策略应编码为 log4j2 插件。这使您能够在 RewriteAppender 中配置自定义 RewritePolicy。
@Plugin(name = "InjectMarkerPolicy", category = "Core",
elementType = "rewritePolicy", printObject = true)
public final class MarkerInjectorRewritePolicy implements RewritePolicy {
@Override
public LogEvent rewrite(final LogEvent event) {
final Marker marker = event.getMarker();
if (marker == null)
return event;
// If there's a Marker, add it to the ThreadContextMap
// so the RoutingAppender can properly routes log messages
// event's context map is immutable, so need to make a copy...
Map<String, String> mdc = new HashMap<>(event.getContextMap());
mdc.put("_marker", marker.getName());
LogEvent result = new Log4jLogEvent(event.getLoggerName(), event.getMarker(),
event.getLoggerFqcn(), event.getLevel(), event.getMessage(),
event.getThrown(), mdc, event.getContextStack(),
event.getThreadName(), event.getSource(), event.getTimeMillis());
return result;
}
}
Run Code Online (Sandbox Code Playgroud)
示例配置(TODO:为包属性设置正确的值):
<Configuration status="trace" packages="my.rewritepolicy.plugin.package">
<Appenders>
<Console name="STDOUT">
<PatternLayout pattern="[%-5level] %c{1.} %m%n"/>
</Console>
<Rewrite name="Rewrite">
<InjectMarkerPolicy />
<AppenderRef ref="STDOUT"/>
</Rewrite>
</Appenders>
<Loggers>
<Root level="trace">
<AppenderRef ref="Rewrite"/>
</Root>
</Loggers>
</Configuration>
Run Code Online (Sandbox Code Playgroud)
不要忘记插件的工厂方法,否则它将无法启动:
@PluginFactory
public static MarkerInjectorRewritePolicy createPolicy() {
return new MarkerInjectorRewritePolicy();
}
Run Code Online (Sandbox Code Playgroud)
这是我的 github 帐户上的一个工作示例:https : //github.com/sercasti/Log4j-RewriteAppender/
| 归档时间: |
|
| 查看次数: |
2884 次 |
| 最近记录: |