一、log4j2概述

  在日常的开发,测试和生产环境中,日志记录了应用,服务运行过程中的关键信息,以及出现异常时的堆栈,这些信息常常作为查询,定位,解决问题的关键,因此在任何系统中,对日志的使用得当,将极大的提高程序问题解决的效率。

  Log4j的1.x版本虽然已经被广泛使用于很多应用程序中,但由于出现内存泄漏等bug,代码难以维护,以及需要使用老版本的jdk等劣势,在2015年8月已经玩完。它的替代品,SLF4J,Logback,Log4j2对日志框架做了很多必要的改进。

  SLF4J:SLF4J是众多日志系统的内核,提供统一的接口,不提供具体实现,不是具体可使用可配置的日志系统。

  Logback:提供了对SLF4J具体实现的日志系统,相比Log4j1.x,Logback的性能,使用场景,内存使用等方面的优化要远远强于Log4j1.x。

  Log4j2:Log4j2虽然在各个方面都与logback非常相似,但是却提供了更强的性能和并发性,下一代异步logger,易于拓展自定义需求的架构,是目前使用十分广泛的日志框架。

二、log4j2配置节点说明

  如下图为log4j2的设计架构图,接下里对设计图中涉及的各节点做简单的介绍

  (1)LoggerContext:日志系统上下文

  (2)Configuration:每一个 LoggerContext 都有一个有效的 Configuration, Configuration 包含所有的Appender 、Filter、LoggerConfig ,StrSubstitutor引用和对Layout的格式设置

  (3)Logger : Logger继承自 AbstractLogger,当配置被修改后,它将与不同的 LoggerConfig 相关联,这导致其行为也被改变。

  (4)LoggerConfig:LoggerConfig 对象在 Logger 被声明时创建,它包含了一组用于处理事件的Appender引用,以及一组用于过滤传递给Appender事件的Filter,相当于是Appender的集合。

  (5)Appender:Log4j2 还允许将记录请求输出到多个目标中,而这种输出目标被称为Appender。目前Appender的类型有控制台、文件、socket、Apache Flume、JMS、远程UNIX 系统日志守护进程以及各种数据库API,用户可以根据需要选择将日志输出到不同的目标上,同时在一个Logger的配置中,允许开启多个Appender。

  (6)Filter :Log4j2 提供了Filter 来过滤消息事件,它可被应用于事件传递给LoggerConfig之前,及传递给LoggerConfig之后,即LoggerConfig的前后置拦截器。Filter包含了三种行为: Accept, Deny 或 Neutral,其中Accept,Deny分别代表着接受和拒绝,即过滤器接受或拒绝某种日志过滤表达式等,经过这两种行为处理后将不再经过其他过滤器。Neutral代表着中立,意味着事件应由其他Filter来处理。如果未配置任何Filter,那么事件将直接被处理。

  (7)Layout:Log4j2除了可以输出到不同的目标Appender之外,还支持在目标中定义自定义的日志格式,Layout 负责对日志事件进行格式化,通过配置PatternLayout来实现。

  (8)StrSubstitutor和StrLookup:这两个组件用来对Log4j2中的各项配置进行动态变量赋值。

  (9)日志级别:LoggerConfig会被分配一个日志级别,常用的级别包含TRACE, DEBUG, INFO, WARN, ERROR 和 FATAL

  

三、log4j2简单默认配置

  (1)对Log4j2配置的使用首先需要引入对应的core和api包,需要注意的是,如果项目中只引入了jar包而没有对应的log4j2.xml配置文件,那么在eclipse中运行时则会打印如ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging only errors to the console的异常信息,并且输出logger时可以看到只有error和fatal级别的被输出来,是因为没有配置文件就使用默认的,默认级别是error,所以只有error和fatal输出来。

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

  (2)配置简单的log4j2.xml配置文件

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

<!-- 配置LoggerConfig,即Appenders的日志级别为WARN -->
<Configuration status="WARN"> <!-- Appenders支持配置多个Appender,支持向不同的目标输送日志,本例为配置向控制台输出 -->
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
</Console>
</Appenders> <!-- Loggers支持配置多个Logger,可引用不同的目标Appender,也可根据业务需求定制特定要求的Appender -->
<Loggers>
<Root level="info">
<AppenderRef ref="Console" />
</Root>
</Loggers>
</Configuration>

  (3)加载配置文件的方式,Java代码手动加载以及Web工程web.xml配置监听及加载

<!-- Web工程方式加载 -->
<context-param>
<param-name>log4jConfiguration</param-name>
<param-value>classpath:log4j2.xml</param-value>
</context-param> <listener>
<listener-class>org.apache.logging.log4j.web.Log4jServletContextListener</listener-class>
</listener>
/**
* Java代码手动加载配置文件
*/
public class App
{
public static void main( String[] args )
{
try{
File file = new File("src/main/resources/log4j2.xml");
BufferedInputStream in = new BufferedInputStream(new FileInputStream(file));
final ConfigurationSource source = new ConfigurationSource(in);
Configurator.initialize(null, source); Logger logger = LogManager.getLogger();
logger.info("logger init and record..."); logger.error("error log level...");
logger.warn("warn log level...");
logger.info("info log level...");
logger.debug("debug log level...");
logger.trace("trace log level..."); }catch(Exception e){
e.printStackTrace();
}
}
}

  (4)验证结果,区分日志级别

  上面第(3)步的代码执行后打印的结果如下,可见打印了所有级别的日志,却并没有所有都输出到控制台上是因为只会输出比LoggerConfig定义较大的级别日志,级别排序:

