`

Log4j2 — LogEvent的传递及配置文件重定位

 
阅读更多

前言

Log4j2的介绍可以参考上一篇博客

Log4j2很好的一点是可以用configuration file来配置log system。但是这个配置文件的存放位置比较纠结一些。文中会介绍如何更改Log4j2配置文件的路径和名称。

目录

本文的内容将回答如下问题:

1、如何产生LogEvent?

2、LogEvent的传递是怎样的?

3、如何更改Log4j2配置文件的的名称和路径?

 

正文

1、如何产生LogEvent?

在调用Logger对象的info、error、trace等函数时,就会产生LogEvent。LogEvent跟LoggerConfig一样,也是由Level的。LogEvent的Level主要是用在Event传递时,判断在哪里停下。具体的可以参考上一篇日志。

复制代码
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class Test {
    private static Logger logger = LogManager.getLogger("HelloWorld");
    public static void main(String[] args){
        Test.logger.info("hello,world");
        Test.logger.error("There is a error here");
    }

}
复制代码

如代码中所示,这样就产生了两个LogEvent。

2、LogEvent的传递是怎样的?

我们在IDE中运行一下这个程序,看看会有什么输出。

发现,只有ERROR的语句输出了,那么INFO的语句呢?

不着急,先来看看工程目录结构:

可以看到,工程中没有写入任何的配置文件。所以,application应该是使用了默认的LoggerConfig Level。那么默认的Level是多少呢?

在log4j2的源文件中,可以看到其DefaultConfiguration类的java doc,描述如下:

/**
 * The default configuration writes all output to the Console using the default logging level. You configure default logging level by setting the
 * system property "org.apache.logging.log4j.level" to a level name. If you do not specify the property, Log4J uses the ERROR Level. Log
 * Events will be printed using the basic formatting provided by each Message.

可见,默认的输出地是console,默认的级别是ERROR级别。

那么,为什么默认ERROR级别会导致INFO级别的信息被拦截呢?

看如下表格:

左边竖栏是Event的Level,右边横栏是LoggerConfig的Level。Yes的意思就是这个event可以通过filter,no的意思就是不能通过filter。

可以看到,INFO级别的Event是无法被ERROR级别的LoggerConfig的filter接受的。所以,INFO信息不会被输出。

3、如何改变Log4j2的名称和路径?

如果想要改变默认的配置,那么就需要configuration file。Log4j的配置是写在log4j.properties文件里面,但是Log4j2就可以写在XML和JSON文件里了。

(1)放在classpath(src)下,以log4j2.xml命名

使用Log4j2的一般都约定俗成的写一个log4j2.xml放在src目录下使用。这一点没有争议。

(2)将配置文件放到别处

在系统工程里面,将log4j2的配置文件放到src目录底下很不方便。如果能把工程中用到的所有配置文件都放在一个文件夹里面,当然就更整齐更好管理了。但是想要实现这一点,前提就是Log4j2的配置文件能重新定位到别处去,而不是放在classpath底下。

那么,有这个可能吗?

看看文档里怎么说吧:

1.Log4j will inspect the "log4j.configurationFile" system property and, if set,will attempt to load the configuration using the ConfigurationFactory that matches the file extension.
2.If no system property is set the JSON ConfigurationFactory will look for log4j2-test.json or log4j2-test.jsn in the classpath.
3.If no such file is found the XML ConfigurationFactory will look for log4j2-test.xml in the classpath.
4.If a test file cannot be located the JSON ConfigurationFactory will look for log4j2.json or log4j2.jsn on the classpath.
5.If a JSON file cannot be located the XML ConfigurationFactory will try to locate log4j2.xml on the classpath.
6.If no configuration file could be located the DefaultConfiguration will be used. This will cause logging output to go to the console.

可见,如果没有设置"log4j.configurationFile" system property的话,application将在classpath中按照如下查找顺序来找配置文件:

  log4j2-test.json 或log4j2-test.jsn文件

  log4j2-test.xml文件

  log4j2.json 或log4j2.jsn文件

  log4j2.xml文件

这就是为什么在src目录底下放log4j2.xml文件可以被识别的原因了。

如果想将配置文件重命名并放到别处,就需要设置系统属性log4j.configurationFile

设置的方式是在VM arguments中写入该属性的key和value:

-Dlog4j.configurationFile="D:\learning\blog\20130115\config\LogConfig.xml"

在myeclipse中,就是 右键-》run as -》run configuration-》右边窗口的“(x)=argument”=》VM arguments

然后写入上述key和value即可。

-D是参数,不能缺少。

测试

在“D:\learning\blog\20130115\config\”路径下编写文件:

root LoggerConfig的Level设为INFO。

在myeclipse中写入log4j.configurationFile系统属性:

测试的java程序如上文,在此不再重复。运行,console输出如下:

期待已久的INFO语句出现了。

 

总结:

这次测试最纠结的地方是在配置文件的重定位上。先google了一番,在overflowstack上看到有人有一样的问题,CSDN上也是,不过都没人说怎么解决。翻看手册,是看到了log4j.configurationFile这个设置系统属性的地方。试了一下(当时没写参数-D),没有成功,以为这个方法不对。就在Log4j2的网站上下载了源代码,一点点查找改路径的地方。找到最后,还是从log4j.configurationFile这个系统属性上入手。无奈,又回到原点。最后竟然是没写参数-D。哎,苍天呐……

分享到:
评论

相关推荐

    老生常谈Log4j和Log4j2的区别(推荐)

    下面我们将从配置文件类型、核心JAR包、文件渲染和Log调用四个方面来比较Log4j和Log4j2的区别。 配置文件类型 Log4j通过一个.properties文件作为主配置文件,而Log4j2则弃用了这种方式,采用的是.xml、.json或者....

    Log4j2学习log4j2.xml配置模板

    Log4j2 配置模板学习笔记 Log4j2 是 Java 语言中一种流行的日志记录工具,它提供了灵活的日志记录管理功能。下面我们将学习 Log4j2 配置模板的使用和配置。 引入 Log4j2 依赖 在使用 Log4j2 之前,需要在 Maven ...

    log4j2配置文件

    log4j2配置,文件分割,自动清除等相关配置。

    log4j日志配置以及配置文件详解

    本文将深入探讨log4j的配置以及配置文件的详解。** 首先,我们要理解什么是`log4j.properties`文件。这是log4j框架的配置文件,使用Java Properties格式,用于定义日志输出的行为。主要包括以下几个核心部分: 1. ...

    SpringBoot框架配置log4j和log4j2的配置代码

    2. **配置文件**:创建`log4j2.xml`或`log4j2.json`文件,定义日志级别和输出目的地。例如: ```xml <!-- log4j2.xml 示例 --> [%t] %-5level %logger{36} - %msg%n"/> <File name="File" fileName="app....

    log4j.properties配置文件

    ### log4j.properties配置文件详解 #### 一、概述 `log4j.properties`是Apache Log4j框架中用于配置日志记录行为的核心文件之一。通过这个文件,开发者可以定义日志消息的输出方式(例如控制台或文件)、日志级别...

    log4j2的日志xml配置文件

    log4j2的配置文件

    log4j及配置文件

    《深入理解Log4j及其配置文件》 在Java开发领域,日志管理是不可或缺的一部分,它可以帮助开发者跟踪程序运行状态,排查错误,优化性能。Log4j,作为Apache的一个开源项目,是Java中最广泛使用的日志框架之一。本文...

    log4j2-所需jar包+配置详解(详细)

     log4j 2.x版本不再支持像1.x中的.properties后缀的文件配置方式,2.x版本配置文件后缀名只能为".xml",".json"或者".jsn".  系统选择配置文件的优先级(从先到后)如下:  (1).classpath下的名为log4j2-test.json...

    log4j2的配置文件完整版

    这个“log4j2的配置文件完整版”应该包含了Log4j2所有可能的配置选项,允许开发者精细控制日志输出的行为。 在Log4j2中,配置文件是XML、JSON或YAML格式的文本文件,它定义了日志的级别、输出目的地、布局格式以及...

    Log4J_全能配置文件.pdf

    ### Log4J 全能配置文件详解 #### 一、概述 Log4J是一款非常流行的Java日志框架,被广泛应用于各种规模的应用程序中。它提供了灵活的日志记录机制,可以将日志输出到不同的目的地,如控制台、文件、数据库等,并且...

    log4j-1.2.17.jar及配置文件

    log4j-1.2.17.jar及配置文件,消耗1积分 log4j-1.2.17.jar及配置文件,消耗1积分 log4j-1.2.17.jar及配置文件,消耗1积分 log4j-1.2.17.jar及配置文件,消耗1积分 log4j-1.2.17.jar及配置文件,消耗1积分

    Log4j2结合Slf4j配置使用

    Log4j2 结合 Slf4j 配置...通过配置 Log4j2 的配置文件 log4j2.xml,我们可以定义不同的日志记录机制,例如输出到控制台、文件、数据库等。Slf4j 则提供了统一的日志记录接口,使得我们可以轻松地更换日志记录工具。

    log4j使用jar包和log4j.properties配置文件

    本文将详细探讨Log4j的使用,主要关注1.2.17版本的jar包以及配置文件`log4j.properties`。 ### 1. Log4j简介 Log4j是一个开源的日志组件,支持多种输出格式,如控制台、文件、数据库等。它的核心概念包括Logger、...

    log4j.jar包,和log4j.properties配置文件下载

    2. **log4j.properties**:这是一个配置文件,用于定制Log4j的行为。在这个文件中,你可以设置日志级别,指定哪些类或包的日志应该被记录,以及日志应该如何被输出(即选择哪个Appender)。例如,你可能想要将DEBUG...

    Log4j2简介及与Log4j效率对比

    5. **简化配置**:Log4j2配置文件更加简洁易读,不再需要显式指定类名来实现特定的功能。 6. **自定义日志级别**:除了内置的日志级别(如DEBUG、INFO、WARN、ERROR、FATAL),Log4j2还支持用户自定义的日志级别,...

    SSM整合中的Log4j日志的配置详情

    在 SSM 整合项目中,需要在 web.xml 文件中指定 Log4j 配置文件的位置,以便 Spring 可以加载 Log4j 配置文件。下面是一个基本的 web.xml 配置: ``` <listener-class>org.springframework.web.util.Log4...

    log4j-1.2.17的jar包以及依赖包,还有一份log4j的配置文件,输出到控制台和文件夹两种配置

    在压缩包中,还包含了一份名为`log4j.properties`的配置文件。这是Log4j使用的一种配置格式,基于Java Properties格式。配置文件决定了日志信息如何输出、输出到哪里,以及日志的级别等关键设置。 **三、Log4j配置...

    log4j的jar包和配置文件

    Log4j的配置通常通过一个名为`log4j.properties`或`log4j.xml`的文件完成。以下是一个简单的`log4j.properties`配置示例: ```properties # 设置root logger级别为INFO,并将输出到console log4j.rootLogger=INFO, ...

Global site tag (gtag.js) - Google Analytics