Log4j2 简介

介绍

    Log4j2是Log4j的升级版,与之前的版本Log4j 1.x相比、有重大的改进,修正了Logback固有的架构问题的同事,改进了许多Logback所具有的功能。


特性

一、API 分离

    Log4j2将API与实现分离开来。开发人员现在可以很清楚的知道能够使用哪些没有兼容问题的类和方法,同事又允许通过自己实现来增加功能。

二、改进性能

    Log4j2的性能在某些关键领域比Log4j 1.x更快,而且大多数情况下与Logback相当。

三、支持多种 API

    Log4j 2提供了最棒的性能的同事,还支持SLF4J和公共日志记录API。

四、自动装加载
    像Logback一样,一旦配置发生改变,Log4j2可以自动载入这些更改后的配置信息,又与Logback不同,配置发生改变时不会丢失任何日志事件。

五、高级过滤功能

    与Logback类似,Log4Jj2可以支持基于上下文数据、标记、正则表达式以及日志时间中的其他组件的过滤。Log4j2能够专门制定适用于所有的事件,无论这些事件在传入Loggers之前还是正在传给appenders。另外,过滤器还可以与Loggers关联其阿里。与Logback不同的是,Filter公共类可以用于任何情况。

六、插件架构

    所有可以配置的组件都以Log4j插件的形式来定义。同样地,不需要修改任何Log4j代码就可以创建新的Appender、layout、Pattern Convert等等。Log4j自动识别预定义的插件,如果在配置中引用到这些插件,Log4j就会自动载入使用。

七、属性支持

    属性可以在配置文件中引用,也可以直接替代或传入潜在的组件,属性在这些组件中能够动态解析。属性可以是配置文件、属性文件、环境变量、线程上下文映射以及事件中的数据中定义的值。用户可以通过增加自己的Lookup插件来定制自己的属性。

改进

一、更为先进的API (Modern API)在此之前,程序员们如下方式进行日志记录:

    if(logger.isDebugEnabled()) {
        logger.debug("Hi, " + u.getA() + “ “ + u.getB());
    }

许多人都会抱怨上述代码的可读性太差了。如果有人忘记写if语句,程序输出中会多出很多不必要的字符串。现在Java虚拟机(JVM)也许对字符串的打印和输出进行了很多优化,但是难道我们仅仅依靠JVM优化来解决上述问题?

log4j2 开发团队鉴于以上考虑对API进行了完善。

现在你可以这样写代码:

logger.debug("Hi, {} {}", u.getA(), u.getB());

和其他一些流行的日志框架一样,新的API也支持变量参数的占位符功能。

log4j2 还支持其他一些很棒的功能,像Markers 和 Flow Traces:

    private Logger logger = LogManager.getLogger(MyApp.class.getName());
    private static final Marker QUERY_MARKER = MarkerManager.getMarker("SQL");
    ...
    public String doQuery(String table) {
        logger.entry(param);
        logger.debug(QUERY_MARKER, "SELECT * FROM {}", table);
        return logger.exit();
    }

Markers可以帮助你很快地找到具体的日志项(Log Entries)。而在某个方法的开头和结尾调用Flow Traces中的一些方法,你可以在日志文件中看到很多新的跟踪层次的日志项,也就是说,你的程序工作流(Program Flow)被记录下来了。下面是Flow Traces的一些例子:

9:08:07.056 TRACE com.test.TestService 19 retrieveMessage - entry
9:08:07.060 TRACE com.test.TestService 46 getKey - entry

二、强大的配置功能(Powerful 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>

上面说的知识一部分改进,你还可以自动重新加载配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<configuration monitorInterval="30">
    ...
</configuration>

监控的时间间隔单位为秒,最小值是5。这意味着,log4j2在配置改变的情况下可以重新配置日志记录行为。如果值设置为0或者负数,log4j2不会对配置变更进行检测。最为称道的一点是:不像其他日志框架,log4j2在重新配置的时候不会丢失之前的日志记录。

三、java 5并发性(Concurrency)

    有一段文档是这样描述的:“log4j2 利用 Java 5 中的并发特性支持,尽可能地执行最低层次的加锁...”。Apache log4j2 解决了许多在log4j1.x 中仍然存留的死锁问题。如果你的程序仍然饱受内存泄漏的折磨,请毫不犹豫地试一下log4j2。


使用

一、程序中如果使用Log4j2?

    在你的程序中使用Log4j2之前必须确保log4j-api.jar和log4j-core.jar在程序的classpath中。使用Maven将下面的依赖加入pom.xml。

<dependencies>
  <dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>2.11.0</version>
  </dependency>
  <dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.11.0</version>
  </dependency>
</dependencies>

这里随便写个类,调用就是这么简单,log4j的核心在配置文件上,若不创建配置文件,使用默认配置文件。

问:那么默认的Level是多少呢?

   答: 默认的输出地是console,默认的级别是ERROR级别。

/**
 * Created by Ray on 2018/3/28 0028.
 **/
public class Hello {

    static Logger logger = LogManager.getLogger(Hello.class.getName());

    public static void main(String[] args) {
        logger.trace("entry"); //开始时调用
        logger.error("Did it again!"); //error级别的信息
        logger.info("我是info信息"); //info级别的信息
        logger.debug("我是debug信息");
        logger.warn("我是warn信息");
        logger.fatal("我是fatal信息");
        logger.log(Level.DEBUG,"我是debug信息"); //指定Level类型的调用
        logger.trace("exit"); //结束时调用
    }
}

输出结果:


代码跟输出不一致? 

莫慌!先来看看日志级别

转载于:https://www.cnblogs.com/Remenber-Ray/p/8858038.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值