TRACE < DEBUG < INFO < WARN < ERROR < FATAL,由于配置文件中LoggerConfig定义的级别为WARN,所以正常只有WARN,ERROR和FATAL会打印,但验证结果多了个INFO,是因为在Logger中引用了控制台的Appender,并单独指定了级别为INFO。

log4j2介绍及配置的更多相关文章

  1. SpringBoot整合log4j2进行日志配置及防坑指南

    写在前面 最近项目经理要求将原先项目中的日志配置logBack,修改为log4j2,据说是log4j2性能更优于logback,具体快多少,网上有说快10多倍,看来还是很快的,于是新的一波挑战又开始了 ...

  2. 03_MyBatis基本查询,mapper文件的定义,测试代码的编写,resultMap配置返回值,sql片段配置,select标签标签中的内容介绍,配置使用二级缓存,使用别名的数据类型,条件查询ma

     1 PersonTestMapper.xml中的内容如下: <?xmlversion="1.0"encoding="UTF-8"?> < ...

  3. python学习第二讲,pythonIDE介绍以及配置使用

    目录 python学习第二讲,pythonIDE介绍以及配置使用 一丶集成开发环境IDE简介,以及配置 1.简介 2.PyCharm 介绍 3.pycharm 的安装 二丶IDE 开发Python,以 ...

  4. OSPF协议介绍及配置 (上)

    OSPF协议介绍及配置 (上) 一.OSPF概述 回顾一下距离矢量路由协议的工作原理:运行距离矢量路由协议的路由器周期性的泛洪自己的路由表,通过路由的交互,每台路由器都从相邻的路由器学习到路由,并且加 ...

  5. x-pack 功能介绍及配置传输层安全性(TLS / SSL)

    x-pack 功能介绍及配置传输层安全性(TLS / SSL) 学习了:https://blog.csdn.net/wfs1994/article/details/80411047

  6. mysql多实例介绍及配置

    mysql多实例介绍及配置 1.mysql多实例介绍 1.1 什么是mysql多实例 mysql多实例就是在一台机器上开启多个不同的服务端口(如:3306,3307),运行多个MySQL服务进程,通过 ...

  7. log4j2单独的配置与使用&log4j2+slf4j的结合的配置与使用

    转载自:https://github.com/iamyong 一.log4j2单独的配置与使用 所用jar文件 log4j-api-2.8.2.jar log4j-core-2.8.2.jar 配置文 ...

  8. 13.LAMP架构介绍及配置

    LAMP架构介绍及配置 LAMP简介与概述 LAMP概述 LAMP架构是目前成熟的企业网站应用模式之一,指的是协同工作的一整套系统和相关软件,能够提供动态Web站点服务及其应用开发环境. LAMP是一 ...

  9. Rsync原理介绍及配置应用

    1.前言 基于LAN或WAN的网络应用之间进行数据传输或者同步非常普遍,比如远程数据镜像.备份.复制.同步,数据下载.上传.共享等等.对此,最简单.直接的做法是对数据进行完全复制.然而,数据在网络上来 ...

随机推荐

  1. LazyValue<T>

    public void ExtendFuncT() { //():匿名无参方法.() =>方法名,指派匿名无参方法去执行另外一个方法. LazyValue<int> lazyOne ...

  2. Java精选笔记_集合【Map(映射)接口】

    Map(映射)接口 简介 该集合存储键值对,一对一对的往里存,并且键是唯一的.要保证map集合中键的唯一性. 从Map集合中访问元素时,只要指定了Key,就能找到对应的Value. 关键字是以后用于检 ...

  3. ios 添加动画的方法

    转自文顶顶大神的博客:http://www.cnblogs.com/wendingding/p/3751519.html ios 开发UI中,经常会用添加动画效果的需求,下面就总结一下,添加动画的三种 ...

  4. securecrt 的安装

    http://bbs.feng.com/read-htm-tid-6939481.html ssh  -t  ip地址@用户名  -p 22

  5. mysql show processlist 命令检查mysql lock

    processlist命令的输出结果显示了有哪些线程在运行,可以帮助识别出有问题的查询语句,两种方式使用这个命令. 1. 进入mysql/bin目录下输入mysqladmin processlist; ...

  6. 《转》python学习(3)

    转自http://www.cnblogs.com/BeginMan/archive/2013/06/03/3114974.html 1.print语句调用str()函数显示,交互式解释器调用repr( ...

  7. MQTT协议笔记之订阅

    前言 记忆不太好的时候,只能翻看以前的文章/笔记重新温习一遍,但找不到MQTT协议有关订阅部分的描述,好不容易从Evernote中找到贴出来,这样整个MQTT协议笔记,就比较齐全了. SUBSCRIB ...

  8. linux 下 安装go

    首先肯定是下载资源包了,链接汇总在http://www.golangtc.com/download,我用的是 http://www.golangtc.com/static/go/go1.4beta1. ...

  9. This function has none of DETERMINISTIC, NO SQL

    错误信息: [Err] 1418 - This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declara ...

  10. mysql 修改配置文件性能优化

    vim /etc/my.cnf 原配置文件 [mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock user=mysql # ...