Log4j2配置

1、概述

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

2、maven配置

       在maven配置文件中加入以下依赖jar包。
<dependencies>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.6.2</version>
        </dependency>

        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>2.6.2</version>
        </dependency>

        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
            <version>2.6.2</version>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.21</version>
        </dependency>
    </dependencies>

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 输出所在方法名

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" monitorInterval="30">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %l - %msg%n"/>
        </Console>
    </Appenders>
    <Loggers>
        <Root level="trace">
            <AppenderRef ref="Console"/>
        </Root>
    </Loggers>
</Configuration>
        下面Java类中使用了slf4j的接口来实现日志记录。这将会使用我们配置文件中Root根节点指定的Appender,如果我们没有自己配置Logger,则会使用Root根节点的默认配置。
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Learning1 {
    private static final Logger LOGGER = LoggerFactory.getLogger(Learning1.class);

    public static void main(String[] args) {
        LOGGER.trace("learning1 log4j trace");
        LOGGER.debug("learning1 log4j debug");
        LOGGER.info("learning1 log4j info");
        LOGGER.warn("learning1 log4j warn");
        LOGGER.error("learning1 log4j error");
    }
}
      此时Root根节点的level是trace,所以我们可以看到所有的日志信息都输出了。
2016-11-26 20:24:17.392 [main] TRACE edu.fjnu.log4j.learning.Learning1.main(Learning1.java:13) - learning1 log4j trace
2016-11-26 20:24:17.395 [main] DEBUG edu.fjnu.log4j.learning.Learning1.main(Learning1.java:14) - learning1 log4j debug
2016-11-26 20:24:17.395 [main] INFO  edu.fjnu.log4j.learning.Learning1.main(Learning1.java:15) - learning1 log4j info
2016-11-26 20:24:17.395 [main] WARN  edu.fjnu.log4j.learning.Learning1.main(Learning1.java:16) - learning1 log4j warn
2016-11-26 20:24:17.395 [main] ERROR edu.fjnu.log4j.learning.Learning1.main(Learning1.java:17) - learning1 log4j error

4、将日志输出到文件

        如下配置了一个名为RollingFile的Appenders,将日志输出到指定的文件中。fiileName表示日志的位置和文件名,filePattern表示当条件满足时,文件移动和重命名的规则。TimeBasedTriggeringPolicy需要和filePattern配套使用,由于filePattern配置的时间最小粒度是dd天,所以表示每一天新建一个文件保存日志。SizeBasedTriggeringPolicy表示当文件大小大于指定size时,生成新的文件保存日志。
        我们自定义了一个Logger,引用RollingFile这个日志适配器,当我们使用myLearningLog这个Logger来记录日志时,日志信息就会输出到文件中保存。
<?xml version="1.0" encoding="UTF-8"?>
<!-- staus:表示log4j自己的日志打印级别, 设置为TRACE可以看到控制台输出log4j的TRACE,DEBUG等信息-->
<!-- monitorInterval:单位是秒,表示每个多少秒自动检测配置文件的更改,最小的时间间隔为5秒-->
<Configuration status="WARN" monitorInterval="30">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %l - %msg%n"/>
        </Console>

        <RollingFile name="RollingFile" fileName="D:/logs/app.log"
                     filePattern="D:/logs/$${date:yyyy-MM}/app-%d{yyyy-MM-dd}-%i.log">
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %l - %msg%n">
            </PatternLayout>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1"/>
                <SizeBasedTriggeringPolicy size="250 MB"/>
            </Policies>
        </RollingFile>
    </Appenders>
    <Loggers>
        <Logger name="myLearningLog" level="trace" additivity="false">
            <AppenderRef ref="RollingFile"/>
        </Logger>
        <Root level="trace">
            <AppenderRef ref="Console"/>
        </Root>
    </Loggers>
</Configuration>
        下面的代码使用自定义的Logger作为日志记录器。当运行下面代码时可以发现,在D:/logs下面生成了一个app.log文件用于保存日志。
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Learning2 {
    private static final Logger LOGGER = LoggerFactory.getLogger("myLearningLog");

    public static void main(String[] args) {
        LOGGER.trace("learning2 log4j trace");
        LOGGER.debug("learning2 log4j debug");
        LOGGER.info("learning2 log4j info");
        LOGGER.warn("learning2 log4j warn");
        LOGGER.error("learning2 log4j error");
    }
}

5、ThreadContext

        ThreadContext类似于log4j1中的MDC,可以用于存放当前线程的上下文信息,他是每个线程持有一份,不相互影响。我们可以使用%X{key}的方式,取出在ThreadContext中存放的值,与日志一起输出。如下PatternLayou中的%X{name}和%X{age}。
<Configuration status="WARN" monitorInterval="30">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %l - %X{name} - %X{age} - %msg%n"/>
        </Console>
    </Appenders>
    <Loggers>
        <Root level="trace">
            <AppenderRef ref="Console"/>
        </Root>
    </Loggers>
</Configuration>
        在程序中通过ThreadContext中的put方法把我们需要保存的信息通过key-value的形式放进去,有点类似map的操作。需要注意的是,如果使用import org.slf4j.MDC包下的MDC存放数据,对log4j2是不可用的,在输出日志时就无法取到值,这是因为slf4j的MDC底层依赖是log4j1。
import org.apache.logging.log4j.ThreadContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Learning3 {
    private static final Logger LOGGER = LoggerFactory.getLogger(Learning3.class);

    public static void main(String[] args) {
        ThreadContext.put("name", "xiaoming");
        ThreadContext.put("age", "18");

        LOGGER.trace("Learning3 log4j trace");
        LOGGER.debug("Learning3 log4j debug");
        LOGGER.info("Learning3 log4j info");
        LOGGER.warn("Learning3 log4j warn");
        LOGGER.error("Learning3 log4j error");

        System.out.printf(ThreadContext.get("name") + "-" + ThreadContext.get("age"));
    }
}
        以下是输出的结果,可以到我们通过ThreadContext中的put方法存放的数据,被一起输出来。
2016-11-27 13:22:52.101 [main] TRACE edu.fjnu.log4j.learning.Learning3.main(Learning3.java:17) - xiaoming - 18 - Learning3 log4j trace
2016-11-27 13:22:52.104 [main] DEBUG edu.fjnu.log4j.learning.Learning3.main(Learning3.java:18) - xiaoming - 18 - Learning3 log4j debug
2016-11-27 13:22:52.104 [main] INFO  edu.fjnu.log4j.learning.Learning3.main(Learning3.java:19) - xiaoming - 18 - Learning3 log4j info
2016-11-27 13:22:52.104 [main] WARN  edu.fjnu.log4j.learning.Learning3.main(Learning3.java:20) - xiaoming - 18 - Learning3 log4j warn
2016-11-27 13:22:52.105 [main] ERROR edu.fjnu.log4j.learning.Learning3.main(Learning3.java:21) - xiaoming - 18 - Learning3 log4j error
xiaoming-18


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值