【发布时间】:2014-07-23 19:03:40
【问题描述】:
我正在尝试为 log4j 2.0 创建自定义模式转换器,但在让我的 log4j 配置识别模式时遇到问题。这是自定义转换器:
package com.test.log4j.plugins;
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.pattern.ConverterKeys;
import org.apache.logging.log4j.core.pattern.LogEventPatternConverter;
@Plugin(name="MarkerNamePatternConverter", category="Converter")
@ConverterKeys({"markername"})
public class MarkerNamePatternConverter extends LogEventPatternConverter {
public static MarkerNamePatternConverter newInstance(final String[] options) {
return new MarkerNamePatternConverter("markername", "markername");
}
protected MarkerNamePatternConverter(String name, String style) {
super(name, style);
}
@Override
public void format(LogEvent event, StringBuilder toAppendTo) {
Marker marker = event.getMarker();
if (marker != null) {
// MarkerPatternConverter appends Marker.toString()
// which includes the parents of the marker. We just
// want the marker's name
toAppendTo.append(marker.getName());
}
}
}
这是我的 log4j 配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="trace" packages="com.test.log4j.plugins">
<Appenders>
<Console name="console" target="SYSTEM_OUT">
<PatternLayout pattern=" %-6level %markername %d{YYYY-MM-dd HH:mm:ss} %msg%n"/>
</Console>
</Appenders>
<Loggers>
<Root level="debug">
<AppenderRef ref="console"/>
</Root>
</Loggers>
</Configuration>
请注意,我在配置中包含了包含自定义转换器的包,缺少该包似乎是使用自定义插件时出现问题的常见原因。
执行测试代码时,配置状态输出并不表示插件已加载或找到,log4j 将 %markername 视为“%marker”后跟“name”的转换模式。例如,
Marker marker = MarkerManager.getMarker("TEST");
log.info(marker, "test message");
产生以下输出:
INFO TESTname 2014-07-23 14:47:57 test message
我尝试将转换键更改为不以标准转换模式开头的值,例如“fmarker”,当执行 log4j 时会产生以下错误:
2014-07-23 14:44:55,814 ERROR Unrecognized format specifier [fmarker]
2014-07-23 14:44:55,816 ERROR Unrecognized conversion specifier [fmarker] starting at position 18 in conversion pattern.
INFO %fmarker 2014-07-23 14:44:55 test message
文档表明插件是在构建时而不是运行时收集的,但我没有发现任何表明我需要做一些特定的事情来找到我的自定义转换器,而不是:
- 使用@Plugin 和@ConverterKeys 对其进行注释
- 将插件的类别指定为“转换器”
- 包含一个静态的“newInstance(String[])”方法
- 实现“格式”方法
- 使用配置的“packages”参数指定插件包。
有一个 Maven 插件的文档,但我的简单测试只是在 Eclipse 中开发的一个基本 Java 项目。
关于我做错了什么有什么想法吗?
【问题讨论】:
标签: java logging plugins converter log4j2