我有一个场景,我想通过会话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.