`

Log4J 如何分开Logger输出

阅读更多

今天和两个同事讨论Log4j,他们都需要解决一个问题,怎么分开输出Logger。这么讲不清楚,举个例子:

 

 

package com.gmail.at.ankyhe.log4jtest;

import org.apache.log4j.Logger;

public class ClassA {
	
	private static Logger logger = Logger.getLogger(ClassA.class.getName());
	
	public ClassA() {
		logger.info("ENTER ClassA()");
	}
	
	public void foo() {
		logger.info("foo()");
		bar();
	}
	
	public void bar() {
		Logger myLog = Logger.getLogger("bar");
		myLog.debug("bar()D");
		myLog.info("bar()I");
	}

}

 我希望bar可以输出到一个地方,其他的logger可以输出到一个地方。一般的配置文件如下:

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/' >

  <appender name="myConsole" class="org.apache.log4j.ConsoleAppender">
    <layout class="org.apache.log4j.PatternLayout">
      <param name="ConversionPattern"  
        value="[%d{dd HH:mm:ss,SSS\} %-5p] [%t] %c{2\} - %m%n" />
    </layout>
  </appender>

  <appender name="myFile" class="org.apache.log4j.RollingFileAppender">  
    <param name="File" value="xml.log" />
    <param name="Append" value="false" />
    <param name="MaxBackupIndex" value="10" />
    <layout class="org.apache.log4j.PatternLayout">
      <param name="ConversionPattern" value="%p (%c:%L)- %m%n" />
    </layout>
  </appender>


  <logger name="bar">
    <level value="info" /> 
    <appender-ref ref="myConsole" /> 
  </logger>
  
  <root>
    <priority value="debug" />
    <appender-ref ref="myFile" />
  </root>
</log4j:configuration>

 这样会发现一个问题,myLog的输出又会在文件,又会在终端。原因在Log4J官方的Introduction讲的很清楚:

http://logging.apache.org/log4j/1.2/manual.html  搜索Appender Additivity. 我解释一下就是默认情况下bar会集成root的输出。知道了原因,那怎么修改就简单了。

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/' >

  <appender name="myConsole" class="org.apache.log4j.ConsoleAppender">
    <layout class="org.apache.log4j.PatternLayout">
      <param name="ConversionPattern"  
        value="[%d{dd HH:mm:ss,SSS\} %-5p] [%t] %c{2\} - %m%n" />
    </layout>
  </appender>

  <appender name="myFile" class="org.apache.log4j.RollingFileAppender">  
    <param name="File" value="xml.log" />
    <param name="Append" value="false" />
    <param name="MaxBackupIndex" value="10" />
    <layout class="org.apache.log4j.PatternLayout">
      <param name="ConversionPattern" value="%p (%c:%L)- %m%n" />
    </layout>
  </appender>


  <logger name="bar" additivity="false">
    <level value="info" /> 
    <appender-ref ref="myConsole" /> 
  </logger>
  
  <root>
    <priority value="debug" />
    <appender-ref ref="myFile" />
  </root>
</log4j:configuration>

 唯一的区别是在bar那个logger后面加了一个 additivity="false"。我试了一下,可以按照要求工作。这是xml的配置,一般的property的配置如下:

 

log4j.rootLogger=DEBUG, FA
log4j.category.bar = INFO, CA
log4j.additivity.bar = false

#Console Appender

log4j.appender.CA=org.apache.log4j.ConsoleAppender
log4j.appender.CA.layout=org.apache.log4j.PatternLayout
log4j.appender.CA.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n

#File Appender
log4j.appender.FA=org.apache.log4j.FileAppender
log4j.appender.FA.File=property.log
log4j.appender.FA.layout=org.apache.log4j.PatternLayout
log4j.appender.FA.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n

           
 

 

分享到:
评论
5 楼 qq594848450 2017-05-03  
log4j1.2.17版是这样配置的
log4j.additivity.appenderName=false
4 楼 qq594848450 2017-05-03  
非常有用,茅塞顿开。
3 楼 avi9111 2014-08-11  
博主知道修改properties 后,如何可以不重新编译,修改直接生效么?
2 楼 xbyang18 2013-01-10  
谢谢兄弟,正好用上,感谢了
1 楼 wertyac 2011-08-09  
牛呀,我没搞过log4j,只是在搞log4cpp和log4c++,突然感觉当时xiaoyu为啥要自己写呢!!!!!!!!!!

相关推荐

    log4j jar包

    Log4j不仅支持标准输出,如控制台,还可以写入文件、数据库,甚至通过网络发送,极大地增强了日志的管理和分析能力。 二、核心组件 1. **Logger**:日志记录器是Log4j的核心组件,负责接收日志消息并决定是否记录...

    log4j自定义日志文件名及日志输出格式

    Log4j是Apache提供的一款广泛使用的日志框架,它提供了丰富的配置选项,允许开发者灵活地控制日志输出。当我们面对特定项目需求,比如需要自定义日志文件名和日志输出格式时,Log4j同样提供了相应的解决方案。 首先...

    Log4j将System.out搞到log4j中输出四

    在《Log4j将System.out搞到log4j中输出四》这篇博文中,作者可能详细讨论了这些步骤,并可能分享了一些实战经验。通过学习这篇博文,读者可以更深入地了解如何在实际项目中实现这一转换,提升日志管理的效率。 总结...

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

    Log4j 的核心组件包括日志记录器(Logger)、日志输出目的地(Appender)和日志格式化器(Layout)。 二、配置 Log4j.properties 文件 在 SSM 整合项目中,配置 Log4j.properties 文件是必不可少的步骤。该文件...

    log4j多文件输出打印

    本话题将深入探讨如何使用Log4j实现多文件输出打印,以及自定义日志的配置。 首先,我们要理解Log4j的基本工作原理。Log4j的核心组件包括Logger、Appender和Layout。Logger负责生成日志事件,Appender则负责接收...

    Spring项目中怎么配置log4j

    log4j.rootLogger=DEBUG, stdout, R ``` 2. **定义输出目的地**:上述配置中,`stdout`表示控制台输出,`R`则代表一个名为`R`的appender。接下来,我们需要定义`R`的细节: ``` log4j.appender.R=org.apache....

    log4j配置 输出日志 案例

    本文将深入讲解如何配置log4j以实现日志输出到控制台和文件,并提供相关代码实例和案例分析。** ### 一、Log4j简介 Log4j是Apache组织开发的一个开源项目,用于生成日志信息。它提供了灵活的配置方式,支持多种输出...

    log4j-api-2.17.1.jar和log4j-core-2.17.1.jar

    这些接口包括最基本的`org.apache.logging.log4j.Logger`,它是所有日志记录的起点,以及`org.apache.logging.log4j.LogManager`,它负责管理日志配置和日志器实例。API库的主要目标是与实现层解耦,允许开发者在不...

    log4j.jar.rar

    Log4j提供了多种内置appender,如ConsoleAppender(控制台输出)和FileAppender(文件输出)。 3. **Layout**: 用于格式化日志事件,例如简单的文本格式、XML格式或者自定义格式。Commons Logging Layout是Log4j...

    log4j.jar及log4j.xml

    1. **Logger**: 这是Log4j的基本日志组件,它负责实际的日志记录工作。开发者可以通过创建Logger实例来发送不同级别的日志消息,如DEBUG、INFO、WARN、ERROR和FATAL。 2. **Appender**: Appender是日志消息的目标,...

    log4j日志报错解决办法

    首先,错误信息"log4j:WARN No appenders could be found for logger"表明Log4j找不到任何日志输出的目标,也就是没有设置日志appender。日志appender是Log4j用来定义日志输出目的地的组件,比如控制台、文件、邮件...

    log4j-控制指定类,包的日志级别:log4j-demo.zip

    Log4j是Apache提供的一款广泛使用的日志框架,它提供了丰富的功能,包括控制日志级别、定制日志格式、支持多种输出方式等。本示例将详细介绍如何使用Log4j来控制指定类或包的日志级别。 首先,我们来理解日志级别的...

    log4j(二):动态配置日志输出路径

    Log4j主要包括三个关键部分:Logger(日志器)、Appender(输出器)和Layout(布局)。Logger负责生成日志事件,Appender决定这些事件如何被输出(例如,写入文件、发送邮件或显示在控制台),而Layout则决定了日志...

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

    2. **Appenders**: Appender是Log4j的输出端口,用于指定日志信息的输出目标。在`log4j.properties`中,可能会定义多个Appender,比如将日志输出到控制台(ConsoleAppender)和文件(FileAppender)。 3. **Layouts...

    log4j的eclipse工程,输出到文件的方式配置log4j

    - `log4j.rootLogger`定义了日志的默认级别和输出目标。`DEBUG`表示记录所有DEBUG及以上的级别信息,`FILE`是我们设置的输出目的地。 - `log4j.appender.FILE`定义了一个名为FILE的Appender,类型为`org.apache.log...

    log4j按功能保存日志

    - **Logger**: 日志记录器,是Log4j的核心组件,负责实际的日志输出。你可以为每个功能模块创建一个独立的Logger,以便区分日志来源。 - **Appender**: 输出目的地,用于定义日志信息被发送到哪里,如控制台、文件...

    mybatis,log4j打印日志到后台和文件

    本文将深入探讨如何在 MyBatis 中配置 Log4j,实现日志同时输出到后台控制台和文件。 1. **日志框架集成** 在 MyBatis 中,我们通常会依赖日志框架如 Log4j、Logback 或 JDK 内置的日志系统。Log4j 以其强大的功能...

    log4j+slf4j实现 log4j测试代码,log4j+slf4j实现 log4j测试代码

    总结,SLF4J和Log4j的组合使用让日志管理更加灵活,开发者可以通过SLF4J的简洁API进行日志记录,同时利用Log4j的强大功能,如自定义输出格式和多种输出目的地。通过适当的配置和测试,我们可以确保日志系统按照预期...

    log4j示例项目

    Log4j主要包括三个核心组件:Logger(日志器)、Appender(输出端)和Layout(格式化器)。 - **Logger**: 负责生成日志信息,是日志操作的入口。根据严重性级别(如DEBUG、INFO、WARN、ERROR、FATAL),Logger可以...

    log4j.properties配置详解

    2. **控制台输出设置** (`log4j.appender.stdout`): 定义了控制台输出的格式和布局。例如: ```properties log4j.appender.stdout.layout.ConversionPattern=[QC]%p[%t]%C.%M(%L)|%m%n ``` 其中,`%p`表示日志...

Global site tag (gtag.js) - Google Analytics