Log4j2 快速入门
log4j 2.x 版本提供了更多的功能和更加简便的使用方式,和1.X版本相比使用过程有些不同,其中比较大的改动是取消了 log4j.propelog配置文件,使用 xml,json,jsn 格式作为配置文件,同时修改了部分对象的调用过程,如 Logger 对象等,以下是Log4j2 的快速使用过程:
在官方下载log4j 2,下载地址:https://logging.apache.org/log4j/2.x/download.html
将以下的 jar 包导入到项目依赖 lib 中:
-
log4j-core-xx.jar
-
log4j-api-xx.jar
也可以通过 在 Maven 项目的 pom.xml 引入:
<dependencies> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.x</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.x</version> </dependency> </dependencies>
之后在项目工程的 src 目录下创建一个 log4j2.xml ,里面写入:
<?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="debug"> <AppenderRef ref="Console" /> </Root> </Loggers> </Configuration>
之后在工程里就可以使用 log4j 记录日志了,以下是简单的测试代码:
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; public class TestLog4j { private static final Logger log = LogManager.getLogger(); public static void main(String[] args){ log.debug("test debug message"); //Logger的各种记录方法; log.info("test info message"); log.warn("test warn message"); log.error("test error message"); log.fatal("test fatal message"); } }
以上代码在控制台输出
20:35:28.179 [main] DEBUG demo.TestLog4j - test debug message 20:35:28.181 [main] INFO demo.TestLog4j - test info message 20:35:28.181 [main] WARN demo.TestLog4j - test warn message 20:35:28.181 [main] ERROR demo.TestLog4j - test error message 20:35:28.181 [main] FATAL demo.TestLog4j - test fatal message
以上就是 Log4j2 的快速使用过程,以下说明各个部分的使用细节;
日志记录的级别
log4j 的日志记录级别由低到高如下表:
trace | 栈追踪级别,细粒度最低的级别,一般很少使用; |
debug
|
调试级别,在调试过程中很最经常使用,一般在工程中会以debug最为最低级别,主要用于代替Eclipse和IDEA的debug功能,用于输出调试信息; |
info | 用于输出程序运行中重要或感兴趣的信息,在生产环境中最经常使用; |
warn | 指定潜在的警告信息,类似于java中的@warn注解 |
error | 指定错误信息,但仍然允许程序继续运行,常用在记录catch捕获到的异常信息; |
fatal | 指定重大错误信息,这种等级的错误可能会导致程序中止; |
off | 最高等级,这个参数只是为了关闭日志记录 |
这些级别的等级排布:trace < debug < info < warn < error < fatal
配置文件说明
一般会把配置文件命名为 log4j2.xml ,同时放置在项目src的目录下,关于log4j2调用配置文件的顺序,可以参考官方说明:
https://logging.apache.org/log4j/2.x/manual/configuration.html#AutomaticConfiguration
一个典型的配置文件如下:
<?xml version="1.0" encoding="UTF-8"?> <Configuration status="WARN"> <Appenders> <Console name="myConsole" target="SYSTEM_OUT"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" /> </Console> </Appenders> <Loggers> <Root level="debug"> <AppenderRef ref="myConsole" /> </Root> </Loggers> </Configuration>
这里补充Log4j的3个主要的对象介绍:
-
Logger: 负责捕获记录信息;
-
Appender : 负责发布日志信息,同时决定日志的发送目的地;
-
Layouter: 负责格式化不同风格的日志信息。
<Configuration>
log4j2.xml 的根节点,内部包含<Appends>、<Loggers>等多种节点;
status属性指定默认的优先级(即在内部logger没有指定优先级的情况下,为其指定的优先级);
可以添加一个 monitorInterval 指定每隔多少秒重新读取配置文件,可以在不重启的情况下读取该配置文件;
<Appenders>
定义各种 Appender 输出器,包含各个appender,有各种种类的appender标签,其中有2种比较常用的标签:<Console>、<File>,分别代表控制台输出、文件输出;
<Console>
控制台输出类型appender,其中 name属性为该appender的标识名,traget指定输出目的地;
<PatternLayout>
用于appender输出的格式化,pattern属性为一个输出格式的字符串;
如%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n
中的含义如下:
-
%d{HH:mm:ss.SSS}
:表示输出到毫秒的时间 -
%t
:输出当前线程名称(t / thread) -
p / le / level
:输出日志级别。 -
%-5level
:输出日志级别,-5表示左对齐并且固定输出5个字符 -
%logger
:输出logger名称,如果Logger没有名称,则不输出 -
%logger{36}
:表示logger名字最长36个字符,否则按照句点分割 -
%msg
:输出日志文本(m / msg / message) -
%n
:换行 -
%F
:输出所在的类文件名,如Client.java -
%L
:输出行号 -
%M
:输出所在方法名
输出以下格式的文本:
20:35:28.181 [main] INFO demo.TestLog4j - test info message
以下是一个在debug常用的格式字符串,用于输出debug的详细信息:
"%d{yyyy.MM.dd HH:mm:ss.SSS} [%t] %-5level %logger{36} %F:%M(line:%L) - %msg%n"
输出格式如下:
2017.07.27 14:30:21.889 [main] DEBUG demo.TestLog4j TestLog4j.java:main(line:17) - test debug message
logger{length}输出日志的logger名,可有一个整形参数,功能是缩短logger名,设置为0表示只输入logger最右边。
Conversion specifier | Logger name | Result |
---|---|---|
%logger | mainPackage.sub.sample.Bar | mainPackage.sub.sample.Bar |
%logger{0} | mainPackage.sub.sample.Bar | Bar |
%logger{5} | mainPackage.sub.sample.Bar | m.s.s.Bar |
%logger{10} | mainPackage.sub.sample.Bar | m.s.s.Bar |
%logger{15} | mainPackage.sub.sample.Bar | m.s.sample.Bar |
%logger{16} | mainPackage.sub.sample.Bar | m.sub.sample.Bar |
%logger{26} | mainPackage.sub.sample.Bar | mainPackage.sub.sample.Bar |
%d{HH:mm:ss.SSS} 输出日志的打印日志,模式语法与 java.text.SimpleDateFormat
兼容。看上去 %d 就已经够好了
Conversion Pattern | Result |
---|---|
%d | 2006-10-20 14:06:49,812 |
%date | 2006-10-20 14:06:49,812 |
%date{ISO8601} | 2006-10-20 14:06:49,812 |
%date{HH:mm:ss.SSS} | 14:06:49.812 |
%date{dd MMM yyyy ;HH:mm:ss.SSS} | 20 oct. 2006;14:06:49.812 |
可选的格式修饰符位于“%”和转换符之间。第一个可选修饰符是左对齐 标志,符号是减号“-”;
接着是可选的最小宽度 修饰符,用十进制数表示。如果字符小于最小宽度,则左填充或右填充,默认是左填充(即右对齐),填充符为空格。
如果字符大于最小宽度,字符永远不会被截断。
<Loggers>
定义各种loggers,包含<Root>和<Logger>2种标签,其中<Root>为根logger,即在代码中 LogManager.getlogger() 没有指定参数的情况下委派的默认logger,这些logger会包含一个<AppenderRef >用于指定该 logger 的 appender,在其 ref 属性表示该 append的 name 标识;
指定Logger
在代码 Logger logger = LogManager.getLogger()
中,如果不指定Logger name,那么lg4j会直接调用<Root>的Logger,在使用 %logger 会输出所调用类的class名,如以上示例例子会输出“demo.Log4jTest”,如果要指定一个 Logger 来处理该日志收集,可以如下设置:
代码中:
private static final Logger log = LogManager.getLogger("mylogger"); public static void main(String[] args){ log.debug("test debug message"); log.info("test info message"); log.warn("test warn message"); log.error("test error message"); log.fatal("test fatal message"); }
log4j2.xml中:
<Configuration status="WARN" monitorInterval="300"> <Appenders> <Console name="myConsole" target="SYSTEM_OUT"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" /> </Console> </Appenders> <Loggers> <Logger name="mylogger" level="debug" additivity="false"> <AppenderRef ref="myConsole" /> </Logger> <Root level="debug"> <AppenderRef ref="myConsole" /> </Root> </Loggers> </Configuration>
<Logger> 中 additivity="false" 表示在该logger中输出的日志不会再延伸到父层 logger,这里如果改为true,则会延伸到Root Logger,即Root Logger的配置也会输出一次。
指定Appender
通过Appender可以指定输出的目的地和格式,常用的有输出到控制台和文件,即<Console><File>,
以下示例者两种输出形式;
<Configuration status="WARN" monitorInterval="300"> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" /> </Console> <File name="myfile" fileName="D:/logs/app.log"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" /> </File> </Appenders> <Loggers> <Logger name="mylog" level="debug" additivity="false"> <AppenderRef ref="myfile" /> </Logger> <Root level="error"> <AppenderRef ref="Console" /> </Root> </Loggers> </Configuration>
更多关于 Log4j2 的用法和概念参见官方的说明文档:
参考文献