Log4j – 如何配置多个logger?

本文介绍如何通过log4j配置文件实现系统的多路径、多格式日志输出,并详细解析log4j的工作原理。

内容简介:

本文主要介绍 在一个系统中如何通过log4j的配置文件配置出多个logger,使得该系统可以在不同路径下输出多个内容不同的log 文件。并通过该实例的实现过程进一步讲解log4j的一些特性。

 

具体内容:

1.       如何在项目中配置log4j使得该系统可以输出web test的日志文件(自定义格式)到工程dist目录下的junitLog/WebTestLog.log目录下,输出508 check日志(html格式)到c:/508log.html路径下?

第一步:加入log4j-1.2.8.jar到lib下。
第二步:在CLASSPATH下建立log4j.properties(即将log4j的配置文件放在src的根目录下)。

第三步:根据需要修改log4j配置文件中的相应属性,修改之前就必须知道这些都是干什么的,在后面的部分具体讲解。

该实例中 根据需要 配好的log4j.properties如下:

log4j.rootLogger=ERROR
log4j.logger.com.testframework.web=ERROR,A3
log4j.logger.com.testframework.util= ERROR,A1,A2

log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%m%n

log4j.appender.A2=org.apache.log4j.RollingFileAppender
log4j.appender.A2.File=c:/508log.html
log4j.appender.A2.MaxFileSize=50000KB
log4j.appender.A2.MaxBackupIndex=1
log4j.appender.A2.layout=org.apache.log4j.HTMLLayout

log4j.appender.A3=org.apache.log4j.RollingFileAppender
log4j.appender.A3.File=junitLog/WebTestLog.log
log4j.appender.A3.MaxFileSize=50000KB
log4j.appender.A3.MaxBackupIndex=1
log4j.appender.A3.layout=org.apache.log4j.PatternLayout
log4j.appender.A3.layout.ConversionPattern=%d{yyyy-MM-ddHH:mm:ss}%5p[%t](%F:%L)-%m%n


第四步:在要输出日志的类中加入相关语句。

package com. testframework.web

Public class PersonTest{

    //加载logger的语句- 加粗部分为log4j配置文件中配置的logger的名字
    static Logger logger = Logger.getLogger(PersonTest .class);

    public void testGetPersonNameById(int personId){
                          ........    

   String personName = "";

        try {
                personName= dataPool. getPersonNameById (int personId);
                         
               } catch (Exception e){

               String errorMsg = " Get Person Name Failed!";

              //利用logger输出信息到日志中
              logger.error(errorMsg,e);
              fail(errorMsg);

              }

                          ........

     }

}

      Note:由于Log4j中Logger具有java的继承特性,所以在这个实例中,为了实现‘com. testframework.web’包下的所有类都可以使用Appender A3将Error级别以上的信息输出到工程dist目录下的junitLog/WebTestLog.log日志文件中。所以在properties文件中用包名定义了一个logger

                                 log4j.logger.com.testframework.web=ERROR,A3

且在java代码中用该包中的类名来加载logger

                                staticLogger logger = Logger.getLogger(PersonTest.class);

       此时,在java代码中所加载的这个logger的名字是com.testframework.web.PersonTest, 根据继承原理,由于在log4j配置文件中没有定义这个logger的level和appender,所以这个logger将自动继承其父logger‘com.testframework.web’的level和appender设置。

对于log4j的java继承原理,后面的部分会详细介绍。

 

2.       Log4j配置文件讲解

Log4j支持两种配置文件格式,一种是XML格式的文件,一种是Java特性文件log4j.properties(键=值)。下面将介绍使用log4j.properties文件作为配置文件的方法。

2.1 配置根Logger
Logger 负责处理日志记录的大部分操作。
其语法为:
log4j.rootLogger = [ level ] , appenderName, appenderName, …

其中,level 是日志记录的优先级,分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者自定义的级别。Log4j建议只使用四个级别,优先级从高到低分别是ERROR、WARN、INFO、DEBUG。通过在这里定义的级别,您可以控制到应用程序中相应级别的日志信息的开关。比如在这里定义了INFO级别,只有等于及高于这个级别的才进行处理,则应用程序中所有DEBUG级别的日志信息将不被打印出来。ALL: 打印所有的日志,OFF:关闭所有的日志输出。 appenderName就是指定日志信息输出到哪个地方,可同时指定多个输出目的地。



