我们有一个任何批次应用它处理多种请求从消费者在相同的时间。我们使用log4j记录puposes.现在我们记录到一个单一登录文件的多个请求。它变得繁琐的调试一问题一定要求对所有请求的记录是在一个单一的文件。

因此,计划是要有一个登录文件的请求。消费者发送请求ID处理有待进行。现在,在现实中可能有多个消费者发送该请求Id我们的应用程序。所以问题是如何seggregate日志的文件的基础上请求。

我们不能启动和停止生产服务器上的每一时间,所以这一点在使用的重写文件存放器有时间戳或请求ID被排除。这是什么是解释该条如下: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/log4j-user@logging.apache.org/msg05099.html

这种方法提供了所需的结果,但它不能正常工作,如果多次请求发送的,在同一时间。由于一些并发问题日志去在这里和那里。

我预见到一些你的帮助的人。在此先感谢。...

有帮助吗?

解决方案

这里是我的问题上相同的主题:动态创建和销毁记录附加程序

我按照这一线在那里讨论我做的东西正是这样,在Log4J邮寄名单:http://www.qos.ch/pipermail/logback-user/2009-August/001220.html

塞西Gulcu(发明者的log4j)不认为这是一个很好的想法...建议使用Logback代替。

我们继续这样做,无论如何,使用定义的文件存放器.看看我的讨论上述对于更多详细信息。

其他提示

看看 SiftingAppender 运输与logback(log4j的继承人),这是设计用来处理创造的附加程序在运行时间的标准。

如果你需要应用程序,仅创建一个日志文件,每届会议只是建立一个鉴别基础上届会议的标识。写鉴别涉及3个或4个行代码,因此应相当容易的。喊上logback用户的邮件列表如果你需要帮助。

这个问题处理得很好的 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.这是通过把key-value 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来,一个新的文件将会被创建。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top