Log4j2配置及与Logback对比

Log4j2 使用和配置

 

一、Maven配置

1、与SpringBoot集成

  

<dependency  

    <groupId>org.springframework.bootgroupId>  

    <artifactId>spring-boot-starterartifactId>  

    <exclusions>  

        <exclusion>  

            <groupId>org.springframework.bootgroupId>  

            <artifactId>spring-boot-starter-loggingartifactId>  

        exclusion>  

    exclusions

dependency>  

<dependency  

    <groupId>org.springframework.bootgroupId>

    <artifactId>spring-boot-starter-log4j2artifactId>

dependency>

 

二、log4j2.xml日志配置

简单配置如下:

xml version="1.0" encoding="UTF-8"?>

<configuration status="WARN" monitorInterval="30">

    <Appenders>

        <Console name="Console" target="SYSTEM_OUT">

            <PatternLayout pattern="%d [%t] %-5p [%c] - %m%n" />

        Console>

    Appenders>

    <Loggers>

        <logger name="org.thymeleaf" level="warn"/>

        <Root level="info">

            <AppenderRef ref="Console" />

        Root>

    Loggers>

Configuration>

1、PatternLayout 配置

示例如下:

%d{HH:mm:ss.SSS} [%thread] %-5level %logger:%line - %msg%n

等价于

%d{HH:mm:ss.SSS} [%t] %-5p %c:%L - %m%n

正式环境参考配置:

%d [%thread] %-5level %logger - %msg%n

开发环境参考配置:

%d{HH:mm:ss.SSS} [%thread] %-5level %C{9.1.1.9.}:%line - %msg%n

 

常用配置如下:

%d{yyyy-MM-dd HH:mm:ss, SSS} : 日志生产时间,输出到毫秒的时间

%-5level : 输出日志级别,-5表示左对齐并且固定输出5个字符,如果不足在右边补0

%c : logger的名称(%logger)

%t : 输出当前线程名称

%p : 日志输出格式

%m : 日志内容,即 logger.info("message")

%n : 换行符

%C : Java类名(%F)

%L : 行号

%M : 方法名

%l : 输出语句所在的行数, 包括类名、方法名、文件名、行数

hostName : 本地机器名

hostAddress : 本地ip地址

 

其他参见配置(供参考):

%d %p %C{1.} [%t] %m%n

%d [%t] %-5p [%c] - %m%n

%C{1}.%M %m %ex%n

[%date{HH:mm:ss.SSS}][%thread][%level][%class][%line]:%message%n

%-d [%t:%r] [%F:%L] - [%p] %m%n

%d [%t] %-5level %logger{36} - %msg%n

%d [%t]  %F %M %l- %-5level %logger{36} %msg%n

%d %5p --- [%t] %-40.40c{1.} : %m%n%xwEx

%d [%t] %-5level %logger{36} - %msg%n

%d{yyyy-MM-dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n

详细配置参见官方文档:http://logging.apache.org/log4j/2.x/manual/layouts.html

 

2、Appenders配置

详见官方文档:

http://logging.apache.org/log4j/2.x/manual/appenders.html

 

3、Filter配置

3.1 自定义Filter

编写一个自定义Filter,可以参考 org.apache.logging.log4j.core.filter.ThresholdFilter

例如 AppThresholdFilter,主要重写了下面一段,定义了一个 prefix 属性:

@PluginFactory

public static AppThresholdFilter createFilter(

        @PluginAttribute("level"final Level level,

        @PluginAttribute("prefix"final String prefix) {

    final Level actualLevel = level == null ? Level.ERROR : level;

    final Result onMatch = Result.NEUTRAL;

    final Result onMismatch = Result.DENY;

    return new AppThresholdFilter(actualLevel, onMatch, onMismatch, prefix);

}

然后在log4j2.xml的根节点配置自定义Filter的包路径,例如:

<Configuration status="info" packages="com.zollty">

然后就可以使用了,使用方法示例如下:

<AppThresholdFilter level="INFO" prefix="com.zollty" />

 

在比较深入的使用过程中,有两点明显的感受:

1、log4j2灵活性不够,体现在设计思路上,没logback那么贴合实践。

2、log4j2使用不够广泛,资料不多,深度使用的话,会遇到很多问题网上搜不到答案。

其他劣势:

  • Log4j2用户较少,网上的资料较少,没有logback成熟(2017年);

  • SpringBoot原生支持的是Logback(而非log4j2),对Logback的扩展非常好;

  • Log4j2的XML配置不支持表达式语言,不支持判断;

  • Log4j2引入外部配置文件只支持xInclude,不能满足某些需求;

  • Log4j2不支持Listener,不能满足某些需求。

(注意,我上面所说的都是 “深度使用”,如果只是简单使用的话,两者应该差不多)

 

logback优势:

根据log4j2的官方介绍,log4j2的性能要比logback高一点点,但据我对log4j1和Logback源码的熟悉,知道logback的作者几乎是个完美主义者,性能优化也做得非常好。所以,不要盲目相信log4j2的性能测试,所谓“王婆卖瓜,自卖自夸”,真实情况是:即便log4j2性能更好,那也只是在特定条件下或理论层面的,实际使用上,两者性能差不多。网上吹得最多的是Log4j 2的AsyncAppender实现类,由于引入了无锁解构的Disruptor队列,替代Logback的ArrayBlockingQueue,但是大家不妨想一下,Appender是可以扩展的,它的实现类不止一种,实际上,早在2015年甚至更早的时候,Logback的AsyncAppender就有了基于Disruptor的第三方扩展实现,参见DelegatingAsyncDisruptorAppender。

 

3、题外话:

log4j2推出时间晚,但是有严重的模仿logback的嫌疑,甚至可以说,log4j2很多设计是照抄logback的,但这种设计并没有得到 logback的作者以及开源社区的认可,即便它是Apache官方的项目,Spring等很多项目仍然没有把它纳入主流。

 

个人结论: 注重灵活可扩展性和成熟稳定就采用Logback,简单使用又注重性能可以使用Log4j 2尝鲜。Anyway,logback没什么不好!当前时间是2017年,后续发展如何,还得看两者的造化

从社区情况来看,目前logback用户更多,网上资料更多,github的stars数也更多,但log4j 2发展也比较快。

 

你可能感兴趣的:(JavaEE技术,Log4j2对比,Logback对比,Log4j2配置,Log4j2自定义Filter)