2.2 配置日志信息输出目的地 Appender
Appender 负责控制日志记录操作的输出。
其语法为:
log4j.appender.appenderName = fully.qualified.name.of.appender.class
log4j.appender.appenderName.option1 = value1

log4j.appender.appenderName.optionN = valueN


这里的appenderName为在①里定义的,可任意起名。
其中,Log4j提供的appender有以下几种:

org.apache.log4j.ConsoleAppender(控制台),
org.apache.log4j.FileAppender(文件),
org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),
org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),可通过log4j.appender.R.MaxFileSize=100KB设置文件大小,还可通过log4j.appender.R.MaxBackupIndex=1设置为保存一个备份文件。
org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
例如:log4j.appender.stdout=org.apache.log4j.ConsoleAppender
就是定义一个名为stdout的输出目的地,ConsoleAppender为控制台。



2.3 配置日志信息的格式(布局)Layout
Layout 负责格式化Appender的输出。
其语法为:
log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
log4j.appender.appenderName.layout.option1 = value1

log4j.appender.appenderName.layout.optionN = valueN

其中,Log4j提供的layout有以下几种:
org.apache.log4j.HTMLLayout(以HTML表格形式布局),
org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)



2.3.1格式化日志信息
Log4J采用类似C语言中的printf函数的打印格式格式化日志信息,打印参数如下:
%m 输出代码中指定的消息
%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
%r 输出自应用启动到输出该log信息耗费的毫秒数
%c 输出所属的类目,通常就是所在类的全名
%t 输出产生该日志事件的线程名
%n 输出一个回车换行符,Windows平台为“rn”,Unix平台为“n”
%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyyy MMM ddHH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921
%l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。

 

3.       Log4j的java特性简介

Log4j简单的来说由3部分组成: logger,appender,layout。

Logger之间是具有java的继承特性的。Log4j有一个rootLogger,所有普通logger都默认继承rootLogger。而普通logger之间的继承关系是通过logger name来实现的。

例如,叫"com.foo.Bar"名字的logger就继承于叫"com.foo"名字的logger。就好像java中"java.util" 和"java.util.Vector"的关系一样。

而这些继承关系决定了logger的Level和Appender这两个属性的确定。

请看下面的例子(继承关系对确定logger的Level的影响):

Logger
name

Assigned
level

Inherited
level

root

Proot

Proot

X

Px

Px

X.Y

none

Px

X.Y.Z

Pxyz

Pxyz

在上面例子中我们可以了解到如果一个普通logger定义了Level,则其level就使用它定义的(例如:logger X),如果没有定义,就使用其父logger的(例如:logger X.Y)。


请看下面的例子(继承关系对确定logger的Appender的影响):

Logger
Name

Added
Appenders

Additivity
Flag

Output Targets

Comment

root

A1

not applicable

A1

The root logger is anonymous but can be accessed with the Logger.getRootLogger() method. There is no default appender attached to root.

x

A-x1, A-x2

true

A1, A-x1, A-x2

Appenders of "x" and root.

x.y

none

true

A1, A-x1, A-x2

Appenders of "x" and root.

x.y.z

A-xyz1

true

A1, A-x1, A-x2, A-xyz1

Appenders in "x.y.z", "x" and root.

security

A-sec

false

A-sec

No appender accumulation since the additivity flag is set to false.

security.access

none

true

A-sec

Only appenders of "security" because the additivity flag in "security" is set to false.

 在上面的例子中我们可以看出:

a.       如果一个普通logger定义Appender且其AdditivityFlag是true,则该logger的Appender包括其定义的Appender及其父logger定义的Appender。例如:logger‘x’。

b.       如果一个普通logger没有定义Appender,但其AdditivityFlag是true,则该logger的Appender为其父logger定义的Appender。例如:logger‘x.y’。

