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

只有一个文件。 它随着Web应用程序副本的运行同时编写。

如何仅从其他日志行过滤一个会话日志消息?

使用带有NDC或MDC信息的servletfilter是我见过的最好方法。 可以在http://wiki.apache.org/logging-log4j/NDCvsMDC上快速比较两者。

我发现过去MDC对我来说效果更好。 请记住,您需要更新log4j属性文件以包含您喜欢的任何版本(模式定义,请访问http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/PatternLayout.html )。

有关使用servletfilter配置MDC的完整示例,请访问http://veerasundar.com/blog/2009/11/log4j-mdc-mapped-diagnostic-context-example-code/ 。

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

您可以使用org.apache.log4j.NDC设置包含特定应用程序实例的标识符的上下文消息,如下所示:

String appInstanceId = "My App Instance 1"; org.apache.log4j.NDC.push(appInstanceId); // handle request org.apache.log4j.NDC.clear(); 

您可以在Web应用程序实例初始化期间或servlet的doPost()方法内设置上下文。 顾名思义,您还可以在具有不同级别的多个push调用的上下文中嵌套上下文。

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

这是一个为web-app设置MDCfilter的页面 – > http://rtner.de/software/MDCUserServletFilter.html

作为servletfilter,它将使您免于管理每个servlet中的MDC / NDC。

当然,您应该对其进行修改以保存与您的网络应用程序更相关的信息。

如果您想在同一个应用程序中区分会话,那么MDC就是您的选择。 但是,如果要区分写入同一文件的Web应用程序,那么MDC将无法提供帮助,因为它可以在线程的基础上运行。 在这种情况下,我曾经创建自己的appender,知道它所服务的应用程序实例。 这可以通过appender配置属性来完成。 这样的appender会将应用程序名称作为属性粘贴到每个日志记录事件中,然后再将其写入介质,然后您可以使用布局在其写入的文本文件中显示此属性值。 在这种情况下使用MDC将无法工作,因为每个线程都必须使用MDC.put(applicationName),这非常难看。 MDC仅适用于单个流程,而不适用于多个流程。 如果有人知道另一种方式,我想听听。