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