介绍

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"); //结束时调用
    }
}

输出结果:

代码跟输出不一致?

莫慌!先来看看日志级别

Log4j2 简介的更多相关文章

  1. logger(三)log4j2简介及其实现原理

    一.log4j2简介 log4j2是log4j 1.x和logback的改进版,据说采用了一些新技术(无锁异步.等等),使得日志的吞吐量.性能比log4j 1.x提高10倍,并解决了一些死锁的bug, ...

  2. log4j2简介

    Apache Log4j 2 Apache Log4j 2是对Log4j的升级,它比它的前辈Log4j 1提供了显著的改进.在解决Logback的架构中存在的一些固有问题时,提供了许多可用的改进. 特 ...

  3. log4j2笔记 #02# 启用异步日志

    索引 参考 Making All Loggers Asynchronous 第一步,添加相应的disruptor库 第二步,设置系统属性log4j2.contextSelector 第三步,检验! 参 ...

  4. log4j2使用教程

    Log4j2简介 log4j2是log4j 1.x 的升级版,2015年5月,Apache宣布log4j1.x 停止更新.最新版为1.2.17.   log4j2参考了logback的一些优秀的设计, ...

  5. Log4j2基本使用入门

    1.Log4j2简介 Apache Log4j 2是日志框架Log4j的升级, 它比其前身Log4j 1.x提供了重要的改进, 并且参考了Logback中许多有用的改进, 同时修复了Logback的一 ...

  6. Log4j2日志技术总结

    前言 现在流行是SLF4j和Log4j2组合的日志技术,但为了日志技术归类,故前因后果都将做一下介绍. 市场上流行的日志框架 JUL java util logging Java开发团队开发,Jdk原 ...

  7. 《手把手教你》系列基础篇(八十七)-java+ selenium自动化测试-框架设计基础-Log4j 2实现日志输出-上篇(详解教程)

    1.简介 Apache Log4j 是一个非常古老的日志框架,并且是多年来最受欢迎的日志框架. 它引入了现代日志框架仍在使用的基本概念,如分层日志级别和记录器. 2015 年 8 月 5 日,该项目管 ...

  8. 日志组件二:log4j2

    一.背景 随着业务服务(Server App)逐渐增加,我们的业务系统中的日志输出面临的问题越来越多,高并发下对磁盘io这块消耗的越来越大,因此,急需要一个高性能且最好能够支持异步输出日志的日志框架, ...

  9. Log4j2中的同步日志与异步日志

    1.背景 Log4j 2中记录日志的方式有同步日志和异步日志两种方式,其中异步日志又可分为使用AsyncAppender和使用AsyncLogger两种方式. 2.Log4j2中的同步日志 所谓同步日 ...

随机推荐

  1. 网络流 最大流—最小割 之SAP算法 详解

    首先引入几个新名词: 1.距离标号: 所谓距离标号 ,就是某个点到汇点的最少的弧的数量(即边权值为1时某个点到汇点的最短路径长度). 设点i的标号为level[i],那么如果将满足level[i]=l ...

  2. VB中Winsock连续发送出现接收不到的异常问题解决方法

    VB里面用WINSOCK进行一对多连接的TCP连接时,经常需要群发消息给所有已连接的客户端.代码类似如下: Option Explicit Dim bytMsg() As Byte Private S ...

  3. Redhat Linux5.4/5.5/5.8/6.0/6.3 ISO镜像文件下载

    版本有RedHat Enterprise Linux(RHEL)5.4/5.5/5.8/6.0/6.3 ISO镜像文件下载地址: RHEL 5.4 ISO下载http://rhel.ieesee.ne ...

  4. SpringBoot中使用springfox+swagger2书写API文档

    随着前后端的分离,借口文档变的尤其重要,springfox是通过注解的形式自动生成API文档,利用它,可以很方便的书写restful API,swagger主要用于展示springfox生成的API文 ...

  5. GParted: GNOME Partition Editor, sharp weapon to modify disk partitions.

    GParted Projects GNOME Partition Editor for creating, reorganizing, and deleting disk partitions. It ...

  6. tomcat体系结构

    总体架构解析 Server: 一个StandardServer类实例就表示一个Server容器,TOMCAT启动的时候首先会启动一个Server,一个Server包括多个Service Service ...

  7. docker上配置mysql主从复制

    1.在docker上启动2台mysql容器:(这里3306为主,3307为从) docker run -d  -e MYSQL_ROOT_PASSWORD=123456  -p 3306:3306 - ...

  8. domain logic approaches

    领域逻辑组织可以分为三种主要的模式:事务脚本(Transaction Script).领域模型(Domain Model)和表模块(Table Module)” 1.domain logic appr ...

  9. COSC2309/2347 Semester 1, 2019

    Mobile Application DevelopmentCOSC2309/2347 Semester 1, 2019Movie Night PlannerAssignment 1 (20 mark ...

  10. spark核心优化详解

    大家好!转眼又到了经验分享的时间了.吼吼,我这里没有摘要也没有引言,只有单纯的经验分享,请见谅哦! 言归正传,目前在大数据领域能够提供的核心计算的工具,如离线计算hadoop生态圈的mr计算模型,以及 ...