2

执行摘要

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

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

我有几个现有的 Web 应用程序。它们被编写为依赖于专有的日志记录系统。我从头开始重新实现了专有系统中的一个关键类,并将其添加为专有系统作为 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 服务容器,但这种情况似乎不是很该页面很好地涵盖了。

4

1 回答 1

0

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

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

于 2013-09-01T01:03:06.567 回答