介绍

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. Android ble蓝牙问题

    (1)蓝牙回调安卓4.4的蓝牙回调是在异步线程中(不在主线程),若要在蓝牙回调中执行更新界面的操作,记得切换到主线程去操作 (2)三星手机兼容性问题connectGatt()方法在某些三星手机上只能在 ...

  2. git删除掉已经保存的用户名密码

    以保存的用户名密码删除,先找到变量存在的位置: git config -l To help track down the setting, I'd try to use: git config --l ...

  3. Java逆向武器库_反编译工具

    1.反编译工具之_jd-gui 官网下载地址:http://java-decompiler.github.io/#jd-gui-download 使用: 下载后解压直接使用即可. jd-gui的优势是 ...

  4. 18 徐州 M

    听了遍dls的讲解觉得这是个沙比题,结果调了两个小时... 主要注意的点有两个, 一个是 找每个灯覆盖的区间,这个用叉积看一下夹角即可 一个是 覆盖的时候点覆盖比边覆盖好写(个人感觉) 点覆盖的话,如 ...

  5. redis安装(单节点)

    # tar -zxvf redis.tar.gz # cd redis 安装(使用 PREFIX 指定安装目录): # make PREFIX=/usr/local/redis install 安装完 ...

  6. jdbc的入门学习

    一.JDBC相关概念介绍 1.1.数据库驱动 这里的驱动的概念和平时听到的那种驱动的概念是一样的,比如平时购买的声卡,网卡直接插到计算机上面是不能用的,必须要安装相应的驱动程序之后才能够使用声卡和网卡 ...

  7. 删除U8中单据已经审核完成但工作流未完成的任务

    问题描述: U8工作流终审结点后面还有节点时,当终审终点完成后,系统会通知后面的节点进行审核,但单据显示已经审核完成,后面的节点无法审核,工作任务会一直挂着,无法删除. 例如下图中,节点"终 ...

  8. Ubuntu mysql连接错误10060/10061的方法

    mysql 10060错误一般因为防火墙 ufw allow 3306; //允许外部访问3306端口ufw allow from 192.168.1.115;  //允许此IP访问所有的本机端口uf ...

  9. Fiddler抓包请求前设置断点

    1. 开启抓包 file--->capture traffic2. 在页面底部黑框输入bpu http://www.runoob.com/?s=mysql3. 在浏览器URL输入http://w ...

  10. TCP断开那些事

    继上一篇后,我们再来看一下四次挥手的过程 这里其实没有必要过多阐述,一张图胜过千言万语. 与三次握手一样,四次挥手的过程中也有许多扩展问题. 当然问的最多的还是:为什么要四次握手?为什么要等待2MSL ...