Log4j2基本使用入门
1.Log4j2简介
Apache Log4j 2是日志框架Log4j的升级,
它比其前身Log4j 1.x提供了重要的改进,
并且参考了Logback中许多有用的改进,
同时修复了Logback的一些固有问题。
详细请参考官网:Apache Log4j 2
本文介绍Log4j2的常用功能,
给出相应功能的参数配置方法,
最后给出一个完整的log4j2.xml配置文件,
作为工作开发中常用的日志配置参考。
2.Jar包依赖
2.1.直接依赖
在Maven的pom.xml添加如下依赖:
<dependencies>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-api</artifactId>
        <version>2.12.1</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
        <version>2.12.1</version>
    </dependency>
</dependencies>
2.2.使用bom管理依赖
在Maven的父pom.xml添加如下依赖管理:
<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-bom</artifactId>
      <version>2.12.1</version>
      <scope>import</scope>
      <type>pom</type>
    </dependency>
  </dependencies>
</dependencyManagement>
然后在使用Log4j2的子pom.xml添加如下依赖,
这样就不用写具体的版本号了,
保证项目的子工程都使用相同版本的Log4j2。
<dependencies>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-api</artifactId>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
    </dependency>
</dependencies>
在复杂场景下,可能不止依赖上面两个jar包,
这种方法可以保证Log4j2模块之间的版本一致。
3.测试代码
为了演示Log4j2的功能,创建如下的测试类:
package org.apache.logging.log4j;
public class Log4j2Test {
    private static Logger LOG = LogManager.getLogger(Log4j2Test.class);
    public static void main(String[] args) throws Exception {
        // 一直打印日志,用于测试Log4j2功能
        while (true) {
            logAll();
        }
    }
    // 打印各种级别的日志用于测试
    public static void logAll() throws Exception {
        LOG.trace("trace level log");
        LOG.debug("debug level log");
        LOG.info("info level log");
        LOG.error("error level log");
        LOG.fatal("fatal level log");
        // 设置休眠时间,控制日志打印速度
        Thread.sleep(3);
    }
}
4.打印日志
运行上面的测试程序,
在控制台打印出如下日志:
ERROR StatusLogger No Log4j 2 configuration file found.
Using default configuration (logging only errors to the console), or user programmatically provided configurations.
Set system property 'log4j2.debug' to show Log4j 2 internal initialization logging.
See https://logging.apache.org/log4j/2.x/manual/configuration.html for instructions on how to configure Log4j 2
11:33:08.438 [main] ERROR org.apache.logging.log4j.Log4j2Test - error level log
11:33:08.440 [main] FATAL org.apache.logging.log4j.Log4j2Test - fatal level log
可以看到ERROR报错了,没有找到Log4j2的配置文件,
使用了默认配置,只打印errors日志到console控制台,
然后控制台输出了error和fatal两个级别的日志信息。
5.日志级别
Log4j2共有8种日志级别,
按照优先级从小到大排序:
ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF
当日志级别设置为某一级别时,
则会打印大于等于该级别的日志,
比如日志级别设置为ERROR,
则会打印ERROR,FATAL级别的日志。
ALL会把所有级别的日志打印出来,
OFF不会打印任何级别的日志,
所以严格来讲只有6种日志级别。
6.自动配置
Log4j2能够在初始化期间自动配置,
它支持4种格式的配置文件:
Properties, YAML, JSON,  XML
并且按从高到低的加权顺序查找配置文件。
6.1.log4j.configurationFile
Log4j2启动时,首先检查系统属性log4j.configurationFile,
如果设置了该属性,则匹配文件扩展名去加载配置文件,
就是说文件名可以是任意的,文件扩展名必须是上面的4种之一。
在启动应用时配置该参数,示例如下:
java -jar -Dlog4j.configurationFile="/home/yuwen/myLog4j2.xml" log4j2test.jar
log4j.configurationFile可以配置如上的绝对路径,
也可以配置相对路径,即只配置文件名myLog4j2.xml,
Log4j2会在classpath路径中查找配置文件。
6.2.log4j2-test.*
如果没有设置系统属性,
则在classpath路径中按照顺序查找如下4个文件:
log4j2-test.properties
log4j2-test.yaml or log4j2-test.yml
log4j2-test.json or log4j2-test.jsn
log4j2-test.xml
6.3.log4j2.*
如果找不到上面的文件,
则在classpath路径中按照顺序查找如下4个文件:
log4j2.properties
log4j2.yaml or log4j2.yml
log4j2.json or  log4j2.jsn
log4j2.xml
6.4.DefaultConfiguration
如果无法找到任何配置文件,
则使用默认配置文件,
这将导致日志输出到控制台。
7.默认配置文件
在第4步中打印日志找不到配置文件,
使用的默认配置等价于下面的配置:
<?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>
8.配置分析
在上面的默认配置文件中,
主要有两类配置,
一类是Appenders:定义日志输出目的地,内容和格式等。
另一类是Loggers:定义日志级别和使用的Appenders。
8.1.Appenders
<Console name="Console" target="SYSTEM_OUT">
表示日志输出到控制台的标准输出。
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
pattern定义日志输出格式:
| 配置 | 说明 | 
|---|---|
| %d{HH:mm:ss.SSS} | 输出日志打印的时间,精确到毫秒 | 
| [%t] | 输出当前线程名称 | 
| %-5level | 输出日志级别,-5表示左对齐并且固定输出5个字符,不足在右边补空格 | 
| %logger{36} | 输出logger名称,注意Root Logger没有名称则没有输出 | 
| %msg | 输出要打印的业务日志信息 | 
| %n | 日志换行 | 
实际会输出如下日志:
11:33:08.438 [main] ERROR org.apache.logging.log4j.Log4j2Test - error level log
更多的PatternLayout设置请参考官网:
Log4j2 PatternLayout
9.新建配置文件
新建log4j2.xml文件,
添加上面的默认配置,
放到classpath路径下,
则应用启动时会读取该文件,
下面以该xml文件为例,
通过修改相应的配置,
演示Log4j2的功能。
10.Configuration
实际上Log4j2的配置可以通过以下四种方式中的一种来完成:
- 通过使用Properties、YAML、JSON、XML格式编写的配置文件。
 - 以编程方式,创建ConfigurationFactory和Configuration的实现。
 - 以编程方式,调用配置接口中公开的api,将组件添加到默认配置。
 - 以编程方式,通过调用内部Logger类的方法。
 
