簡體   English   中英

如何區分日志文件中的log4j會話與同一個Web應用程序的副本?

[英]How do you differentiate log4j sessions in a log file from copies of the same web-app?

只有一個文件。 它是在Web應用程序副本運行時同時編寫的。

如何僅從其他日志行過濾一個會話日志消息?

使用帶有NDC或MDC信息的servlet過濾器是我見過的最好的方法。 可以在http://wiki.apache.org/logging-log4j/NDCvsMDC上快速比較這兩者。

我發現過去MDC對我來說效果更好。 請記住,您需要更新log4j屬性文件以包含您喜歡的任何版本(模式定義,請訪問http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/PatternLayout.html )。

有關使用servlet過濾器配置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設置MDC過濾器的頁面 - > http://rtner.de/software/MDCUserServletFilter.html

作為servlet過濾器,它將使您免於管理每個servlet中的MDC / NDC。

當然,您應該修改它以保存與您的Web應用程序更相關的信息。

如果您想在同一個應用程序中區分會話,那么MDC就是您的選擇。 但是,如果要區分寫入同一文件的Web應用程序,那么MDC將無法提供幫助,因為它可以在線程的基礎上運行。 在這種情況下,我曾經創建自己的appender,知道它所服務的應用程序實例。 這可以通過appender配置屬性來完成。 這樣的appender會將應用程序名稱作為屬性粘貼到每個日志記錄事件中,然后再將其寫入介質,然后您可以使用布局在其寫入的文本文件中顯示此屬性值。 在這種情況下使用MDC將無法工作,因為每個線程都必須使用MDC.put(applicationName),這非常難看。 MDC僅適用於單個流程,而不適用於多個流程。 如果有人知道另一種方式,我想聽聽。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM