【问题标题】:Filter log4j 2.0 messages to separate log files per-webapp过滤 log4j 2.0 消息以分隔每个 webapp 的日志文件
【发布时间】:2013-08-30 18:34:11
【问题描述】:

执行摘要

如何按调用日志消息的 servlet 进行过滤? (目前使用 2.0 beta8)

我到底为什么要这么做……

我有几个现有的网络应用程序。它们被编写为依赖于专有的日志记录系统。我从头开始重新实现了专有系统中的一个关键类,并将其添加为专有系统作为 jar 和 log4j 2.0 作为 tomcat 中的 jar 的类,从而利用 tomcat 中的类加载加载顺序将专有系统转移到 log4j .这成功了,我的 log4j 配置现在控制了一切(耶!)。

但是...(总有一个“但是”!)

我很高兴,直到我发现所有 4 个应用程序都部署在同一个容器中,它们没有在我放在 conf/log4j2.xml 中的单个配置中协调写入单个日志文件(并通过传递指定-Dlog4j.configurationFile=/mnt/kui/tomcat/conf/log4j2.xml 在命令行上)。 我在日志文件的中间发现了一些带有更早时间戳(几个小时之前)的日志消息。 乱序日志(并且可能被覆盖的日志行?)当然是不可取的。

我实际上并不希望它们全部放在一个文件中,而是希望每个应用程序都有一个由单个配置文件控制的日志。最初我认为这很容易实现,因为 log4j 会自动使用 Web 应用程序的名称设置 LoggingContext。

但是我似乎找不到允许我在 LoggingContext 上进行过滤的过滤器实现。我知道从每个应用程序的角度来看,只有一个日志记录上下文(我认为),但是相同的配置文件被 4 个应用程序读取,因此从配置角度来看 LoggingContext 不是唯一的。

我正在寻找一种方法来将每个应用程序路由到它自己的文件,而无需为每个应用程序提供配置文件,或者不必为所有应用程序添加类或编辑 war 文件(包括 web.xml)。我太……接近了,但它不起作用。

为了使事情复杂化,我们编写了一个 jar 文件,它在所有 4 个使用此日志记录的应用程序之间共享,一个应用程序已转换为直接在其类中使用 log4j(但它仍然使用引用专有的专有类我替换的日志记录类)。

我已经看过http://logging.apache.org/log4j/2.x/manual/logsep.html,我的案例似乎最接近“共享”Web 应用程序和 REST 服务容器,但该页面似乎没有很好地涵盖该案例。

【问题讨论】:

    标签: java tomcat logging log4j log4j2


    【解决方案1】:

    您可能想查看 RoutingAppender,它可用于根据 ThreadContextMap 中的数据分隔日志文件。您可以使用 Web 应用程序名称作为唯一键。

    关于乱序日志,FastFileAppender 在旧 beta 中存在问题。如果 append 为 false,则旧文件不会被截断,但新的日志事件将从头开始覆盖旧文件。 (例如,在您最近的日志事件之后,您会看到昨天的日志事件)。你用的是什么版本?

    【讨论】:

    • 使用的是2.0beta8,抱歉应该这么说。
    • Gus,看看issues.apache.org/jira/browse/LOG4J2-326 特别是 Ralph 的示例配置可能有助于理解如何使用 RoutingAppender。关于乱序日志,您能否为此提出新的 JIRA 票证,其中包括您的配置和问题描述?谢谢!
    • 不确定是否可以向您发送错误报告。前段时间我吹走了那个配置(和日志)。如果我再次看到它,我会尝试为你写一个错误。
    猜你喜欢
    • 2019-02-04
    • 2021-03-27
    • 1970-01-01
    • 1970-01-01
    • 2015-03-24
    • 1970-01-01
    • 2015-06-30
    • 1970-01-01
    • 2018-07-26
    相关资源
    最近更新 更多