金沙js333娱乐场slf4j的MDC

slf4j除了trace、debug、info、warn、error那多少个日志接口外,还足以相称MDC将数据写入日志。换句话说MDC也是用来记录日志的,但它的利用办法与利用日志接口分化。

slf4j中的MDC,slf4jMDC

1、概述

       
log4j是Apache提供的一个日记达成,能够用来咱们项目中的日志记录,有log4j1和log4j2多个版本,本文使用log4j2以此本子。SLF4J(Simple
logging facade for
Java)不是贰个当真的日记达成,而是二个抽象层,约等于三个合併的接口,它同意你在后台使用任意八个日志类库。大家应用SLF4J提供的接口举办日志记录的编程,当大家需求改动实际的日记达成时,能够不供给改动日志的代码,只要到场响应的jar包和安顿就足以切换完成。本文使用log4j+slf4j进行配备。

在使用日志接口时我们平常这么做

slf4j中MDC是如何鬼

  slf4j除了trace、debug、info、warn、error那多少个日志接口外,还足以相配MDC将数据写入日志。换句话说MDC也是用来记录日志的,但它的利用方法与运用日志接口分裂。

  在使用日志接口时我们平时这么做

Logger LOG = LoggerFactory.getLogger("LOGNAME_OR_CLASS");
if(LOG.isDebugEnabled()) {
  LOG.debug("log debug");
}

  MDC从利用办法上有一点点分歧,小编对它的敞亮是MDC能够将一个甩卖线程中您想映以在此之前记文件中的数据统一保管起来,依照你的日志文件配置决定是不是输出。

  举例以下但不幸免以下处境能够设想动用MDC来实现指标

2、maven配置

       在maven配置文件中参预以下注重jar包。

 1 <dependency>
 2             <groupId>org.apache.logging.log4j</groupId>
 3             <artifactId>log4j-core</artifactId>
 4             <version>2.6.2</version>
 5         </dependency>
 6 
 7         <dependency>
 8             <groupId>org.apache.logging.log4j</groupId>
 9             <artifactId>log4j-api</artifactId>
