`

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。哎,苍天呐……

分享到:
评论

相关推荐

    log4j2配置文件

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

    Log4j2学习log4j2.xml配置模板

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

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

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

    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及配置文件

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

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

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

    mybatis配置文件以及日志文件Log4j

    配置Log4j主要通过`log4j.properties`或`log4j.xml`文件完成,其中定义了日志级别、appender(日志输出目标)和layout(日志格式)。例如,你可以为不同的类或包设置不同的日志级别,以获取所需级别的详细信息。 在...

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

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

    log4j.properties配置文件

    log4j.properties配置文件

    log4j开发jar包及log4j配置文件

    Log4j是一款广泛使用的日志...在实际项目中,确保正确配置Log4j是至关重要的,因为它可以帮助我们跟踪程序状态、定位错误,以及在必要时提供审计日志。对于大型分布式系统,良好的日志管理可以显著提高故障排查效率。

    Log4j2结合Slf4j配置使用

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

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

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

    log4j的jar包和配置文件

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

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

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

    SpringBoot2.X整合Mybatis代码示例2-使用配置文件方式+Log4j

    1. **引入Log4j配置**:在项目的`src/main/resources`目录下创建`log4j2.xml`或`log4j2.json`文件,用于定义日志级别、输出位置、格式等。 ```xml [%t] %-5level %logger{36} - %msg%n"/> ...

    log4j2 xml 和 properties配置

    log4j2 xml 和 properties 配置

    log4j2配置文件,按照文件大小划分日志,保存日期天数内的日志等

    log4j2配置文件,按照文件大小划分日志,保存日期天数内的日志,指纹日志命名规则,日志输出等级等功能

    [简单]log4jdbc-log4j2配置简记

    3. 配置log4j2:创建一个log4j2的配置文件(如log4j2.xml或log4j2.json),定义日志输出的模式和级别。例如,以下是一个简单的配置示例: ```xml [%t] %-5level %logger{36} - %msg%n"/> `...

    log4j配置文件说明(完整版)

    Log4j 配置文件说明 Log4j 是一种流行的日志记录工具,用于记录和管理应用程序中的日志信息。配置文件是 Log4j 的核心组件之一,通过配置文件可以控制日志记录的级别、输出目的地和格式。在本文中,我们将详细介绍 ...

Global site tag (gtag.js) - Google Analytics