Log4j2 快速入门 —— 属性、级别介绍(一)

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

这些级别之间的包含的关系,比如将日志级别设置为 debug,那么大于等于这个级别的日志都会输出,即输出 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 的用法和概念参见官方的说明文档:

参考文献


赞(52) 打赏
未经允许不得转载:优客志 » JAVA开发
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