序言
- log4j是apache实现的一个开源日志组件(Wrapped implementations)
- logback是slf4j的原生实现(Native implementations)
slf4j是Java简单日志的门面(The Simple Logging Facade for Java),如果使用slf4j日志门面,必须要用到slf4j-api.
logback是直接实现的,所以不需要其他额外的转换以及转换带来的消耗,而slf4j要调用log4j的实现,就需要一个适配层,将log4j的实现适配到slf4j-api可调用的模式。
MDC与NDC
他们主要思路就是在执行线程中放置上下文信息,这个上线文信息一般具有唯一性 用来追踪 跨线程,跨服务的业务流程.然后我们根据这个唯一变量来搜索日志,以展现该业务的完整流程.
MDC与NDC的线程独立的,子线程会从父线程拷贝上下文(具体时间跟ThreadLocal是一样的cuiyaonan2000@163.com)
MDC
内部是Map的key ,value的方式实现
- 保存信息到上下文 MDC.put(key, value);
- 从上下文获取设置的信息 MDC.get(key);
- 清楚上下文中指定的key的信息 MDC.remove(key);
- 清除所有 clear()
- 输出模板,注意是大写[%X{key}]: log4j.appender.consoleAppender.layout.ConversionPattern = %-4r [%t] %5p %c %x - %m - %X{key}%n
- %X :后面不带{key} 则是输出全部
NDC
内部数据结构师栈,实现方式还是MDC
- 开始调用 NDC.push(message);
- 删除栈顶消息 NDC.pop();
- 清除全部的消息,必须在线程退出前显示的调用,否则会导致内存溢出。 NDC.remove();
- 输出模板,注意是小写的[%x] log4j.appender.stdout.layout.ConversionPattern=[%d{yyyy-MM-dd HH:mm:ssS}] [%x] : %m%n
1418

被折叠的 条评论
为什么被折叠?



