小编Dal*_*ill的帖子

如何最好地复制已配置的Log4j Appender

我有一个场景,我想通过会话ID登录到自定义Log4j Appender.换句话说,我想为一个包设置一个记录器(例如com.foo.bar),然后附加自定义Appender.只有当请求带有相同的会话ID时,我才会记录要为与会话ID匹配的Appender编写的消息.当我打开日志记录时,我们必须动态添加Appender并将其名称设置为会话ID.我想要做的是有一个预先配置的Appender,我从log4j.xml文件中获取并复制它,并将名称设置为会话ID,然后将其添加到我的新记录器中.为了从配置文件中提取appender,我发现能够做到这一点的唯一方法是将一个appender附加到一个虚拟记录器(在这种情况下是support_logger)

<appender name="console" class="org.apache.log4j.ConsoleAppender">
    <param name="Target" value="System.out" />
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%-5p: %c - %m%n" />
    </layout>
</appender>

<logger name="support_logger">
    <level value="debug" />
    <appender-ref ref="console" />
</logger>
Run Code Online (Sandbox Code Playgroud)

通过这样做,我可以通过编码到达appender:

Appender appender = Logger.getLogger("support_logger").getAppender("console") );
Run Code Online (Sandbox Code Playgroud)

我现在遇到的问题是我需要创建一个新的记录器,基于我感兴趣的一些包,然后将上面的appender及其所有配置添加到新的记录器中,但设置名称Appender的会话ID.

Logger newLogger = Logger.getLogger("com.foo.bar");
appender.setName(req.getSession().getId()); 
newLogger.addAppender(appender)
Run Code Online (Sandbox Code Playgroud)

这种情况在第一次完美发生,但如果我有同一个包的另一个会话ID,那么"console"appender就不再存在了.当我在Appender上设置名称时,我覆盖了控制台配置,似乎无法将其恢复,因为记录器已经初始化.

所以我的问题是这个.我正在寻找一种简单的方法将"console"appender克隆到另一个appender并使用会话ID设置名称并保持原始的"console"记录器配置,以便我可以在后续请求中访问它.

我编写了一个Appender克隆方法,但我不确定是否有更好的方法可以使用Log4j API.

java log4j

5
推荐指数
1
解决办法
935
查看次数

标签 统计

java ×1

log4j ×1