今天和两个同事讨论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
分享到:
相关推荐
Log4j不仅支持标准输出,如控制台,还可以写入文件、数据库,甚至通过网络发送,极大地增强了日志的管理和分析能力。 二、核心组件 1. **Logger**:日志记录器是Log4j的核心组件,负责接收日志消息并决定是否记录...
Log4j是Apache提供的一款广泛使用的日志框架,它提供了丰富的配置选项,允许开发者灵活地控制日志输出。当我们面对特定项目需求,比如需要自定义日志文件名和日志输出格式时,Log4j同样提供了相应的解决方案。 首先...
在《Log4j将System.out搞到log4j中输出四》这篇博文中,作者可能详细讨论了这些步骤,并可能分享了一些实战经验。通过学习这篇博文,读者可以更深入地了解如何在实际项目中实现这一转换,提升日志管理的效率。 总结...
Log4j 的核心组件包括日志记录器(Logger)、日志输出目的地(Appender)和日志格式化器(Layout)。 二、配置 Log4j.properties 文件 在 SSM 整合项目中,配置 Log4j.properties 文件是必不可少的步骤。该文件...
本话题将深入探讨如何使用Log4j实现多文件输出打印,以及自定义日志的配置。 首先,我们要理解Log4j的基本工作原理。Log4j的核心组件包括Logger、Appender和Layout。Logger负责生成日志事件,Appender则负责接收...
log4j.rootLogger=DEBUG, stdout, R ``` 2. **定义输出目的地**:上述配置中,`stdout`表示控制台输出,`R`则代表一个名为`R`的appender。接下来,我们需要定义`R`的细节: ``` log4j.appender.R=org.apache....
本文将深入讲解如何配置log4j以实现日志输出到控制台和文件,并提供相关代码实例和案例分析。** ### 一、Log4j简介 Log4j是Apache组织开发的一个开源项目,用于生成日志信息。它提供了灵活的配置方式,支持多种输出...
这些接口包括最基本的`org.apache.logging.log4j.Logger`,它是所有日志记录的起点,以及`org.apache.logging.log4j.LogManager`,它负责管理日志配置和日志器实例。API库的主要目标是与实现层解耦,允许开发者在不...
Log4j提供了多种内置appender,如ConsoleAppender(控制台输出)和FileAppender(文件输出)。 3. **Layout**: 用于格式化日志事件,例如简单的文本格式、XML格式或者自定义格式。Commons Logging Layout是Log4j...
1. **Logger**: 这是Log4j的基本日志组件,它负责实际的日志记录工作。开发者可以通过创建Logger实例来发送不同级别的日志消息,如DEBUG、INFO、WARN、ERROR和FATAL。 2. **Appender**: Appender是日志消息的目标,...
首先,错误信息"log4j:WARN No appenders could be found for logger"表明Log4j找不到任何日志输出的目标,也就是没有设置日志appender。日志appender是Log4j用来定义日志输出目的地的组件,比如控制台、文件、邮件...
Log4j是Apache提供的一款广泛使用的日志框架,它提供了丰富的功能,包括控制日志级别、定制日志格式、支持多种输出方式等。本示例将详细介绍如何使用Log4j来控制指定类或包的日志级别。 首先,我们来理解日志级别的...
Log4j主要包括三个关键部分:Logger(日志器)、Appender(输出器)和Layout(布局)。Logger负责生成日志事件,Appender决定这些事件如何被输出(例如,写入文件、发送邮件或显示在控制台),而Layout则决定了日志...
2. **Appenders**: Appender是Log4j的输出端口,用于指定日志信息的输出目标。在`log4j.properties`中,可能会定义多个Appender,比如将日志输出到控制台(ConsoleAppender)和文件(FileAppender)。 3. **Layouts...
- `log4j.rootLogger`定义了日志的默认级别和输出目标。`DEBUG`表示记录所有DEBUG及以上的级别信息,`FILE`是我们设置的输出目的地。 - `log4j.appender.FILE`定义了一个名为FILE的Appender,类型为`org.apache.log...
- **Logger**: 日志记录器,是Log4j的核心组件,负责实际的日志输出。你可以为每个功能模块创建一个独立的Logger,以便区分日志来源。 - **Appender**: 输出目的地,用于定义日志信息被发送到哪里,如控制台、文件...
本文将深入探讨如何在 MyBatis 中配置 Log4j,实现日志同时输出到后台控制台和文件。 1. **日志框架集成** 在 MyBatis 中,我们通常会依赖日志框架如 Log4j、Logback 或 JDK 内置的日志系统。Log4j 以其强大的功能...
总结,SLF4J和Log4j的组合使用让日志管理更加灵活,开发者可以通过SLF4J的简洁API进行日志记录,同时利用Log4j的强大功能,如自定义输出格式和多种输出目的地。通过适当的配置和测试,我们可以确保日志系统按照预期...
Log4j主要包括三个核心组件:Logger(日志器)、Appender(输出端)和Layout(格式化器)。 - **Logger**: 负责生成日志信息,是日志操作的入口。根据严重性级别(如DEBUG、INFO、WARN、ERROR、FATAL),Logger可以...
2. **控制台输出设置** (`log4j.appender.stdout`): 定义了控制台输出的格式和布局。例如: ```properties log4j.appender.stdout.layout.ConversionPattern=[QC]%p[%t]%C.%M(%L)|%m%n ``` 其中,`%p`表示日志...