文档章节

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

zgw06629
 zgw06629
发布于 2015/04/27 11:57
字数 620
阅读 102
收藏 0
点赞 0
评论 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
粉丝 15
博文 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
17 Web自动化测试 -- Log4j 的引入

背景 自动化实施过程中我们经常需要调试脚本,那为了脚本调试简单我们往往需要给每个步奏打印操作日志,也许你会用 System.out.println(); 类似打印,但这类打印终归过于简洁,有时我们需要一...

米阳MeYoung
07/03
0
0
log4j.properties配置与加载应用

log4j.properties总结: 一、介绍 Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务 器、NT的事件记录器、U...

Sobey
2015/01/08
0
0
java日志组件介绍(common-logging,log4j,slf4j,logback)

common-logging common-logging是apache提供的一个通用的日志接口。用户可以自由选择第三方的日志组件作为具体实现,像log4j,或者jdk自带的logging, common-logging会通过动态查找的机制,...

五大三粗
2015/11/04
0
0
java日志组件介绍(common-logging,log4j,slf4j,logback )

common-logging是apache提供的一个通用的日志接口。用户可以自由选择第三方的日志组件作为具体实现,像log4j,或者jdk自带的logging, common-logging会通过动态查找的机制,在程序运行时自动...

凯文加内特
2015/05/08
0
0
commons-logging 和 log4j 之间的关系

我们在做项目时,日志的记录是必不可少的一项任务,而我们通常是使用 apache 的 log4j 日志管理工具。然而,在项目中,我们经常会看到两个 jar 包:commons-logging.jar 和 log4j.rar。为什么...

飓风2000
2014/05/26
0
4

没有更多内容

加载失败,请刷新页面

加载更多

下一页

expect(spawn) 自动化git提交和scp拷贝---centos(linux)

**在进行SCP文件拷贝中,往往需要进行用户密码的输入,即用户交互。若采用自动化脚本的方式进行,则可用以下方式: ** #!/usr/bin/expect #设置参数 set src [lindex $argv 0] set dest [lin...

helplove
6分钟前
1
0
用Build来构建对象的写法

如果一个类的属性过多,用构造器来构建对象很难写,因此我们时用Build方式来构建对象。写法大致如下。 import java.io.Serializable;import java.util.Date;public class Log impleme...

算法之名
8分钟前
11
0
利用 acme.sh 获取网站证书并配置https访问

acme.sh 实现了 acme 协议, 可以从 letsencrypt 生成免费的证书.(https://github.com/Neilpang/acme.sh/wiki/%E8%AF%B4%E6%98%8E) 主要步骤: 安装 acme.sh 生成证书 copy 证书到 nginx/ap...

haoyuehong
21分钟前
2
0
微擎框架内如何根据media_id获取到微信图片的路径

微擎的框架内,图片选择后,获取的是那个字符串是media_id,相当于你这张图片在微信的图片服务器里面的id 要求是:获取https://mmbiz.qpic.cn/mmbiz_jpg/…… 微信图片的路径 而微信并没有根据m...

老bia同学
25分钟前
1
0
Spring boot中日期的json格式化

Model 在model层中,类的日期属性上面添加如下注解: @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd hh:mm:ss") 参考 Jackson Date格式化教程...

亚林瓜子
27分钟前
2
0
Eclipse:Failed to load the JNI shared library

1.问题背景: 由于我之前使用jdk1.9学习,当使用Luke的时候发现jdk版本过高,需要向下配置jdk,就向朋友拷了一个安装包。重新配置路径后,便开始报错。 2.问题描述: Failed to load the JNI...

tinder_boy
29分钟前
1
0
少儿学习编程课程是否真的适合七八岁的低龄儿童[图]

少儿学习编程课程是否真的适合七八岁的低龄儿童[图]: 天下熙熙皆为利来,天下攘攘皆为利往。 这几年来,乐高教育机构在国内如同雨后春笋般出现,当然关闭/转手的也很多。从教师角度来看,部...

原创小博客
35分钟前
1
0
ES12-词项查询

1.词项查询介绍 全文查询将在执行之前分析查询字符串,但词项级别查询将按照存储在倒排索引中的词项进行精确操作。这些查询通常用于数字,日期和枚举等结构化数据,而不是全文本字段。 或者,...

贾峰uk
43分钟前
2
0
http状态码与ajax的状态值

ajax状态值 1.1 200 & OK:状态请求成功

litCabbage
46分钟前
2
0
iOS动画效果合集、飞吧企鹅游戏、换肤方案、画板、文字效果等源码

iOS精选源码 动画知识运用及常见动画效果收集 3D卡片拖拽卡片叠加卡片 iFIERO - FLYING PENGUIN 飞吧企鹅SpriteKit游戏(源码) Swift封装的空数据提醒界面EmptyView 沙盒文件浏览与分享调试控...

sunnyaigd
49分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部