本文主要介绍第1种,
详解XML格式的配置文件。
10.1.内部日志
Log4j2内部日志会输出到控制台,
status的值可以填第5步中的日志级别,
它控制Log4j2内部日志的输出级别,
Log4j2会输出初始化、翻转和其他内部操作的详细信息。
设置status="trace"对定位Log4j2问题非常有用。
<Configuration status="WARN">
也可以设置系统属性log4j2.debug,
也会将Log4j2内部日志打印到控制台,
包括在找到配置文件之前发生的内部日志。
在启动应用时配置该参数,示例如下:
java -jar -Dlog4j2.debug log4j2test.jar
10.2.自动重新配置
Log4j2能够自动检测配置文件的修改,
并且自动重新加载配置。
通过在Configuration元素上配置monitorInterval属性,
并将其设置为非零值,
那么在下一次计算或记录日志事件,
且自上次检查以来已经超过monitorInterval时间,
则将检查该文件是否被修改。
注意时间单位默认为秒,
而且最小时间间隔是5秒。
<Configuration monitorInterval="5">
如上示例为每隔至少5秒检查一次配置文件。
11.添加自定义Appender
<Appenders>
    <File name="File" fileName="test.log">
        <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
    </File>
</Appenders>
这里增加了一个类型为File的Appender,
name为File,
FileName为test.log,
表示日志会打印到test.log文件中。
12.添加自定义Logger
<Loggers>
    <Logger name="org.apache.logging.log4j" level="ERROR" additivity="true">
        <AppenderRef ref="File" />
    </Logger>
</Loggers>
这里增加了一个Logger,需要配合上面的Appender使用,
name为Log4j2Test的包路径org.apache.logging.log4j,
level日志级别为EEROR,
AppenderRef指向了上面新增的名称为File的Appender,
表示Log4j2Test的ERROR和FATAL级别的日志会打印到test.log,
test.log文件内容:
16:55:31.343 [main] ERROR org.apache.logging.log4j.Log4j2Test - error level log
16:55:31.345 [main] FATAL org.apache.logging.log4j.Log4j2Test - fatal level log
同时additivity设置为true,
会将当前的Logger特性会传递给Root,
即上述的日志不仅会输出到test.log文件,
也会输出到Root指向的控制台,
Console控制台内容:
16:55:31.343 [main] ERROR org.apache.logging.log4j.Log4j2Test - error level log
16:55:31.345 [main] FATAL org.apache.logging.log4j.Log4j2Test - fatal level log
13.完整的log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" monitorInterval="5">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
        </Console>
        <File name="File" fileName="test.log">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
        </File>
    </Appenders>
    <Loggers>
        <Logger name="org.apache.logging.log4j" level="ERROR" additivity="true">
            <AppenderRef ref="File" />
        </Logger>
        <Root level="ERROR">
            <AppenderRef ref="Console" />
        </Root>
    </Loggers>
</Configuration>
14.参考文章
Log4j2 入门教程
Log4j2 配置文件
Log4j2 Appenders
Frequently Asked Questions
Log4j2基本使用入门的更多相关文章
- 【log4j2】log4j的升级版log4j2的简单入门使用
		
1.jar包 log4j-api.jar + log4j-core.jar maven仓库配置: <dependency> <groupId>org.apache. ...
 - Log4j2进阶使用(更多高级特性)
		
