原文网址:Java日志--log4j2/log4j--使用/教程/实例_IT利刃出鞘的博客-CSDN博客
简介
本文用示例介绍log4j2与log4j的用法。同时也会介绍相关知识:它们的区别等。
log4j2和log4j的区别
1、配置文件类型
log4j:是通过一个.properties的文件作为主配置文件的,而现在的
log4j2:则已经弃用了这种方式,采用的是.xml,.json或者.jsn这种方式来做。
2、核心JAR包
log4j:log4j-1.2.17.jar
log4j2:log4j-api-2.13.0.jar 和 log4j-core-2.13.0.jar
maven管理中,log4j和log4j2的包路径是不同的,Apache为了区分,包路径都更新了,大家甚至可以在一个项目中使用2个版本的日志!
3、文件渲染
log4j:在web.xml中进行配置
log4j2:比较简单,以maven工程为例,我们只需要把log4j2.xml放到工程resource目录下就行了。
4、调用
log4j:private final Logger LOGGER = Logger.getLogger(Test.class.getName());
log4j2:private static Logger logger = LogManager.getLogger(Test.class.getName());
log4j2
配置文件
详细配置:Log4j2 中文文档 - Configuration | Docs4dev
log4j2依然包含三个组件,分别是 Logger(记录器)、Appender(输出目的地)、Layout(日志布局)。
log4j2有默认的配置,如果要替换配置,只需要在classpath根目录下放置log4j2.xml。
log4j 2.0与以往的1.x有一个明显的不同,其配置文件只能采用.xml, .json或者 .jsn。在默认情况下,系统选择configuration文件的优先级(classpath下):log4j-test.json/log4j-test.jsn > log4j2-test.xml > log4j.json/log4j.jsn > log4j2.xml
log4j2.xml最简配置
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="error">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
</Console>
</Appenders>
<Loggers>
<Root level="trace">
<Appender-ref ref="Console"/>
</Root>
</Loggers>
</Configuration>
配置详解
<?xml version="1.0" encoding="UTF-8"?>
<!--status:设置log4j2自身内部的信息输出,可不设置,设置成trace时,会打印log4j2内部各种详细输出-->
<!-- 高->低:OFF、FATAL、ERROR、WARN、INFO、DEBUG、TRACE、ALL -->
<!--monitorInterval:设置间隔秒数,最小为5s(不用写单位)。Log4j2能自动检测配置文件是否修改,若修改则重新配置,此项-->
<Configuration status="error">
<!--先定义所有的appender -->
<Appenders>
<!-- 输出到控制台的配置 -->
<!-- target:SYSTEM_OUT 或 SYSTEM_ERR,默认是SYSTEM_OUT -->
<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 - %msg%xEx%n"/>
</Console>
<!--此文件会打印出所有信息 -->
<!--append:TRUE表示消息增加到指定文件中,false表示消息覆盖指定的文件,默认值是true -->
<File name="log" fileName="D:/logs/log4j2.log" append="false">
<PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
</File>
<!--ThresholdFilter:过滤器,可输出某个级别以及以上的类别 -->
<!-- onMatch="ACCEPT" onMismatch="DENY"意思是匹配就接受,否则直接拒绝 -->
<File name="ERROR" fileName="D:/logs/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 - %msg%xEx%n"/>
</File>
<!--打印出所有的信息,每次大小超过size,则这size大小的日志会自动存入文件并进行压缩,作为存档 -->
<RollingFile name="RollingFile" fileName="D:/logs/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 - %msg%xEx%n"/>
<SizeBasedTriggeringPolicy size="2MB"/>
</RollingFile>
</Appenders>
<!--然后定义logger,只有定义了logger并引入刚才的的appender配置,appender才会生效 -->
<!-- 若logger标签定义了level,则会覆盖root标签的level,否则使用root标签的level。见下边的 “指定特定类的输出” -->
<Loggers>
<Root level="trace">
<Appender-ref ref="RollingFile"/>
<Appender-ref ref="Console"/>
<Appender-ref ref="ERROR" />
<Appender-ref ref="log"/>
</Root>
</Loggers>
</Configuration>
缺省配置(若没有提供自己的配置文件,log4j2会用此配置)
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
</Appenders>
<Loggers>
<Root level="error">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
指定特定类的输出
示例1:com.foo.Bar类下输出TRACE及以上到控制台外,其他只输出ERROR以上的日志。
配置:
<Console name="Console" target="SYSTEM_OUT">
<ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
</Console>
<Loggers>
<Logger name="com.foo.Bar" level="TRACE"/>
<Root level="ERROR">
<AppenderRef ref="Console">
</Root>
</Loggers>
因为com.foo.Bar没有自己的Appender,所以会使用ROOT的Appender。如果自己也配置了在控制台打印,就要注意可加性。如过com.foo.Bar如下配置,会打印两次。
<Logger name="com.foo.Bar" level="trace">
<AppenderRef ref="Console"/>
</Logger>
示例2:com.foo.Bar的trace及以上只打印到文件,不打印到控制台
如果不想使用Root的Appender,可以加上additivity="false"
参数。
(注意:additivity默认为true。下边配置文件中,如果不加additivity="false",则
com.foo.Bar的trace及以上既打印到文件,又打印到控制台)。
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
<RollingFile name="RollingFile" fileName="${sys:user.home}/logs/trace.log"
filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log">
...
</RollingFile>
</Appenders>
<Loggers>
<Logger name="com.foo.Bar" level="trace" additivity="false">
<AppenderRef ref="RollingFile"/>
</Logger>
<Root level="error">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
打印格式化日志信息
符号 | 含义 | 示例 |
%c或%class | 列出logger名字空间全称,如果加上{<层数>}表示列出从最内层算起的指定层数的名字空间 | 假设当前logger名字空间是”a.b.c” %c a.b.c %c{2} b.c |
%C | 列出调用logger的类的全名(包含包路径) | 假设当前类是”org.apache.xyz.SomeClass” %C org.apache.xyz.SomeClass %C{1} SomeClass |
%d | 输出日志时间点的日期或时间,默认格式为ISO8601,也可在其后指定格式, | 比如:%d{yyyMMMddHH:mm:ss,SSS}, 输出:2005/10/12 22:23:30,117 比如:%d{DATE} 输出:12 Oct 2005 22:23:30,117 {}内还可以选:ABSOLUTE,ISO8601等 |
%F | 显示调用logger的类文件名 | Myclass.java |
%l | 输出日志事件的发生位置,包括类目名、发生的线程,行数。 | 举例:Testlog4.main(TestLog4.java:10) |
%L | 显示调用logger的代码行 | 举例:10 |
%m或%msg | 显示代码中指定的消息 | |
%M | 显示调用logger的方法名 | |
%n | 输出一个当下平台的换行符 | |
%p | 输出该条日志的优先级,即DEBUG,INFO... | |
%r | 输出自应用启动到输出该日志已经经过的毫秒数 | |
%t | 输出产生该日志事件的线程名 | |
%x | 按NDC(Nested Diagnostic Context,线程堆栈)顺序输出日志 | 假设某程序Myapp调用com.foo.Bar %c %x-%m%n 输出结果: Myapp-Call com.foo.Bar com.foo.Bar-Log in Bar Myapp-Return to Myapp |
%X | 按MDC(Mapped Diagnostic Context,线程映射表)输出日志。通常用于多个客户端连接同一个服务器,方便服务器区分是哪个客户端访问留下的日志。 | %X{5} 记录代号为5的客户端的日志 |
%% | 显示一个百分号 |
ThresholdFilter
上边是文章的部分内容,为便于维护,全文已转移到此网址:Java日志-log4j2/log4j-使用/教程/实例 - 自学精灵