执行摘要
如何按调用日志消息的 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 服务容器,但这种情况似乎不是很该页面很好地涵盖了。