10             <version>2.6.2</version>
11         </dependency>
12 
13         <dependency>
14             <groupId>org.apache.logging.log4j</groupId>
15             <artifactId>log4j-slf4j-impl</artifactId>
16             <version>2.6.2</version>
17         </dependency>
Logger LOG = LoggerFactory.getLogger("LOGNAME_OR_CLASS");if(LOG.isDebugEnabled { LOG.debug("log debug");}

MDC的使用

  org.slf4j.MDC笔者个人会用AOP或Filter或Interceptor那类工具协作使用,获得你期望输出到日志的变量并调用MDC.put(String
key, String val),举个例子上面代码片段第5行:

  @Around(value = "execution(* com.xx.xx.facade.impl.*.*(..))", argNames="pjp")
    public Object validator(ProceedingJoinPoint pjp) throws Throwable {
        try {
            String traceId = TraceUtils.begin();
            MDC.put("mdc_trace_id", traceId);
            Object obj = pjp.proceed(args);
            return obj;
        } catch(Throwable e) {
            //TODO
            处理错误
        } finally {
            TraceUtils.endTrace();
        }
    }    

   代码通过AOP记录了每一回央求的traceIdm并采用变量”mdc_trace_id”记录,在日记配置文件里须要设置变量本领将”mdc_trace_id”输出到日志文件中。小编以logback配置文件为例,看日志第10行%X{mdc_trace_id}:

  <appender name="ALL" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${CATALINA_BASE}/logs/all.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- daily rollover -->
            <fileNamePattern>${CATALINA_BASE}/logs/all.%d{yyyy-MM-dd}.log</fileNamePattern>
            <!-- keep 30 days' worth of history -->
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <encoder charset="UTF-8">
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - traceId:[%X{mdc_trace_id}] - %msg%n</pattern>
        </encoder>
    </appender>

3、log4j2配置

       
Configuration节点中有三个属性,status表示log4j自个儿的日记打字与印刷等级,假使设置为TRACE,能够看来调节台出口log4j本身的日志音信。monitorInterval表示每隔多少秒自动物检疫查评定配置文件的改观,单位是秒,最小的岁月距离是5秒。

       
Appenders中有一个Appender,表示从决定台出口,name属性为各个Appender的独一标志。PatternLayout定义了我们日志输出格式。

%d{yyyy-MM-dd HH:mm:ss.SSS}:表示输出的日子格式

%t:表示最近线程名称

%-5level:输出日志等第,-5表示左对齐並且固定输出5个字符

%l:输出语句所在的包名、类名、函数名、行数

%msg:输出日志的原委

%n:换行

%F 输出所在的类公事名

%L 输骑行号

%M 输出所在方法名

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <Configuration status="WARN" monitorInterval="30">
 3     <Appenders>
 4         <Console name="Console" target="SYSTEM_OUT">
 5             <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %l - %msg%n"/>
 6         </Console>
 7     </Appenders>
 8     <Loggers>
 9         <Root level="trace">
10             <AppenderRef ref="Console"/>
11         </Root>
12     </Loggers>
13 </Configuration>

金沙js333娱乐场 , 

     
 上边Java类中使用了slf4j的接口来兑现日志记录。那将会选择我们布署文件中Root根节点钦点的Appender,假诺大家从不和煦安排Logger,则会利用Root根节点的默许配置。

     
此时Root根节点的level是trace,所以大家得以看来有着的日志音讯都输出了。

 

 

金沙js333娱乐场 1

MDC从使用办法上稍加不一样,小编对它的明亮是MDC能够将一个甩卖线程中您想突显在日记文件中的数据统一管理起来,依照你的日记文件配置决定是还是不是输出。

MDC带来的平价

slf4j中MDC是何许鬼
slf4j除了trace、debug、info、warn、error那多少个日志接口外,还足以宽容MDC将数据写入日志。换句话说MDC也…

4、将日志输出到文件

       
如下配置了贰个名叫RollingFile的Appenders,将日志输出到钦点的文件中。fiileName表示日志的地方和文件名,filePattern表示当条件满足时,文件移动和重命名的准则。TimeBasedTriggeringPolicy须求和filePattern配套使用,由于filePattern配置的光阴十分小粒度是dd天,所以表示每天新建二个文本保留日志。SizeBasedTriggeringPolicy表示当文件大小大于钦定size时,生成新的公文物保护留日志。

       
大家自定义了一个Logger,引用RollingFile这一个日志适配器,当大家利用myLearningLog那几个Logger来记录日志时,日志音信就能够输出到文件中保留。

       
下边的代码应用自定义的Logger作为日志记录器。当运转上面代码时方可窥见,在D:/logs下面生成了一个app.log文件用于保存日志。

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <?xml version="1.0" encoding="UTF-8"?>
 3 <!-- staus:表示log4j自己的日志打印级别, 设置为TRACE可以看到控制台输出log4j的TRACE,DEBUG等信息-->
 4 <!-- monitorInterval:单位是秒,表示每个多少秒自动检测配置文件的更改,最小的时间间隔为5秒-->
 5 <Configuration status="WARN" monitorInterval="30">
 6     <Appenders>
 7         <Console name="Console" target="SYSTEM_OUT">
 8             <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %l - %msg%n"/>
 9         </Console>
10 
11         <RollingFile name="RollingFile" fileName="D:/logs/app.log"
12                      filePattern="D:/logs/$${date:yyyy-MM}/app-%d{yyyy-MM-dd}-%i.log">
13             <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %l - %msg%n">
14             </PatternLayout>
15             <Policies>
16                 <TimeBasedTriggeringPolicy interval="1"/>
17                 <SizeBasedTriggeringPolicy size="250 MB"/>
18             </Policies>
19         </RollingFile>
20     </Appenders>
21     <Loggers>
22         <Logger name="myLearningLog" level="trace" additivity="false">
23             <AppenderRef ref="RollingFile"/>
24         </Logger>
25         <Root level="trace">
26             <AppenderRef ref="Console"/>
27         </Root>
28     </Loggers>
29 </Configuration>

 

5、ThreadContext

     
  ThreadContext类似于log4j第11中学的MDC,能够用来寄放当前线程的上下文消息,他是各类线程持有一份,不相互影响。大家可以使用%X{key}的措施,收取在ThreadContext中存放的值,与日志一同输出。如下PatternLayou中的%X{name}和%X{age}。

 

       
在前后相继中经过ThreadContext中的put方法把大家须要保留的音信通过key-value的花样放进去,有一些类似map的操作。需求专心的是,如若选择import
org.slf4j.MDC包下的MDC存放数据,对log4j2是不可用的,在输出日志时就无法取到值,那是因为slf4j的MDC底层信任是log4j1。

 

转载至:

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注