zoukankan      html  css  js  c++  java
  • log4j相关配置

    1、概述

            log4j是Apache提供的一个日志实现,可以用于我们项目中的日志记录,有log4j1和log4j2两个版本,本文使用log4j2这个版本。SLF4J(Simple logging facade for Java)不是一个真正的日志实现,而是一个抽象层,相当于一个统一的接口,它允许你在后台使用任意一个日志类库。我们使用SLF4J提供的接口进行日志记录的编程,当我们需要更换具体的日志实现时,可以不需要更改日志的代码,只要加入响应的jar包和配置就可以切换实现。本文使用log4j+slf4j进行配置。

    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>

    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>
           下面Java类中使用了slf4j的接口来实现日志记录。这将会使用我们配置文件中Root根节点指定的Appender,如果我们没有自己配置Logger,则会使用Root根节点的默认配置。
          此时Root根节点的level是trace,所以我们可以看到所有的日志信息都输出了。
     
     

    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类似于log4j1中的MDC,可以用于存放当前线程的上下文信息,他是每个线程持有一份,不相互影响。我们可以使用%X{key}的方式,取出在ThreadContext中存放的值,与日志一起输出。如下PatternLayou中的%X{name}和%X{age}。
     
            在程序中通过ThreadContext中的put方法把我们需要保存的信息通过key-value的形式放进去,有点类似map的操作。需要注意的是,如果使用import org.slf4j.MDC包下的MDC存放数据,对log4j2是不可用的,在输出日志时就无法取到值,这是因为slf4j的MDC底层依赖是log4j1。
     
    转载至:http://blog.csdn.net/lzx_longyou/article/details/53354174
     
  • 相关阅读:
    WebSocket使用及优化(心跳机制与断线重连)
    JS案例:触底懒加载
    你知道近来年大火的DDD是如何兴起的吗?以及与微服务的关系
    Sql Server的Cross Apply用法
    跨域信息传递解决方案
    【转】理解字节序
    NATAPP优惠码
    <学习笔记>筛法
    <学习笔记>线性基
    【react + BizCharts】
  • 原文地址:https://www.cnblogs.com/huangjianping/p/8243970.html
Copyright © 2011-2022 走看看