文档章节

log4j 的一个实用工具类--NDC–可在每个日志前自动加上一个tag--介绍

zgw06629
 zgw06629
发布于 2015/04/27 11:57
字数 620
阅读 125
收藏 0

在现实的场景中经常有这样的需求,在纷繁的日志文件中,通过搜索某一个关键字(如订单号),能方便清晰的列出某一业务(如支付)的完整的处理流程。

一个笨办法是在每个日志中加上该关键字,如下所示:

logger.info("[{}] entering pay",orderId);
logger.info("[{}] check whether order is repeated ",orderId);
logger.info("[{}] save order to db",orderId);
logger.error("[{}]", orderId, e);
......

有没有更方便的方法满足这一业务要求呢? 而不用这么麻烦要在每个日志中都要显式加上tag,所幸log4j自身就提供了这么一个方便易用的工具类--NDC。

只要在入口方法中设置tag,离开方法前remove即可。见如下示例代码:

protected static final Logger logger = LoggerFactory
            .getLogger(NDCDemo.class);
    void test1(long orderId){ //入口方法
        NDC.push("["+orderId+"]"); //进入方法设置tag
        logger.info("entering test1"); //正常记录日志 无需显式添加tag
        test2();
        test3();
        test6();
        NDC.remove(); //离开方法删除tag
    }
    private void test6() {
        logger.info("entering test6");
    }
    private void test3() {
        logger.info("entering test3");
        test5();
    }
    private void test5() {
        logger.info("entering test5");
    }
    private void test2() {
        logger.info("entering test2");
        test4();
    }
    private void test4() {
        logger.info("entering test4");
    }
    public static void main(String[] args) {       
        NDCDemo app = new NDCDemo();
        app.test1(System.currentTimeMillis());
    }

以及日志输出,注意每个日志信息前都有了上述代码所设置的tag。

[04 21:10:02,032 INFO ] [main] com.tcl.gateway.log4j.NDCDemo - [1428153002029]-entering test1
[04 21:10:02,035 INFO ] [main] com.tcl.gateway.log4j.NDCDemo - [1428153002029]-entering test2
[04 21:10:02,035 INFO ] [main] com.tcl.gateway.log4j.NDCDemo - [1428153002029]-entering test4
[04 21:10:02,035 INFO ] [main] com.tcl.gateway.log4j.NDCDemo - [1428153002029]-entering test3
[04 21:10:02,035 INFO ] [main] com.tcl.gateway.log4j.NDCDemo - [1428153002029]-entering test5
[04 21:10:02,035 INFO ] [main] com.tcl.gateway.log4j.NDCDemo - [1428153002029]-entering test6

同时配置文件中输出模板需要添加一个字符x(表示从NDC取消息)。如下所示:

<layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" 
                value="[%d{dd HH:mm:ss,SSS\} %-5p] [%t] %c - %x-%m%n" />
        </layout>

这样的话即使在多用户并发的情况下(如servlet和dubbo service)也容易根据某一关键字(如订单号、ip)来定位出完整的业务链。

另外除了NDC外还有一个工具类--MDC–也适用于这一场景,使用方式和NDC差不多,仍沿用上述示例,仅需部分改动:

void test1(int orderId){
        MDC.put("orderId", "["+orderId+"]"); // NDC.push --> MDC.put(key , value)
        logger.info("entering test1");
        test2();
        test3();
        test6();
        MDC.remove("orderId"); //NDC.remove --> MDC.remove(key)
    }

配置文件的输出模板中加一个X,如下所示:

<layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" 
                value="[%d{dd HH:mm:ss,SSS\} %-5p] [%t] %c -%X{orderId}-%m%n" />
        </layout>

另外他们两者的区别及更多用法见各自的javadoc。

© 著作权归作者所有

共有 人打赏支持
zgw06629
粉丝 16
博文 54
码字总数 30471
作品 0
海淀
程序员
私信 提问
比较 SLF4J 与 log4j

SLF4J :JAVA简易日志门面(Simple Logging Facade for Java,缩写SLF4J) 他是一套包装Logging 框架的接口程式,以外观模式实现。可在软件部署的时候决定要使用的 Logging 框架,目前主要支援...

Candy_Desire
2014/03/19
0
0
commons-logging和log4j

一、日志系统介绍 日志的重要性是随着系统的膨胀而显现的,在一个庞大的系统中查错没有各种日志信息是寸步难行的。所以在系统加入日志是必须的。 最原始的日志方式,就是在程序的适当地方添加...

hulubo
2011/12/25
0
0
idea工具java日志 Log4j+slf4j使用

参考博文:http://www.blogjava.net/zzzlyr/articles/353039.html 这几天一直在用logger记录日志,但一直不明白log4j.properties配置文件意思,下面看看其他博主文章给自己充充电。 本人认为...

卢瑶
2014/12/25
0
0
Spring 配置log4j和简单介绍Log4J的使用

Log4j 是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务器、NT的事 件记录器、UNIX Syslog守护进程等;我们也可以...

黑帽子
2013/07/12
0
2
Log4j 2.0在开发中的高级使用详解

log4j与slf4j、logback比较 而log4j slf4j logback就是目前主流的日志框架。但后两者效率高是第一个。推荐使用:slf4j 或者 logback(spring-boot默认日志实现) log4j是apache实现的一个开源日...

spinachgit
04/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

安秒平衡

相关介绍 电容两端的电压不能突变。 一般用在平衡条件下的开关电路中。 流经电容的电流平均值在一个开关周期内为零。 定义 安秒平衡原则:在稳态工作的开关电源中电容两端的正安秒值等于负安...

colinux
今天
2
0
Apache日志不记录访问静态文件,访问日志切割,静态元素过期时间设置

Apache配置不记录访问静态文件的日志 网站大多元素为静态文件,如图片、css、js等,这些元素可以不用记录 vhost原始配置 <VirtualHost *:80> ServerAdmin test@163.com DocumentRoo...

野雪球
今天
3
0
聊聊storm的ICommitterTridentSpout

序 本文主要研究一下storm的ICommitterTridentSpout ICommitterTridentSpout storm-core-1.2.2-sources.jar!/org/apache/storm/trident/spout/ICommitterTridentSpout.java public interface......

go4it
今天
4
0
Ubuntu常用操作

查看端口号 netstat -anp |grep 端口号 查看已使用端口情况 netstat -nultp(此处不用加端口号) netstat -anp |grep 82查看82端口的使用情况 查找被占用的端口: netstat -tln netstat -tl...

hc321
昨天
3
0
网站cdn的静态资源突然访问变的缓慢,问题排查流程

1.首先我查看了一下是否自己的网络问题,通过对比其他资源的访问速度和下载速度,确认不是 2.通过ping 和 tracert 判断cdn域名能否正常访问,(最后回想感觉这一步可以省略,因为每次最终能访...

小海bug
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部