2010-02-25 81 views
3

我们有一个weblogic批处理应用程序,它同时处理来自使用者的多个请求。我们使用log4j来记录puposes。现在我们登录到一个日志文件中以获取多个请求。调试给定请求的问题变得单调乏味,因为对于日志在单个文件中的所有请求。Log4j:每个请求一个日志文件

因此计划是每个请求都有一个日志文件。消费者发送必须执行处理的请求ID。现在,实际上可能有多个用户将请求ID发送到我们的应用程序。所以问题是如何根据请求分段日志文件。

我们无法启动&每次都停止生产服务器,因此排除使用带有日期时间戳或请求ID的覆盖文件appender的要点。这是在下面的文章中解释: http://veerasundar.com/blog/2009/08/how-to-create-a-new-log-file-for-each-time-the-application-runs/

我也试图与这些替代玩弄:

http://cognitivecache.blogspot.com/2008/08/log4j-writing-to-dynamic-log-file-for.html

http://www.mail-archive.com/[email protected]/msg05099.html

这种方法提供了预期的效果,但它不工作如果同时发送多个请求,则应该正确。由于一些并发问题日志在这里和那里。

我期待你们的帮助。在此先感谢....

回答

4

这里是我的关于同一主题的问题: dynamically creating & destroying logging appenders

我跟进这件事上,我商量做的事情正是这样一个线程,Log4J的邮件列表: http://www.qos.ch/pipermail/logback-user/2009-August/001220.html

Ceci Gulcu(log4j的发明人)不认为这是个好主意......建议使用Logback代替。

我们继续前进,无论如何,使用自定义文件appender。有关更多详情,请参阅上面的讨论。

+1

@eqbridges 您是否在log4j中使用过NDC?我从log4j API获得了这个... 嵌套诊断上下文(简称NDC)是一种区分交错日志输出和不同来源的工具。当服务器几乎同时处理多个客户端时,日志输出通常是交错的。 如果来自不同上下文的每个日志条目都有独特的标记,则交织日志输出仍然可能有意义。这是国家数据中心发挥作用的地方。 – 2010-02-25 17:48:25

+0

我过去曾使用过NDC。这真的是你想要做的事情的正确解决方案。如果您尝试为每个请求执行单独的日志文件,那么您只是抓住了遇到的问题的表面。 – 2010-03-09 17:36:00

3

看看SiftingAppender航运与logback(log4j的继任者),它被设计来处理在运行时标准的appender的创建。

如果您的应用程序需要为每个会话创建一个日志文件,只需根据会话ID创建一个鉴别器即可。编写鉴别器涉及3或4行代码,因此应该相当容易。如果您需要帮助,请在logback-user邮件列表中大声呼喊。

0

这个问题处理得很好Logback。如果你有自由,我建议选择它。

假设你可以,你需要使用的是SiftingAppender。它允许您根据某些运行时值分离日志文件。这意味着您有多种如何分割日志文件的选项。

拆就requestId你的文件,你可以做这样的事情:

的logback。XML

<configuration> 

    <appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender"> 
    <discriminator> 
     <key>requestId</key> 
     <defaultValue>unknown</defaultValue> 
    </discriminator> 
    <sift> 
     <appender name="FILE-${requestId}" class="ch.qos.logback.core.FileAppender"> 
     <file>${requestId}.log</file> 
     <append>false</append> 
     <layout class="ch.qos.logback.classic.PatternLayout"> 
      <pattern>%d [%thread] %level %mdc %logger{35} - %msg%n</pattern> 
     </layout> 
     </appender> 
    </sift> 
    </appender> 

    <root level="DEBUG"> 
    <appender-ref ref="SIFT" /> 
    </root> 

</configuration> 

正如你所看到的(内部discriminator元素),你要区分用于写入日志上requestId的文件。这意味着每个请求都将转到具有匹配requestId的文件。因此,如果您有两个请求,其中requestId=1和一个请求requestId=2,那么您将有2个日志文件:1.log(2个条目)和2.log(1个条目)。

在这一点上,你可能想知道如何设置key。这是通过把键值对在MDC做(注意,关键匹配logback.xml文件中定义的):

RequestProcessor.java

public class RequestProcessor { 

    private static final Logger log = LoggerFactory.getLogger(RequestProcessor.java); 

    public void process(Request request) { 
     MDC.put("requestId", request.getId()); 
     log.debug("Request received: {}", request); 
    } 
} 

而这基本上是一个简单的用例。现在每次有一个具有不同(尚未遇到)ID的请求进入时,都会为其创建一个新文件。