`

log4jのNDCとMDC

 
阅读更多

http://takya2.blog33.fc2.com/blog-entry-18.html

 

NDCとは「Nested Diagnostic Context」の略。
org.apache.log4j.NDC クラスを使う。

1
NDC.push("hoge1");

とかすると、ログ出力レイアウト上の「%x」が置き換わる。
スタックするので、さらに

1
NDC.push("hoge2");

とかすると、「%x」は「hoge1 hoge2」になる。
この状態で

1
NDC.pop();

すると、末尾のデータが無くなり「%x」は「hoge1」になる。
さらに

1
NDC.pop();

すると、データが無くなり「%x」は空文字になる。
不要になったら

1
NDC.remove();

で消し去る。
この機能はマルチスレッドに対応しているのがポイント。

で、何に使うかというと、
WEBアプリケーションのログで、1回のリクエストで複数のログを出力する場合、
アクセスが同時に複数あると、どのログがどのリクエストの操作なのかわからなくなる。
ログにセッションIDを出力することができれば、そのセッションIDだけを抽出することにより、
特定のリクエストを解析することが可能になり、便利なはず。
リクエストと言ったが、端末というかブラウザというか、複数の異なるセッションIDからのアクセスを識別するということになるかな。

具体的な使用例としては、サーブレットによる実装だろう。
以下のような感じ。
必要なアクセスに対してマッピングを設定すれば、ログいに容易にセッションIDを出力可能になる。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package test.filter;
 
import java.io.IOException;
 
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
 
import org.apache.log4j.NDC;
 
public class Log4jFilter implements Filter {
 
    public void init(FilterConfig conf) throws ServletException {
        // 特にやる事なし。
    }
 
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
 
        // セッションがスタートしていることが前提。
        NDC.push(((HttpServletRequest) request).getSession().getId());
 
        try {
            chain.doFilter(request, response);
        } finally {
            NDC.remove();
        }
 
    }
 
    public void destroy() {
        // 特にやる事なし。
    }
 
}


ちなみに、MDCとは「Mapped Diagnostic Context」の略。
スタックではなくマッピングにて同様の処理を行う。

1
MDC.put(key, value);

レイアウト上では「%X{key}」が置き換わる。

 


分享到:
评论

相关推荐

    log4j-API-最新稳定版本log4j-1.2.17

    标题提及的是"log4j-API-最新稳定版本log4j-1.2.17",这表明我们关注的是日志框架Log4j的一个特定版本,即1.2.17。Log4j是Apache软件基金会开发的一个用于Java应用程序的日志记录工具,它提供了灵活的日志记录功能,...

    log4j jarjar包

    四、Log4j的高级特性 1. **异步日志记录**:Log4j支持异步日志记录,通过AsyncAppender可以在不阻塞主线程的情况下高效地处理日志。 2. **自定义Appender和Layout**:如果内置的Appender和Layout无法满足需求,...

    log4j简单使用

    - `log4j-1.2.14.jar`: 这是Log4j 1.2.14版本的jar包,包含了Log4j的全部类和方法,是使用Log4j进行日志记录的核心组件。 - `commons-logging-1.0.4.jar`: 这是Apache Commons Logging库,它是Java日志API的一个抽象...

    Log4J完整说明和配置

    log4j.appender.SOCET.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD]%n%c[CATEGORY]%n%m[MESSAGE]%n%n ``` - `org.apache.log4j.SocketAppender`:通过Socket发送日志信息。 ...

    java-日志-log4j.7z

    此外,Log4j还支持MDC(Mapped Diagnostic Context)和NDC(Nested Diagnostic Context),这些特性可以附加上下文信息到日志记录中,对于调试多线程和分布式系统非常有用。 如果你对Log4j的具体使用还有疑问,可以...

    log4j多个简单实例

    MDC(Mapped Diagnostic Context)和NDC(Nested Diagnostic Context)是Log4j提供的上下文诊断工具。它们可以用来存储与线程相关的诊断信息,便于在复杂环境中追踪问题。 通过以上实例,你已经了解了Log4j的基本...

    log4j-1.2.17含源码

    此外,Log4j 1.2.17还支持MDC(Mapped Diagnostic Context)和NDC(Nested Diagnostic Context),这两个功能提供了上下文信息,帮助追踪问题。MDC是线程绑定的,而NDC可以嵌套,两者在调试多线程和复杂系统时特别...

    apache-log4j-2.4.1-bin.zip

    Apache Log4j 2是Java世界中广泛使用的日志记录框架之一,它的最新版本为2.4.1。Log4j 2相比其前身Log4j 1.x,提供了许多改进和新特性,使得它在性能、可配置性、可扩展性和稳定性方面有了显著提升。在本文中,我们...

    log4j-slf4j-impl.zip

    5. **MDC与NDC**:Log4j-SLF4J-Impl支持Mapped Diagnostic Context (MDC) 和Nested Diagnostic Context (NDC),为日志信息添加上下文信息,有助于追踪和诊断问题。 四、集成与使用 集成Log4j-SLF4J-Impl通常涉及...

    log4j生成带时间戳的日志文件(包括extras包以及简单demo)

    Log4j extras包是Log4j的一个扩展,提供了更多功能,如MDC(Mapped Diagnostic Context)、NDC(Nested Diagnostic Context)等。这些功能可以帮助开发者更好地管理日志上下文,尤其在多线程环境中非常有用。例如,...

    log4j-2.11.1.jar

    《Apache Log4j 2.11.1:Java日志框架的核心组件》 Apache Log4j 是一个广泛使用的开源日志记录框架,为Java应用程序提供了强大的日志处理能力。在2.11.1这个版本中,Log4j 继续提供高效、灵活的日志记录解决方案,...

    Log4j2 web demo (log4j2 version 2.1)

    Log4j2允许你基于MDC(Mapped Diagnostic Context)或NDC(Nested Diagnostic Context)进行日志过滤。例如,你可以添加一个MDC键值对来区分不同的用户请求: ```java MDC.put("userId", "123456"); // 记录日志 ...

    log4j-core-2.7.zip

    描述中提到,Struts2版本2.5.10.1依赖于Log4j2,这意味着开发者在使用该版本的Struts2时,需要引入两个关键的Log4j2库:log4j-api-2.7和log4j-core-2.7。log4j-api-2.7提供了API接口,供应用程序调用,而log4j-core-...

    log4j-1.2.17

    《深入理解log4j-1.2.17:构建高效日志系统的关键》 在IT行业中,日志记录是至关重要的,它为系统监控、故障排查和性能优化提供了宝贵的线索。Apache Log4j作为Java领域中最广泛使用的日志框架之一,其1.2.17版本...

    log4j入门、详解

    **日志框架Log4j详解** 日志框架在软件开发中扮演着至关重要的角色,它提供了记录应用程序运行过程中的各种事件的功能,便于调试、监控和问题排查。Log4j是Apache组织开发的一个开源的日志记录工具,广泛应用于Java...

    log4j-1.2.9.jar

    四、使用Log4j 在代码中,我们可以使用以下方式引入和使用Log4j: ```java import org.apache.log4j.Logger; public class MyClass { private static final Logger logger = Logger.getLogger(MyClass.class); ...

    log4j详解.txt

    - **NDC与MDC**:NDC和MDC是Log4j提供的两个重要的上下文管理机制。NDC用于在多层调用中保持调用链的上下文信息,MDC则用于存储线程特有的键值对数据,便于日志分析。 - **动态配置**:Log4j支持在运行时动态修改...

    log4j记录Debug日志

    9. **MDC与NDC**:Mapped Diagnostic Context (MDC) 和 Nested Diagnostic Context (NDC) 是Log4j提供的两个特性,用于存储与当前线程相关的诊断信息,帮助追踪问题。 10. **日志切割与归档**:Log4j可以配置自动...

    Log4j笔记 第九章 封装Log4j

    《Log4j笔记 第九章 封装Log4j》 在Java开发中,日志记录是一项非常重要的任务,它帮助我们追踪程序运行时的状态,定位和解决错误。Log4j是Apache组织提供的一款强大的日志框架,因其高效、灵活和可配置性而广受...

    The Complete log4j Manual

    此外,手册会涵盖log4j的高级特性,如异步日志记录、自定义日志APPENDER和FILTER,以及MDC(Mapped Diagnostic Context)和NDC(Nested Diagnostic Context)的使用,这些特性能帮助我们更好地组织和管理日志信息,...

Global site tag (gtag.js) - Google Analytics