3

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

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

我们不能每次都启动和停止生产服务器,因此排除了使用带有日期时间戳或请求 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

这种方法给出了预期的结果,但如果同时发送多个请求,它就不能正常工作。由于一些并发问题,日志会到处乱跑。

我期待你们的一些帮助。提前致谢....

4

4 回答 4

4

这是我关于同一主题的问题: 动态创建和销毁日志附加程序

我在 Log4J 邮件列表上讨论了一个完全类似的事情的线程: http ://www.qos.ch/pipermail/logback-user/2009-August/001220.html

Ceci Gulcu(log4j 的发明者)认为这不是一个好主意……建议改用 Logback。

无论如何,我们使用自定义文件附加程序继续执行此操作。有关更多详细信息,请参阅我上面的讨论。

于 2010-02-25T03:51:24.660 回答
4

查看与 logback(log4j 的继任者)一起提供的SiftingAppender,它旨在处理根据运行时标准创建附加程序。

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

于 2010-03-05T11:56:03.493 回答
2

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。因此,如果您有两个请求 whererequestId=1和一个请求 where requestId=2,您将有 2 个日志文件:1.log(2 个条目)和2.log(1 个条目)。

此时您可能想知道如何设置key. 这是通过将键值对放在MDC中来完成的(请注意,键与logback.xml文件中定义的键匹配):

请求处理器.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 的请求进来时,都会为其创建一个新文件。

于 2018-02-23T09:05:22.543 回答
0

使用文件模式

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Properties>
<property name="filePattern">${date:yyyy-MM-dd-HH_mm_ss}</property>
</Properties>
<Appenders>
<File name="File" fileName="export/logs/app_${filePattern}.log" append="false">
<PatternLayout
pattern="%d{yyyy-MMM-dd HH:mm:ss a} [%t] %-5level %logger{36} - %msg%n" />
</File>
</Appenders>
<Loggers>
<Root level="debug">
<AppenderRef ref="Console" />
<AppenderRef ref="File" />
</Root>
</Loggers>
</Configuration>
于 2020-06-19T05:09:47.627 回答