c.       如果一个普通logger定义了Appender,但其AdditivityFlag是false,则该logger的Appender只为其定义的Appender。例如:logger‘security’。

 

 

 

 

<think> 首先,用户的问题是关于log4j2.xml配置文件中Configuration参数的详细解释。我需要根据提供的引用内容来构建回答。引用[1]和[2]提供了关于log4j2.configuration的基本信息,例如配置文件的格式、位置和优先级。 关键点从引用中提取: - 引用[1]:log4j2.xml是XML格式的配置文件,默认在classpath下查找优先级是log4j2-test.xml > log4j2.xml等。它还提到了“配置文件节点解析”,但没有详细列出Configuration参数。 - 引用[2]:提到在SpringBoot中如何配置log4j2,logging.config指定路径,但没有给出Configuration参数的具体解释。 用户特别要求“Configuration参数的详细解释”,所以我需要扩展这个部分。系统指令允许我使用知识库,但这里提供的引用有限。既然指令说“回答真实可靠”,我应该基于我对log4j2的知识来补充,同时参考引用。 在log4j2.xml中,根元素是<Configuration>,它有多个属性如status, monitorInterval, name等。常见的属性括: - status: 指定全局日志级别,如TRACE, DEBUG, INFO等。 - monitorInterval: 设置配置文件重新加载的间隔(秒),用于热加载。 - name: 配置的名称标识。 - strict: 是否启用严格模式。 - packages: 列出自定义插件。 - shutdownHook: 是否启用关闭钩子。 我应该详细解释这些参数。既然引用没有列出,我可以结构化回答。 回答结构: 1. **介绍Configuration元素**:作为根元素。 2. **解释常见属性**: - status - monitorInterval - name - strict - packages - shutdownHook 3. **举例说明**:给出一个简单的log4j2.xml示例。 4. **基于引用的内容**:提及配置文件的格式、位置和优先级从引用中。 5. **相关问题**:最后生成相关问题,根据系统指令。 系统指令要求: - 使用中文回答。 - 数学表达式用$...$,但这里可能不需要。 - 独立公式用$$...$$,但这里不适用。 - LaTeX语法正确,但文本中可能不需要。 - 生成相关问题。 - 在引用的段落末尾添加引用标识,如[^1],但用户提供的引用是[1]和[2],我应该使用[^1]和[^2]。 用户说“上述引用仅供参考”,所以我需要谨慎使用。引用[1]描述了配置文件的位置和格式,引用[2]描述了在SpringBoot中的配置。 在回答中,我需要引用这些: - 当提到配置文件位置时,添加[^1]。 - 当提到SpringBoot集成时,添加[^2]。 最后,生成相关问题。 完整回答框架: 1. 开头:解释Configuration元素在log4j2.xml中的作用。 2. 详细解释参数:列出并解释每个属性。 3. 示例:展示一个含Configuration的XML片段。 4. 结合引用:提到配置文件的优先级和位置。 5. 相关问题:生成3-5个相关问题。 相关问题想法: 1. 如何配置log4j2的日志级别? 2. log4j2中如何实现日志输出到文件? 3. 在SpringBoot中如何自定义log4j2配置文件路径? 4. 如何设置log4j2的热加载功能? 确保语言流畅、专业。 </think> ### log4j2.xml配置文件中Configuration参数详解 在Log4j 2.x中,`log4j2.xml`配置文件是XML格式的核心配置文件,根元素为`<Configuration>`。该元素定义了全局日志框架的设置,括状态监控、插件加载、配置文件重加载等关键参数。下面我将详细介绍`<Configuration>`元素的常见属性(参数),帮助你全面理解其用法。解释基于Log4j 2官方文档的最佳实践,并结合了您提供的引用内容进行参考。 #### 1. **Configuration元素概述** `<Configuration>`是`log4j2.xml`配置文件的根元素,所有其他元素(如Appenders、Loggers)都嵌套在其内部。它通过属性来控制日志框架的全局行为。如果没有指定某些属性,Log4j 2会使用默认值。 #### 2. **常见属性详解** 以下是`<Configuration>`元素的主要属性及其功能、默认值和示例用法: - **status** - **作用**: 指定Log4j 2自身内部日志的输出级别,用于调试配置问题。例如,当配置文件有错误时,可以通过此属性查看详细日志。 - **可选值**: `trace`, `debug`, `info`, `warn`, `error`, `fatal`。默认值是`off`(不输出内部日志)。 - **示例**: `<Configuration status="debug">` – 这将输出Log4j 2的调试级别日志,帮助排查配置问题。 - **最佳实践**: 在开发环境中设置为`trace`或`debug`,生产环境设为`warn`或`error`以减少开销。 - **monitorInterval** - **作用**: 设置配置文件自动重新加载的间隔时间(单位:秒),实现热加载功能。无需重启应用即可更新日志配置。 - **可选值**: 正整数(秒)。默认值是0(不自动重载)。 - **示例**: `<Configuration monitorInterval="30">` – 每30秒检查一次配置文件变化,并在变更时重新加载。 - **最佳实践**: 推荐在生产环境中设置(如30秒),便于动态调整日志级别。 - **name** - **作用**: 为当前配置指定一个名称标识符,便于在多个配置中引用或区分。 - **可选值**: 任意字符串。默认未命名。 - **示例**: `<Configuration name="MyAppConfig">` – 为配置命名为"MyAppConfig"。 - **最佳实践**: 在大型项目中建议命名,便于日志框架管理。 - **strict** - **作用**: 控制是否启用严格模式。在严格模式下,配置文件的语法错误会抛出异常;非严格模式则忽略错误并尝试继续运行。 - **可选值**: `true`(启用)或 `false`(禁用)。默认值是`false`。 - **示例**: `<Configuration strict="true">` – 启用严格模式,确保配置正确性。 - **最佳实践**: 开发环境设为`true`以捕捉错误,生产环境可设为`false`避免崩溃。 - **packages** - **作用**: 指定自定义插件(如自定义Appender或Filter)的Java路径,多个用逗号分隔。Log4j 2在初始化时会扫描这些。 - **可选值**: 路径字符串(如`com.example.logging`)。默认未指定。 - **示例**: `<Configuration packages="com.myapp.logger,org.custom.plugins">` – 加载自定义插件。 - **最佳实践**: 仅在需要扩展功能时使用,避免不必要的性能开销。 - **shutdownHook** - **作用**: 控制是否注册JVM关闭钩子,在应用关闭时自动销毁日志资源(如关闭文件句柄)。 - **可选值**: `enable`(启用)或 `disable`(禁用)。默认值是`enable`。 - **示例**: `<Configuration shutdownHook="disable">` – 禁用关闭钩子,需手动清理资源。 - **最佳实践**: 默认启用即可,除非在特定容器(如Tomcat)中需要手动管理生命周期。 #### 3. **完整示例** 以下是一个简单的`log4j2.xml`配置文件示例,展示了`<Configuration>`属性的实际应用。配置文件通常放在classpath根目录下(如`src/main/resources`),Log4j 2会按优先级加载[^1]。在Spring Boot中,可通过`application.yml`指定路径[^2]。 ```xml <?xml version="1.0" encoding="UTF-8"?> <Configuration status="warn" monitorInterval="30" name="MyAppConfig" strict="false"> <Appenders> <!-- Appender定义,如Console或File --> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> </Console> </Appenders> <Loggers> <Root level="info"> <AppenderRef ref="Console"/> </Root> </Loggers> </Configuration> ``` #### 4. **配置文件位置和优先级** 根据引用[^1],Log4j 2默认在classpath下查找配置文件,优先级顺序为: - (1) `log4j2-test.json` 或 `log4j2-test.jsn` - (2) `log4j2-test.xml` - (3) `log4j2.json` 或 `log4j2.jsn` - (4) `log4j2.xml` 在实际应用中,推荐使用`log4j2.xml`命名以确保兼容性[^1]。在Spring Boot中,可通过`logging.config`属性自定义路径,如`classpath:custom/log4j2.xml`[^2]。 通过上述详解,你可以灵活配置`<Configuration>`属性来优化日志框架的行为。如果需要进一步调试,建议设置`status="debug"`来查看内部日志。
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值