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

问题描述 投票:0回答:1

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

java log4j2 webmethods
1个回答
0
投票

您可以尝试使用 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)
记录用户消息。

© www.soinside.com 2019 - 2024. All rights reserved.