代码之家  ›  专栏  ›  技术社区  ›  Gaurav Saini

log4j:每个请求一个日志文件

  •  3
  • Gaurav Saini  · 技术社区  · 14 年前

    我们有一个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

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

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

    3 回复  |  直到 6 年前
        1
  •  4
  •   Community Egal    7 年前

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

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

    塞西古尔库(log4j的发明者)认为这不是一个好主意……建议改用logback。

    我们继续做这件事,无论如何,使用一个自定义文件追加器。请参阅上面的讨论了解更多详细信息。

        2
  •  4
  •   Ceki    14 年前

    SiftingAppender 与logback(log4j的继承者)一起发布,它被设计用来处理在运行时条件上创建appender。

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

        3
  •  2
  •   cegas    6 年前

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

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

    将文件拆分为 requestId ,你可以这样做:

    LogXML

    <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=1 还有一个请求 requestId=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的请求进入时,将为它创建一个新文件。