Log4J 如何分开Logger输出

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

?





1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

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

Log4J 如何分开Logger输出

时间: 2024-07-30 13:49:11

Log4J 如何分开Logger输出的相关文章

Log4J日志配置详解和自定义log4j日志级别及输出日志到不同文件实现方法

Log4J日志配置详解 一.Log4j简介 Log4j有三个主要的组件:Loggers(记录器),Appenders(输出源)和Layouts(布局).这里可简单理解为日志类别,日志要输出的地方和日志以何种形式输出.综合使用这三个组件可以轻松地记录信息的类型和级别,并可以在运行时控制日志输出的样式和位置. 1.Loggers Loggers组件在此系统中被分为五个级别:DEBUG.INFO.WARN.ERROR和FATAL.这五个级别是有顺序的,DEBUG < INFO < WARN <

log4j的多logger记录日志的简明使用

日志,应该是一个应用软件的基础功能之一.使用java语言,必然会使用一个日志库,我使用的是log4j的日志库.网上不少文章都有介绍,但是结合logger的不同功能介绍以及示例介绍的清楚的不多,至少我也是翻了不少网页,然后根据实验才得出这些功能. 我觉得log4j中主要有2个概念:logger.appender. logger是日志组件的主要概念,用于指定不同的包使用不同的日志级别,或者指定一个logger组件,以便在使用的时候可以使用getLogger(组件名)的方式获取该logger的定义.l

(OAF)jdeveloper集成log4j并将日志输出到指定文件并写入数据库

参考: How to configure Log4j in JDev 11g Ever wanted to use log4j in your adf project ? Well though Oracle doesn't recommends the use of log4j, i say its purely your choice to use it or not. So how do we configure log4j in adf  ? Pretty simple..just fo

Java中使用Log4j记录错误、输出日志

简介: Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台.文件.GUI组件.甚至是套接口服务器.NT的事件记录器.UNIX Syslog守护进程等:我们也可以控制每一条日志的输出格式:通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程.最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码. 官方站点:http://logging.apache.org/log4j/ Log4j配置: 第一步:

log4j实现日志的输出

1.log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台.文件.GUI组件,甚至是套接口服务器.NT的事件记录器.UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程. 2.先了解log4j的配置文件 3.读取配置文件并定义一个方法并输出日志 Logger logger= Logger.getLogger("项目名称"); PropertyConfigur

log4j.xml 日志只输出指定类配置

1.日志增加appender 指定日志生成时间.格式.间隔时间. 2.category指定哪些或哪个类日志生成在文件中. 3.自定义logger避免不要将userBehavior定义到root中避免继承导致其他日志写到userBehavior中. 配置样例如下: <!--增加 开始--> <appender name="userBehavior" class="com.xx.app.server.userbehavior.log.MinuteRollingA

Log4j Threshold属性指定输出等级

有时候我们需要把一些报错ERROR日志单独存到指定文件 ,这时候,Threshold属性就派上用场了: Threshold属性可以指定日志level Log4j根据日志信息的重要程度,分OFF.FATAL.ERROR.WARN.INFO.DEBUG.ALL 比如我们指定某个appender的Threshold为WARN,那这个appender输出的日志信息就是WARN级别以及WARN以上的级别: 假如我们指定的是ERROR,那这个就输出ERROR或者FATAL日志信息: 当然这里有个提前  ro

将java log4j的日志配置输出到mysql中

log4j可以支持将log输出到文件,数据库,甚至远程服务器,这次给大家分享下如何输出到mysql中. (1)log4j.properties的配置内容如下: log4j.rootLogger=ERROR,appender1,appender2 log4j.appender.appender1=org.apache.log4j.ConsoleAppender log4j.appender.appender1.layout=org.apache.log4j.PatternLayout log4j.

使用log4j的时候如何输出printStackTrace()的堆栈信息

研究了一下发现很简单,如下: log.error(e.getMessage(),e); 输出信息如下: 2009-05-11 12:40:45  [ Thread-1:2231687 ] - [ ERROR ]  Connection reset by peer: socket write error java.net.SocketException: Connection reset by peer: socket write error at java.net.SocketOutputStr