基础用法
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"当作普通字符打印: