Я использую pax-logging-api вместе с pax-logging-log4j2 для ведения журнала из моих пакетов OSGi. Я хотел бы использовать Log4J2 StructuredDataMessage (используя EventLogger) для записи некоторых сообщений в базу данных. Однако я не могу прочитать значения, которые я ввел в StructuredDataMessage, из приложений при использовании Pax Logging.
Следующее работает в проекте, отличном от OSGi, с непосредственным использованием библиотек Log4J2:
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
правильно разыменовало ключи sd
из сообщения StructuredDataMessage.
Однако следующее не работает в OSGi с pax-logging:
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", "message", "event");
msg.put("testKey", "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-logging? Я могу получить доступ к значениям из MDC, используя \$\\\{ctx:key\}
, когда это применимо, поэтому я предполагаю, что синтаксис аналогичен. Я также пробовал использовать поисковые запросы в шаблонах для RoutingAppender, FileAppender и т.д., но безрезультатно.
Заранее спасибо!
Изменить: я использую последнюю версию pax-logging-api и pax-logging-log4j2 (1.11.3)