【发布时间】: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