1.高级进阶说明 本文介绍Log4j2高级进阶使用, 基于Log4j2进阶使用(按大小时间备份日志), 介绍更多的高级特性, 本文基于上文给出的完整log4j2.xml, 修改对应的配置项, 演示高级 ...
 - Log4j2完整XML参考(详细注释说明)
		
1.说明 本文提供完整的log4j2.xml配置文件, 供开发中参考使用,可以作为模板, 配置对应实现如下常用的功能: 1.自动检测和重新加载配置,每10分钟(600s)检测一次 2.每个日志文件最大 ...
 - Log4j2进阶使用(Pattern Layout详细设置)
		
1.进阶说明 通过配置Layout打印格式化的日志, Log4j2支持很多的Layouts: CSV GELF HTML JSON Pattern Serialized Syslog XML YAML ...
 - Log4j2进阶使用(按大小时间备份日志)
		
1.进阶说明 本文介绍Log4j2进阶使用, 基本使用请参考Log4j2基本使用入门. 本文基于上面的基本使用入门, 主要介绍按照日志大小和时间备份日志, 并且限制备份日志的个数, 以及删除过期的备份 ...
 - ELK系列(1) - Elasticsearch + Logstash + Kibana + Log4j2快速入门与搭建用例
		
前言 最近公司分了个ELK相关的任务给我,在一边学习一边工作之余,总结下这些天来的学习历程和踩坑记录. 首先介绍下使用ELK的项目背景:在项目的数据库里有个表用来存储消息队列的消费日志,这些日志用于开 ...
 - SpringBoot系列一(入门,ORM,Transaction,log4j2等)
		
今天写篇springboot的博客,主要介绍一下springboot搭建以及一些整合. 首先介绍springboot搭建,我今天选择Maven,想用Gradle搭建的就自己百度一下吧,访问" ...
 - Log4j2入门
		
转载自:http://www.cnblogs.com/hzhuxin/p/6406272.html Log4j2 是 Log4j的升级版本,对其进行解压,可以看到以下几个jar包. log4j-1.2 ...
 - log4j2使用入门(一)
		
log4j2是log4j的一个升级版,与log4j1相比进行了很大的改善,同时也修复了一些logback的架构上的问题.所以是目前应用开发的首选的日志器(下载位置:http://apache.faye ...
 
随机推荐
- mysql index 8.0
			
创建表 use vodb; drop table if exists test1; create table test1(id int NOT NULL AUTO_INCREMENT primary ...
 - Java Jar包压缩、解压使用
			
什么是jar包JAR(Java Archive)是Java的归档文件,它是一种与平台无关的文件格式,它允许将许多文件组合成一个压缩文件. 如何打/解包使用jdk/bin/jar.exe工具,配置完环境 ...
 - 【Linux】【Basis】网络
			
Linux网络属性配置 计算机网络: TCP/IP:协议栈(使用) ISO,OSI:协议栈(学习) ...
 - uWSGI和WSGI之间的关系
			
一.WSGI 协议 WSGI:是一种协议规范,起到规范参数的作用,就像告诉公路一样,规定超车靠右行,速度不低于90km/h,等.但这一切都是对双方进行沟通,比如,重庆到武汉这条高速路,这儿重庆和武汉就 ...
 - Mysql配置 主从同步
			
目录 一.准备 二.操作 主数据库操作 从服务器操作 一.准备 1.主从数据库版本最好一致 2.主从数据库内数据保持一致,若不一致,可将从库中所有数据删除,并将主库全部数据导入进去 主数据库:182. ...
 - apt和apt-get的区别
			
目录 一.简介 二.apt vs apt-get 为什么apt首先被引入? apt和apt-get之间的区别 apt和apt-get命令之间的区别 我应该使用apt还是apt-get? 三.结论 一. ...
 - 项目管理的基本概念(Project)
			
<Project2016 企业项目管理实践>张会斌 董方好 编著 关于项目管理的基本概念,我看了好久,也迷糊了好久--原谅我实在不是个善于理解概念的妖,最终我决定,就记些简单的东东吧,具体 ...
 - CF1454A Special Permutation 题解
			
Content 给定一个整数 \(n\),请构造出一个长度为 \(n\) 的排列 \(\{a_i\}_{i=1}^n\),使得对于每个 \(a_i\),都有 \(a_i\neq i\). 我们称一个长 ...
 - jquery绑定事件时如何向事件函数里传参数
			
jquery绑定事件时如何向事件函数里传参数 jquery绑定事件时如何向事件函数里传参数 举例子说明: 步骤1: var button=$('<button type="button ...
 - Mybatis-Plus一键生成代码
			
Mybatis-Plus一键生成代码 一.闲言碎语 闲来无事看了看了MP的官网看到一键生成的代码更新了! 整个Ui风格都变了,遂决定瞅一眼新的代码生成器 官网地址~~ 二.引入依赖 新的代码生成只有在 ...