java日志系列(三)log4j 2

Log4j1.x已经被广泛应用到各个系统及框架中。然后,1.x毕竟太古老,代码很久没有更新。目前,Log4j 1.x的代码已经很难维护,因为它依赖于很多Jdk老版本的api。作为 Log4j 1.x的替代品,SLF4J/Logback已经对日志系统做了很大的改进,那么,为什么我们还需要Log4j 2?

1. Log4j 2被设计成对安全审计有用的日志框架。在Logback框架中,当输出日志产生异常时,从来不会告诉被调用方,而log4j 2,这个将是可配置的。

2. Log4j 2使用了新一代的基于LMAX Disruptor的无锁异步日志系统。在多线程的程序中,异步日志系统吞吐量比Log4j 1.x和logback高10倍,而时间延迟却更低。

3. Log4j 2使用插件机制,更灵活。扩展appenders,Filters,Layouts,Lookups和Pattern Converters将变得更加简单,而不用去更高任何Log4j本身。

4. Log4j 2支持custom log levels。可以再程序或者配置文件中配置custom日志级别。

5. Log4j 1.x与logback返回的是String。这回产生编码的问题。Log4j 2则返回的使byte array。

6. Log4j 2的 Syslog Appender是一种SocketAppender,它不仅支持TCP和UDP还支持BSD syslog 和RFC 5424 格式。

7. Log4j1.x的一些死锁问题在logback中已经被修复,然而,logback在并发的性能上还是比较低。log4j 2利用java5的并发机制,并且性能非常好。

Log4j 2 支持三种类型的配置文件:JSON , YAML and XML。Log4j 2的配置文件加载顺序分别是:

  1. log4j2-test.yaml or log4j2-test.yml
  2. log4j2-test.json or log4j2-test.jsn
  3. log4j2-test.xml
  4. log4j2.yaml or log4j2.yml
  5. log4j2.json or log4j2.jsn
  6. 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="error">
      <AppenderRef ref="Console"/>
    </Root>
  </Loggers>
</Configuration>

也就是说,其只会把error级别的日志打印到控制台。

maven配置:

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

测试类Bar.java

package com.lf.testLog4j;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.LogManager;
/**
 * Created by lufei3 on 2015/7/10.
 */
public class Bar {
    static final Logger logger = LogManager.getLogger(Bar.class.getName());

    public boolean doIt() {
        logger.entry();
        logger.error("Did it again!");
        return logger.exit(false);
    }
}

测试类HelloLog4j

package com.lf.testLog4j;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

/**
 * Created by lufei3 on 2015/7/5.
 */
public class HelloLog4j {
    private static final Logger logger = LogManager.getLogger(HelloLog4j.class);

    /**
     * @param args
     */
        public static void main(String[] args) {

        logger.trace("Entering application.");
        Bar bar = new Bar();
        if (!bar.doIt()) {
            logger.error("Didn‘t do it.");
        }
        logger.trace("Exiting application.");
    }
}

采用默认配置的输出应当是这样

ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging only errors to the console.
14:38:42.866 [main] ERROR com.lf.testLog4j.Bar - Did it again!
14:38:42.867 [main] ERROR com.lf.testLog4j.HelloLog4j - Didn‘t do it.

增加配置文件log4j2.xml,并且把日志级别改成trace那么输出应该是这样的

15:04:42.134 [main] TRACE com.lf.testLog4j.HelloLog4j - Entering application.
15:04:42.139 [main] TRACE com.lf.testLog4j.Bar - entry
15:04:42.139 [main] ERROR com.lf.testLog4j.Bar - Did it again!
15:04:42.139 [main] TRACE com.lf.testLog4j.Bar - exit with(false)
15:04:42.139 [main] ERROR com.lf.testLog4j.HelloLog4j - Didn‘t do it.
15:04:42.139 [main] TRACE com.lf.testLog4j.HelloLog4j - Exiting application.

可以通过配置控制不同的java类的输出方式。比如我想设置Bar的输出级别为trace,而其他类的输出级别为error,配置如下:

<Loggers>
        <Logger name="com.lf.testLog4j.Bar" level="trace" additivity="false">
            <AppenderRef ref="Console"/>
        </Logger>
        <Root level="error">
            <AppenderRef ref="Console"/>
        </Root>
    </Loggers>

输出如下:

15:32:51.510 [main] TRACE com.lf.testLog4j.Bar - entry
15:32:51.512 [main] ERROR com.lf.testLog4j.Bar - Did it again!
15:32:51.512 [main] TRACE com.lf.testLog4j.Bar - exit with(false)
15:32:51.512 [main] ERROR com.lf.testLog4j.HelloLog4j - Didn‘t do it.

参考文献:log4j官方文档

时间: 2024-10-11 00:43:08

java日志系列(三)log4j 2的相关文章

java日志系列(logback common-loging slf4j)—— log4j

