java - Log4j2 - 为每个附加程序/记录器编写单独的日志文件 - webMethods

标签 java log4j2 webmethods

我正在尝试为 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/

相关文章:

java - Spring Security登录重定向到/j_spring_security_check而不进行身份验证

java - Log4j2 XML系统文件分隔符

java - 无法在初始化程序中引用静态枚举字段 Cbev2Key.log

java - 无法将 int 月份转换为月份名称 android java

java - 我如何确定语言环境的字母表在 Java 中是什么?

java - 使用可选参数记录

java - 如何为具有 Webmethod 模式命名空间的 xml 创建 xsd

在运行时提取字段值的 Java 服务

webmethods - SAG Webmethods - 时间线

java - 如何将 url 图像添加到 JButton