`

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自定义日志文件名及日志输出格式

    根据项目需要,要求日志文件名及输出的日志内容头为特殊的格式,因此重写了log4j的一些方法,如要求的格式和项目不同,可根据示例参考进行再次的修改

    Log4j简介 介绍log4j的原理和用法

    log4j的使用习惯,让每个类都拥有一个private static的Logger对象,用来输出该类中的全部日志信息 ,使用xml文件来完成对log4j环境的配置。在项目的main class中的静态初始化块里放log4j环境的配置代码。注意:在一...

    log4j-1.2.9

    设置log4j的根目录,值为 日志等级(DEBUG,INFO,WARN,ERROR,FATAL) , 输出目标名称 log4j.rootLogger=DEBUG,A1 设置输出方式,常用的有: ConsoleAppender 在控制器中输出信息 RollingFileApperder 在文件中输出...

    Logger开源log日志jar包

    Orhan Obut 大神分享的一开源项目Logger输出日志,非常好用,该开源库能够把: 线程的信息 类的信息 方法的信息 格式打印json、xml等 点击链接跳转到源码打印处 此外还可根据自己需求进行定制化,并且还可日志输出...

    使用log4j进行日志记录

    import org.apache.log4j.Logger; import org.apache.log4j.PropertyConfigurator; import org.apache.log4j.xml.DOMConfigurator; public class Log4jDemo { static Logger log = Logger.getLogger(Log4...

    log4j-1.2.14

    设置log4j的根目录,值为 日志等级(DEBUG,INFO,WARN,ERROR,FATAL) , 输出目标名称 log4j.rootLogger=DEBUG,A1 设置输出方式,常用的有: ConsoleAppender 在控制器中输出信息 RollingFileApperder 在文件中输出...

    Log4j日志管理系统简单使用说明

    Log4j有三个主要的组件:Loggers,Appenders和Layouts,这里可简单理解为日志类别,日志要输出的地方和日志以何种形式输出。综合使用这三个组件可以轻松的记录信息的类型和级别,并可以在运行时控制日志输出的样式和...

    Java Log4j所需Jar包

    Java Log4j 1,2 所需Jar...用于日志记录的技术很多,如 jdk 的 logger 技术,apache 的 log4j、log4j2 技术等。 Log4j 的全称为 Log for java,即,专门用于 java 语言的日志记录工具。其目前有两个版 本:Log4j 与 Log4j2。

    log4j_properties配置详解

    ### set log levels ###log4j.rootLogger = debug , stdout , D , E### 输出到控制台 ###log4j.appender.stdout =org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.Target =System.outlog4j.appender.stdout....

    Log4j 学习笔记.doc

    Log4j 学习笔记. 1. Log4j的类图 2. Logger:日志写出器 1. Logger的输出方法 2. Logger的命名规则 3. Log level 4. 示例代码 5. 关于logger的两点说明 3. Appender:日志目的地 1. ConsoleAppender 2. ...

    log4j详细介绍Logger,Appender,Layout

    Log4J主要由三大组件构成:Logger:负责生成日志,并能够对日志信息进行分类筛选,通俗地讲就是决定什么日志信息应该输出,什么日志信息应该被忽略 Appender:定义了日志信息输出的目的地,指定日志信息应该被输出到...

    log4j.properties

    设置log4j的根目录,值为 日志等级(DEBUG,INFO,WARN,ERROR,FATAL) , 输出目标名称 log4j.rootLogger=DEBUG,A1 设置输出方式,常用的有: ConsoleAppender 在控制器中输出信息 RollingFileApperder 在文件中输出...

    保证看完就用log4j

    log4j.rootLogger=DEBUG #配置包信息的日志级别 #现在的配制是做llg.flex这个包下的的日志,级别是debug级别,起个别名叫llg, log4j.logger.llg.flex=DEBUG,llg #挂到文件 #配置llg 这个日志输出到文件 log4j....

    log4j使用实战

    log4j.rootLogger=INFO,CONSOLE log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender INFO是日志记录的最低等级,必须写,它和比它高的等级会进入日志,如WARN、ERROR、FATAL、OFF。 关于8个日志等级,参考:...

    Log4j入门学习笔记

    pptx格式。Log4j详细讲解。Logger--日志写出器,供程序员输出日志信息 。Log4j 允许开发人员定义多个Logger,每个Logger拥有自己的名字,Logger之间通过名字来表明隶属关系。

    log4j配置及使用

    最新上传的经典的log4j使用文档 Log4j和commons-log4j不是同一个记日志的工具 ①配置根Logger ②配置日志信息输出目的地Appender ③配置日志信息的格式(布局)

    Log4j学习和详细配置

    name : 这个那么就是你配置文件中对应的 log4j.logger. 后面的字符串  通过指定的名字获得记录器,如果必要的话,则为这个名字创建一个新的记录器。Name一般取本类的名字,比如:  static Logger logger = ...

    log4j参考手册

    1 Log4J简介 3 2 Log4J实现 3 2.1 Log4J配置 3 2.2 Log4J的类图 4 2.3 日志级别 4 2.4 配置Logger组件 4 2.5 配置Appender组件 5 2.6 配置Layout组件 6 2.7 日志文件的名称 7 2.8 日志文件的大小 7 2.9 Log4j....

    log4j的配置使用

    log4j配置文件,及使用,配置相应包 private static final Logger logger = Logger.getLogger(类名.class.getName()); 在每个类前加该语句,就可以输出相应日志

    log4j 使用说明 很信息

    LOG4J的设置与使用 1. 介绍 1.1. Log4j 是什么? Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务器、NT的事件记录器、UNIX ...

Global site tag (gtag.js) - Google Analytics