java日志是开发过程中一个绕不过的坎,优雅的日志是开发一个优秀系统必不可少的.java日志组件有很多种,比如经常用到的log4j. 却一直没有对java日志系列进行一个系统的学习与整理.本文将详细整理java日志系列组件. 1.从零开始 日志记录是应用程序运行中必不可少的一部分.具有良好格式和完备信息的日志记录可以在程序出现问题时帮助开发人员迅速地定位错误的根源. 就像我们在简单代码里加入System.out.println();是一样的.我们需要看到一些输出来让我们看到这个程序正在跑着.当然

Java日志管理:log4j、Commons-logging、slf4

1.log4j 概述 log4j是Apache的一个开源项目,主要是用来做Java开发中的日志管理工作.主要是由三个重要组件构成的.可管理日志的优先级.输出目的地以及输出格式等.它的配置文件主要有XML和properties两种,当然,也可以在程序里配置,但实际开发中一般使用properties文件. log4j的组件 1.1.日志信息的优先级(Level) 有7个日志级别:OFF.FATAL.ERROR.WARN.INFO.DEBUG.ALL,级别从做到有一次降低. Off:关闭所有的日志记录

java多线程系列(三)

等待通知机制 前言:本系列将从零开始讲解java多线程相关的技术,内容参考于<java多线程核心技术>与<java并发编程实战>等相关资料,希望站在巨人的肩膀上,再通过我的理解能让知识更加简单易懂. 目录 认识cpu.核心与线程 java多线程系列(一)之java多线程技能 java多线程系列(二)之对象变量的并发访问 java多线程系列(三)之等待通知机制 java多线程系列(四)之ReentrantLock的使用 非等待通知 public void run() { try {

Java日志介绍(2)-Log4j

Log4j是Apache的一个开源项目,官网地址为http://logging.apache.org/log4j/1.2/index.html.通过使用Log4j,可控制日志信息输出到控制台.文件.数据库等不同的地方:可以控制每一条日志的输出格式,通过定义每一条日志信息的级别,可以更加细致的控制日志的生成过程.Log4j是曾经风靡一时的日志框架,但现在逐渐被新的日志框架所取代:Log4j2.logback.本文主要介绍下Log4j的使用方法,文中所使用到的软件版本:Java 1.8.0_191.

java 日志技术汇总(log4j , Commons-logging,.....)

前言 在java 中实现记录日志的方式有很多种, 1. 最简单的方式,就是system.print.out ,err 这样直接在控制台打印消息了. 2. java.util.logging ; 在JDK 1.4 版本之后,提供了日志的API ,可以往文件中写日志了. 3. log4j , 最强大的记录日志的方式. 可以通过配置 .properties 或是 .xml 的文件, 配置日志的目的地,格式等等. 4. commons-logging, 最综合和常见的日志记录方式, 经常是和log4j

{Java初级系列三}----面向对象和类

一:面向对象----Object 本人为自学Java系列,内容来自于中国大学mooc华东师范大学陈育良教授<Java核心技术>,在此感谢老师! 在Java中引入了对象和类的概念 对象是一个变量--------具体的东西: 类就是类型(是规范,是定义),从万千对象中抽取共性: 类规定了对象应该有的属性内容和方法: 对象就是类的具体实现,是活生生的: 例如:土豆丝菜谱是类,一盘土豆丝就是对象 从程序员的发展角度来理解,OO-Oriented Object是对OP—Oriented Procedur

Java NIO系列(三) - Channel

前言 上文讲到Java NIO一些基本概念.在标准的IO中,都是基于字节流/字符流进行数据操作的,而在NIO中则是是基于Channel和Buffer进行操作,其中的Channel的虽然模拟了流的概念,实则大不相同. 本文将详细阐述NIO中的通道Channel的概念和具体的用法. Channel和Stream的区别 区别 Stream Channel 是否支持异步 不支持 支持 是否支持双向数据传输 不支持,只能单向 支持,既可以从通道读取数据,也可以向通道写入数据 是否结合Buffer使用 不

Java集合系列(三):HashSet、LinkedHashSet、TreeSet的使用方法及区别

本篇博客主要讲解Set接口的三个实现类HashSet.LinkedHashSet.TreeSet的使用方法以及三者之间的区别. 注意:本文中代码使用的JDK版本为1.8.0_191 1. HashSet使用 HashSet是Set接口最常用的实现类,底层数据结构是哈希表,HashSet不保证元素的顺序但保证元素必须唯一. private transient HashMap<E,Object> map; HashSet类的代码声明如下所示: public class HashSet<E&g

JAVA通信系列三:Netty入门总结

一.Netty学习资料 书籍<Netty In Action中文版> 对于Netty的十一个疑问http://news.cnblogs.com/n/205413/ 深入浅出Nettyhttp://wenku.baidu.com/view/7765bc2db4daa58da0114a4c.html Netty了解与小试 http://www.cnblogs.com/xd502djj/archive/2012/06/25/2561318.html Netty系列之Netty高性能之道[精彩]htt