我正在使用pax-logging-api和pax-logging-log4j2从OSGi捆绑包中进行日志记录。我想利用Log4J2的StructuredDataMessage(使用EventLogger)将一些消息写入数据库。但是,使用Pax日志记录时,我无法从附加程序读取我放入StructuredDataMessage中的值。
以下可直接使用Log4J2库在非OSGi项目中工作:
log4j2.properties:
appender.console.type = Console
appender.console.name = STDOUT
appender.console.layout.type = PatternLayout
appender.console.layout.pattern = %m%n
appender.event.type = Console
appender.event.name = event
appender.event.layout.type = PatternLayout
appender.event.layout.pattern = %marker ${sd:id} ${sd:testKey} %n %m%n
rootLogger.level = debug
rootLogger.appenderRef.console.ref = STDOUT
logger.event.name = EventLogger
logger.event.level = debug
logger.event.appenderRef.console.ref = event
logger.event.additivity = false
Test.java:
public class Test {
private static final Logger LOGGER = LogManager.getLogger(Test.class);
public static void main(String[] args) {
StructuredDataMessage msg = new StructuredDataMessage("1","message","event");
msg.put("testKey","testvalue");
LOGGER.info(msg);
EventLogger.logEvent(msg);
}
}
输出:
1 testvalue event [1 testKey="testvalue"] message
EVENT 1 testvalue
event [1 testKey="testvalue"] message
请注意,event
附加程序已正确地从StructuredDataMessage解引用了sd
键。
但是,以下在带有pax日志记录的OSGi中不起作用:
org.ops4j.pax.logging.cfg:
log4j2.appender.console.type = Console
log4j2.appender.console.name = STDOUT
log4j2.appender.console.layout.type = PatternLayout
log4j2.appender.console.layout.pattern = %m%n
log4j2.appender.event.type = Console
log4j2.appender.event.name = event
log4j2.appender.event.layout.type = PatternLayout
log4j2.appender.event.layout.pattern = %marker \$\\\{sd:id\} \$\\\{sd:testKey\} %n %m%n
log4j2.rootLogger.level = debug
log4j2.rootLogger.appenderRef.console.ref = STDOUT
log4j2.logger.event.name = EventLogger
log4j2.logger.event.level = debug
log4j2.logger.event.appenderRef.console.ref = event
log4j2.logger.event.additivity = false
Test.java:
public class Test implements Bundleactivator {
private static final Logger LOGGER = LogManager.getLogger(Test.class);
@Override
public void start(BundleContext context) throws Exception {
StructuredDataMessage msg = new StructuredDataMessage("1","testvalue");
LOGGER.info(msg);
EventLogger.logEvent(msg,Level.INFO);
}
@Override
public void stop(BundleContext context) throws Exception {
}
}
输出:
event [1 testKey="testvalue"] message
EVENT ${sd:id} ${sd:testKey}
event [1 testKey="testvalue"] message
是否有使它在pax日志记录中起作用的技巧?如果适用,我可以使用\$\\\{ctx:key\}
从MDC访问值,因此我假设语法相似。我也尝试过在RoutingAppender,FileAppender等模式中使用查找无效。
谢谢!
编辑:我正在使用最新版本的pax-logging-api和pax-logging-log4j2(1.11.3)