过滤log4j 2.0消息以分离每个webapp的日志文件

时间:2013-08-30 18:34:11

标签: java tomcat logging log4j log4j2

执行摘要

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

为什么我真的想这样做......

我有几个现有的Web应用程序。它们的编写依赖于专有的记录系统。我从头开始从专有系统重新实现了一个密钥类,并将其作为一个类添加为专用系统作为jar,将log4j 2.0作为jar添加到tomcat中,从而利用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服务容​​器',但该页面似乎没有很好地涵盖该案例。

1 个答案:

答案 0 :(得分:0)

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

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