我正在尝试为 webMethods 中的代码创建 log4j2 日志文件。记录器名称、消息和级别将由用户在运行时传递,并且基于此需要为每个附加程序创建单独的日志文件。
我已设法使其与以下设置一起工作
Log4j2 XML
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="DEBUG">
<Appenders>
<RollingFile name="ROLL_ITLFileHandler" fileName="/esblogdata/logs/ITLFileHandler.log" filePattern="/esblogdata/logs/ITLFileHandler%d{yyyy-MM-dd}.log">
<PatternLayout>
<Pattern>%m%n</Pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
</Policies>
</RollingFile>
</Appenders>
<Appenders>
<RollingFile name="ROLL_PublishCarrierEvent" fileName="/esblogdata/logs/PublishCarrierEvent.log" filePattern="/esblogdata/logs/PublishCarrierEvent%d{yyyy-MM-dd}.log">
<PatternLayout>
<Pattern>%m%n</Pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
</Policies>
</RollingFile>
</Appenders>
<Appenders>
<RollingFile name="ROLL_ABC" fileName="/esblogdata/logs/ABC.log" filePattern="/esblogdata/logs/ABC%d{yyyy-MM-dd}.log">
<PatternLayout>
<Pattern>%m%n</Pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
</Policies>
</RollingFile>
</Appenders>
<Appenders>
<RollingFile name="ROLL_EFG" fileName="/esblogdata/logs/EFG.log" filePattern="/esblogdata/logs/EFG%d{yyyy-MM-dd}.log">
<PatternLayout>
<Pattern>%m%n</Pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
</Policies>
</RollingFile>
</Appenders>
<Loggers>
<Logger name="ITLFileHandler" level="DEBUG" additivity="true">
<AppenderRef ref="ROLL_ITLFileHandler"/>
</Logger>
<Logger name="PublishCarrierEvent" level="DEBUG" additivity="true">
<AppenderRef ref="ROLL_PublishCarrierEvent"/>
</Logger>
<Logger name="ABC" level="DEBUG" additivity="true">
<AppenderRef ref="ROLL_ABC"/>
</Logger>
<Logger name="EFG" level="DEBUG" additivity="true">
<AppenderRef ref="ROLL_EFG"/>
</Logger>
<Root level="DEBUG">
<AppenderRef ref="ROLL_ITLFileHandler"/>
<AppenderRef ref="ROLL_PublishCarrierEvent"/>
<AppenderRef ref="ROLL_ABC"/>
<AppenderRef ref="ROLL_EFG"/>
</Root>
</Loggers>
</Configuration>
编写日志的Java代码
//Set Level - severity received from user in in run time as INFO, DEBUG etc.,
Level level = Level.getLevel(severity);
ConfigurationFactory factory = XmlConfigurationFactory.getInstance();
//LOG4J_CFG points to the location where log4j2 XML is kept
ConfigurationSource configurationSource = new ConfigurationSource(new FileInputStream(new File(LOG4J_CFG)));
Configuration configuration = factory.getConfiguration(null, configurationSource);
// Get context instance
LoggerContext context = new LoggerContext("test");
//Start logging system
context.start(configuration);
// Get a reference for logger (logger name will be passed in runtime by user which will be similar to the Logger name Ex: ITLFilehandler, ABC, XYZ in above XML
Logger logger = context.getLogger(loggerName);
logger.log(level, finalMessage);
context.close();
但问题在于上述设置,日志仅写入到最后一个附加程序 EFG.log 中存在的同一文件中
无论我在运行时传递什么记录器名称(ABC、XYZ 等),所有内容都会进入同一个文件 EFG.log
有人可以指导这里出了什么问题吗?
谢谢 拉加夫 J
您可以尝试使用 1 个具有多个文件路由的附加程序。
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="DEBUG">
<Appenders>
<Routing name="GenericLogger">
<Routes pattern = "$${ctx::fileName}">
<Route key="$${ctx::fileName}">
<RollingFile name="$${ctx::fileName}" fileName="/esblogdata/logs/$${ctx::fileName}.log" filePattern="/esblogdata/logs/$${ctx::fileName}%d{yyyy-MM-dd}.log">
<PatternLayout>
<Pattern>%m%n</Pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
</Policies>
</RollingFile>
</Route>
</Routes>
</Routing>
<Routing name="GenericInfoLogger">
<Routes pattern = "$${ctx""fileName}">
<Route key="$${ctx::fileName}">
<RollingFile name="$${ctx::fileName}" fileName="/esblogdata/logs/$${ctx::fileName}.log" filePattern="/esblogdata/logs/$${ctx::fileName}%d{yyyy-MM-dd}.log">
<PatternLayout>
<Pattern>%m%n</Pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
</Policies>
</RollingFile>
</Route>
</Routes>
</Routing>
</Appenders>
<Loggers>
<Logger name="GenericLogger" level="DEBUG" additivity="true">
<AppenderRef ref="GenericLogger"/>
</Logger>
<Logger name="GenericInfoLogger" level="INFO" additivity="true">
<AppenderRef ref="GenericInfoLogger"/>
</Logger>
</Loggers>
</Configuration>
使用
Logger infoLogger = LogManager.getLogger("GenericInfoLogger");
获取记录器对象。
使用
ThreadContext.put("fileName", userGetFileName)
将日志消息路由到适当的文件。
最后
infoLogger.debug(userMessage)
记录用户消息。