log4j2的使用

基础用法

1. pom文件导入依赖

junit用来做测试

        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.5</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>2.5</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>

2. resource目录下新增log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration status="error">
    <!--  定义所有的appender -->
    <appenders>
        <!--   输出控制台的配置 -->
        <Console name="Console" target="SYSTEM_OUT">
            <!--    控制台只输出level及以上级别的信息(onMatch),其他的打印拒绝(onMismatch) -->
            <ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>
            <!--    输出日志的格式 -->
            <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - |%m|%xEx%n"/>
        </Console>

        <!--   append为TRUE表示消息增加到指定文件中,false表示消息覆盖指定的文件内容,默认值是true -->
        <File name="log" fileName="f:/log4j2/test.log" append="false">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %m%xEx%n"/>
        </File>

        <!--   添加过滤器ThresholdFilter,可以有选择的输出某个级别以上的类别 onMatch="ACCEPT" onMismatch="DENY"意思是匹配就接受,否则直接拒绝 -->
        <File name="ERROR" fileName="f:/log4j2/error.log">
            <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="%d{yyyy.MM.dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %m%xEx%n"/>
        </File>

        <!--   打印出所有的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档 -->
        <RollingFile name="RollingFile" fileName="f:/log4j2/web.log" filePattern="logs/${date:yyyy-MM}/web-%d{MM-dd-yyyy}-%i.log.gz">
            <PatternLayout pattern="%d{yyyy-MM-dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %m%xEx%n"/>
            <SizeBasedTriggeringPolicy size="2MB"/>
        </RollingFile>
    </appenders>

    <!--  定义logger,只有定义了logger并引入的appender,appender才会生效 -->
    <loggers>
        <!--   建立一个默认的root的logger -->
        <root level="trace">
            <appender-ref ref="RollingFile"/>
            <appender-ref ref="Console"/>
            <appender-ref ref="ERROR" />
            <appender-ref ref="log"/>
        </root>

    </loggers>
</configuration>

2. 测试

public class Log4j2Test {
    Logger logger= LogManager.getLogger(Log4j2Test.class);
    @Test
    public void test1() {
        logger.error("hello);
    }
}

log4j2.xml的%符号详解

%d 输出时间,可指定格式,比如:%-d{yyyy-MM-dd HH:mm:ss,SSS}按照年月日时分秒打印
%p 输出日志级别
%t 输出该日志事件的线程名
%c 输出该日志信息所在的类名,比如com.xxx.xxx
%M 输出该日志信息的所在的方法名
%F 输出该日志信息的所在的文件名,比如xxx.java
%L 输出该日志信息在代码文件中的行号
%l 输出该日志信息的位置信息,相当于%c.%M(%F:%L)的组合,显示为com.xxx.xxx.方法名(xxx.java:行号)
%m 输出具体的日志信息,也可以用%msg代替
%n 输出一个回车换行符
%% 输出一个"%"

log4j2.xml的PatternLayout中有个enc标签,可对日志进行转义,可以把普通日志转义成HTML,XML,JSON,CRLF,默认是转义成HTML。常见用法如下:

a.转义成HTML:%enc{%m}

b.转义成JSON:%enc{%m}{JSON}

使用log4j2打印日志踩坑

1. 使用enc转义后无法识别回车换行:

 如下是测试代码,打印的日志中包含由"\n"回车符号:

public class Log4j2Test {
    Logger logger= LogManager.getLogger(Log4j2Test.class);
    @Test
    public void test1() {
        logger.error("hello : " + "it is \n" + "error");
    }
}

a. 如果是一个普通的打印配置:

<PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - |%m|%xEx%n"/>

        打印结果如下,能准确识别出这个回车符号:

b.如果是加了enc转义符号:

<PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - |%enc{%m}|%xEx%n"/>

打印结果如下,无法识别回车符号,把"\n"当作普通字符打印:

相关推荐

  1. log4j日志框架使用

    2024-02-20 09:36:05       53 阅读
  2. 快速使用Log4j2日志框架

    2024-02-20 09:36:05       30 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-02-20 09:36:05       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-02-20 09:36:05       100 阅读
  3. 在Django里面运行非项目文件

    2024-02-20 09:36:05       82 阅读
  4. Python语言-面向对象

    2024-02-20 09:36:05       91 阅读

热门阅读

  1. Go json Marshal & UnMarshal 的一点小 trick

    2024-02-20 09:36:05       54 阅读
  2. 【LeetCode-494】目标和(回溯&动归)

    2024-02-20 09:36:05       48 阅读
  3. 第13章 网络 Page749~755 asio核心类 ip::tcp::acceptor

    2024-02-20 09:36:05       43 阅读
  4. vue小记——this

    2024-02-20 09:36:05       51 阅读
  5. mac下mysql 常用命令

    2024-02-20 09:36:05       45 阅读
  6. PaddleSeg分割框架解读[01] 核心设计解析

    2024-02-20 09:36:05       41 阅读