我正在尝试为 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
最佳答案
我已经设法解决这个问题。有几个问题。
- 仅当使用 LoggerContext 时,代码/设置才有效。我在加载 log4j2 XML 时错误地实现了这一点,这导致了所有的麻烦。
- FKhan 提供的上述建议也有很大帮助,只需稍作更改即可。路由模式应该有一个冒号而不是两个。将此问题从 $${ctx::fileName} 更正为 $${ctx:fileName}
下面的 Log4j2XML 和 Java 服务完美配合,用户可以在运行时动态传递日志文件名
Log4j2 XML
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="DEBUG">
<Appenders>
<Routing name="Routing">
<Routes pattern="$${ctx:fileName}">
<Route>
<RollingFile name="RoutingLog" 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="RoutingLogger" level="debug" additivity="true">
<AppenderRef ref="Routing" level ="DEBUG"/>
</Logger>
<Root level="debug">
<appender-ref ref="Routing" />
</Root>
</Loggers>
</Configuration>
用于创建日志文件的 Java 代码
//Logging process LOG4J_CFG - String location of XML file
ConfigurationFactory factory = XmlConfigurationFactory.getInstance();
ConfigurationSource configurationSource = new ConfigurationSource(new FileInputStream(new File(LOG4J_CFG)));
Configuration configuration = factory.getConfiguration(null, configurationSource);
//debugLog ("Config setu up complete");
// Get context instance
final LoggerContext context = new LoggerContext("test");
// Start logging system
context.start(configuration);
// Get a reference for logger
Logger logger = context.getLogger("Routing");
//Log data - finalLogFilename and finalMessage string to passed by users
ThreadContext.put("fileName", finalLogFileName);
logger.debug(finalMessage);
ThreadContext.remove("fileName");
//Close Context
context.close();
再次感谢 Piotr P. Karwasz 和 FKhan 的建议和指点。
关于java - Log4j2 - 为每个附加程序/记录器编写单独的日志文件 - webMethods,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76971264/