Java 如何区分日志文件中的log4j会话与同一web应用程序的副本?

Java 如何区分日志文件中的log4j会话与同一web应用程序的副本?,java,logging,log4j,Java,Logging,Log4j,只有一个文件。它是在web应用程序副本运行时同时编写的 如何仅从其他日志行筛选一条会话日志消息?您可以使用以下方法设置包含特定应用程序实例标识符的上下文消息: String appInstanceId = "My App Instance 1"; org.apache.log4j.NDC.push(appInstanceId); // handle request org.apache.log4j.NDC.clear(); 您可以在web应用实例初始化期间设置上下文,也可以在servlet的d

只有一个文件。它是在web应用程序副本运行时同时编写的


如何仅从其他日志行筛选一条会话日志消息?

您可以使用以下方法设置包含特定应用程序实例标识符的上下文消息:

String appInstanceId = "My App Instance 1";
org.apache.log4j.NDC.push(appInstanceId);
// handle request
org.apache.log4j.NDC.clear();
您可以在web应用实例初始化期间设置上下文,也可以在servlet的
doPost()
方法中设置上下文。顾名思义,您还可以在不同级别的多个
push
调用的上下文中嵌套上下文


请参阅中的“嵌套诊断上下文”部分。

这是一个为web app设置MDC筛选器的页面->

作为一个servlet过滤器,它将使您不必在每个servlet中管理MDC/NDC


当然,您应该修改它以保存与web应用程序更相关的信息。

使用带有NDC或MDC信息的servlet过滤器是我见过的最好的方法。有关这两种方法的快速比较,请访问

我发现MDC在过去对我更有效。请记住,您需要更新log4j属性文件,以包含您喜欢的版本(位于的模式定义)

有关使用servlet过滤器配置MDC的完整示例,请访问


一个稍微容易配置但明显较差的选项:您可以选择只打印每个请求的线程ID(通过属性文件),并确保记录每个请求的第一件事是会话标识符。它不是那么合适(或有用),但它可以用于低容量的应用程序。

如果您想区分同一应用程序中的会话,那么MDC是一个不错的选择。但是,如果您想区分写入同一文件的web应用程序,那么MDC将不会有帮助,因为它是基于线程的。在这种情况下,我使用自己的appender,它知道它服务于哪个应用程序实例。这可以通过appender配置属性完成。在将应用程序名称写入媒体之前,这种追加器会将应用程序名称作为属性粘贴到每个日志事件中,然后您可以使用布局在它写入的文本文件中显示此属性值。在这种情况下使用MDC是行不通的,因为每个线程都必须使用MDC.put(applicationName),这非常难看。MDC只适用于单个进程,而不适用于多个进程。如果有人知道另一种方式,我想听听。

我不确定我是否理解你的问题。每个web会话需要一个(日志)文件吗?@skaffman Tomcat 6@bert所有会话的所有内容都记录在一个文件中。我想听听你是如何处理这件事的。