Java Log4j:每个请求一个日志文件

Java Log4j:每个请求一个日志文件,java,jakarta-ee,log4j,batch-processing,Java,Jakarta Ee,Log4j,Batch Processing,我们有一个weblogic批处理应用程序,它可以同时处理来自消费者的多个请求。我们使用log4j来记录pupose。现在,我们登录到一个日志文件以处理多个请求。由于所有请求的日志都在一个文件中,因此调试给定请求的问题变得非常繁琐 所以计划是每个请求有一个日志文件。使用者发送一个必须执行处理的请求ID。现在,实际上可能有多个使用者向我们的应用程序发送请求ID。所以问题是如何根据请求对日志文件进行分段 我们无法每次启动和停止生产服务器,因此排除了使用带有日期时间戳或请求ID的重写文件追加器的可能性。

我们有一个weblogic批处理应用程序,它可以同时处理来自消费者的多个请求。我们使用log4j来记录pupose。现在,我们登录到一个日志文件以处理多个请求。由于所有请求的日志都在一个文件中,因此调试给定请求的问题变得非常繁琐

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

我们无法每次启动和停止生产服务器,因此排除了使用带有日期时间戳或请求ID的重写文件追加器的可能性。以下文章对此进行了解释:

我还尝试过使用这些替代方案:

这种方法给出了期望的结果,但如果同时发送多个请求,则无法正常工作。由于一些并发性问题,日志到处都是


我期待你们的帮助。提前感谢….

这是我关于同一主题的问题:

在Log4J邮件列表中,我在一个帖子中讨论了做类似的事情:

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

我们还是继续这样做了,使用了一个自定义的文件追加器。有关更多详细信息,请参见上面的讨论。

查看随logback(log4j的后继者)提供的功能,它旨在根据运行时标准处理Appender的创建


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

此问题由管理员处理得非常好。如果你有自由,我建议你选择它

如果可以,您需要使用的是。它允许您根据一些运行时值分离日志文件。这意味着您有一系列关于如何分割日志文件的选项

要在
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>
这基本上就是一个简单的用例。现在,每次传入具有不同(尚未遇到)id的请求时,都会为其创建一个新文件。

使用filePattern

<?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>

${日期:yyyy-MM-dd-HH_-MM_-ss}

@eqbridges您在log4j中使用过NDC吗?我从log4j API得到这个。。。嵌套诊断上下文,简称NDC,是区分不同来源的交错日志输出的工具。当服务器几乎同时处理多个客户端时,日志输出通常是交错的。如果来自不同上下文的每个日志条目具有不同的标记,则交错日志输出仍然有意义。这就是NDC发挥作用的地方。我过去使用过NDC。这真的是你想要做的事情的正确解决方案。如果您尝试为每个请求创建一个单独的日志文件,那么您只是触及了问题的表面。
<?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>