前言
Log4j是我从接触Java以来一直使用的日志组件。由于Log4j的简单,易用,导致我工作至今始终没有在意过Log4j的配置问题。到现在还在使用一中配置来应对所有项目:
log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target=System.out log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L - %m%n ### direct messages to file hibernate.log ### log4j.appender.file=org.apache.log4j.DailyRollingFileAppender log4j.appender.file.File=ipadserver.log log4j.appender.file.DatePattern = '.'yyyy-MM-dd log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L - %m%n log4j.rootLogger=info, stdout, file
随着项目的增长,日志文件变得非常庞大,使得定为问题编单异常困难。上面这个简单的配置带来的问题会让人很头疼:
- 所有包都采用一个日志等级,会打印出很多无效信息。有些需要info,有些需要error即可,从这个配置中无法区分
- 将rootLogger中的info调整成debug之后,hibernate,spring等框架的debug信息也会打印出来。
- 所有日志信息都存在一个文件中,虽然能够按时间归类,但是每天十几兆的日志也够人头疼的。
被以上问题折腾了很久。今天对Log4j分包输出日志做了研究。
(如果你希望全面了解log4j,可以直接进这个传送门: http://blog.csdn.net/anlina_1984/article/details/5313023)
Log4j分包控制研究
步骤
1. 在项目中创建4个包,分别是 log4.debug/error/info/warning
2. 在每个包下创建输出日志的测试代码:
log.debug("Debug in Debug Level"); log.info("Info in Debug Level"); log.warn("Warn in Debug Level"); log.error("Error in Debug Level");
3. 在MainClass中调用日志输出:
package lv.showcase.log4j; import lombok.extern.log4j.Log4j; import lv.showcase.log4j.debug.DebugLog; import lv.showcase.log4j.error.ErrorLog; import lv.showcase.log4j.info.InfoLog; import lv.showcase.log4j.warning.WarnLog; @Log4j public class Main { public static void main(String[] args) { log.info("========== Log4j Showcase :"); log.debug("You can not see this message in info level."); DebugLog.log(); InfoLog.log(); WarnLog.log(); ErrorLog.log(); } }
4. 采用如下log4j配置来控制日志输出:
log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target=System.out log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L - %m%n log4j.appender.file=org.apache.log4j.FileAppender log4j.appender.file.File=log4j_showcase.log log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L - %m%n log4j.appender.R1=org.apache.log4j.FileAppender log4j.appender.R1.File=main.log log4j.appender.R1.layout=org.apache.log4j.PatternLayout log4j.appender.R1.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L - %m%n log4j.logger.lv.showcase.log4j.debug=debug, stdout, file log4j.logger.lv.showcase.log4j.error=error, stdout, file log4j.logger.lv.showcase.log4j.info=info, stdout, file log4j.logger.lv.showcase.log4j.warning=warn, stdout, file #Main函数的日志会输出到main.log文件中 log4j.logger.lv.showcase.log4j.Main=info, stdout, R1
上述log4j配置做了这几个事情
- 定义3中输出方式: stdout(标准输出), file(输出到log4_showcase.log), R1(输出到main.log)
- 使用log4j.logger.{package}=? 方式控制每个包的输出等级, 输出方式采用stdout, file这两种输出方式
- 使用log4j.logger.{package}.{className}=? 方式控制单个类的输出等级,输出方式采用stdout, main
(项目代码见附件)
输出结果
控制台:
[java] 2013-08-06 10:22:01,684 INFO Main:? - ========== Log4j Showcase : [java] 2013-08-06 10:22:01,688 DEBUG DebugLog:? - Debug in Debug Level [java] 2013-08-06 10:22:01,689 INFO DebugLog:? - Info in Debug Level [java] 2013-08-06 10:22:01,689 WARN DebugLog:? - Warn in Debug Level [java] 2013-08-06 10:22:01,690 ERROR DebugLog:? - Error in Debug Level [java] 2013-08-06 10:22:01,691 INFO InfoLog:? - Info in Info Level [java] 2013-08-06 10:22:01,691 WARN InfoLog:? - Warn in Info Level [java] 2013-08-06 10:22:01,692 ERROR InfoLog:? - Error in Info Level [java] 2013-08-06 10:22:01,693 WARN WarnLog:? - Warn in Warning Level [java] 2013-08-06 10:22:01,693 ERROR WarnLog:? - Error in Warning Level [java] 2013-08-06 10:22:01,694 ERROR ErrorLog:? - Error in Error Level
Main.log 输出:
2013-08-06 10:22:01,688 DEBUG DebugLog:? - Debug in Debug Level 2013-08-06 10:22:01,689 INFO DebugLog:? - Info in Debug Level 2013-08-06 10:22:01,689 WARN DebugLog:? - Warn in Debug Level 2013-08-06 10:22:01,690 ERROR DebugLog:? - Error in Debug Level 2013-08-06 10:22:01,691 INFO InfoLog:? - Info in Info Level 2013-08-06 10:22:01,691 WARN InfoLog:? - Warn in Info Level 2013-08-06 10:22:01,692 ERROR InfoLog:? - Error in Info Level 2013-08-06 10:22:01,693 WARN WarnLog:? - Warn in Warning Level 2013-08-06 10:22:01,693 ERROR WarnLog:? - Error in Warning Level
总结
- 实际应用中可以配置多个appender,按照模块将日志分成不同文件
- Log4j的日志输出支持按包/类制定级别, 配置方式(log4j.logger.{package}.{className} )
- 随着项目的演进需要对日志文件进行划分,否则这样生成的日志会让后期日志分析工作变成噩梦
相关推荐
使用Log4j2的Layout组件定义日志输出格式。例如,我们可以使用PatternLayout,并自定义模式来指定哪些字段需要脱敏。例如,`%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n` 是一个基本的日志...
Log4j是Apache提供的一款广泛使用的日志框架,它提供了丰富的配置选项,允许开发者灵活地控制日志输出。当我们面对特定项目需求,比如需要自定义日志文件名和日志输出格式时,Log4j同样提供了相应的解决方案。 首先...
本文将深入讲解如何配置log4j以实现日志输出到控制台和文件,并提供相关代码实例和案例分析。** ### 一、Log4j简介 Log4j是Apache组织开发的一个开源项目,用于生成日志信息。它提供了灵活的配置方式,支持多种输出...
- **Logger**: 日志记录器,是Log4j的核心组件,负责实际的日志输出。你可以为每个功能模块创建一个独立的Logger,以便区分日志来源。 - **Appender**: 输出目的地,用于定义日志信息被发送到哪里,如控制台、文件...
### Log4j中配置日志文件相对路径方法详解 #### 概述 在软件开发过程中,日志记录是一项重要的功能,它有助于开发者调试程序、监控应用程序的运行状态以及追踪问题。`Log4j`作为一款优秀的日志管理工具,被广泛应用...
参照了几个网上大神配置,部分教程的描述有误,最终调试完成,可以实现kettle日志输出,测试版本...需要替换的文件为,Kettle的程序目录下data-integration-6.0\plugins\kettle5-log4j-plugin中有一个log4j.xml文件。
本文将深入探讨如何在 MyBatis 中配置 Log4j,实现日志同时输出到后台控制台和文件。 1. **日志框架集成** 在 MyBatis 中,我们通常会依赖日志框架如 Log4j、Logback 或 JDK 内置的日志系统。Log4j 以其强大的功能...
Log4j 是一个功能强大且广泛使用的日志记录工具,特别是在 SSM(Spring、Spring MVC、Mybatis)整合项目中,合理地配置 Log4j 对项目的日志记录和输出至关重要。本文将详细介绍 SSM 整合中的 Log4j 配置详情,帮助...
Log4j是Apache提供的一款广泛使用的日志框架,它提供了丰富的功能和灵活的配置,使得我们可以根据需要动态地改变日志的输出路径。本文将深入探讨如何在Log4j中实现日志输出路径的动态配置。 首先,我们要理解Log4j...
3. **配置Tomcat**:在`$CATALINA_HOME/lib`目录下添加`log4j-api.jar`和`log4j-slf4j-impl.jar`,这将使Tomcat使用Log4j2作为其内部的日志系统。 4. **排除其他日志实现**:确保你的应用中没有引入其他的日志实现...
这是log4j框架的配置文件,使用Java Properties格式,用于定义日志输出的行为。主要包括以下几个核心部分: 1. **Logger**: 定义日志级别,例如DEBUG、INFO、WARN、ERROR和FATAL。日志级别决定了哪些信息会被记录。...
1. **配置文件**:如`log4j2.xml`,这是Log4j2的配置中心,定义了日志记录的策略、级别、输出目标等。 2. **日志记录器(Logger)**:负责收集和处理日志事件。 3. **日志级别(Level)**:如`TRACE`, `DEBUG`, `...
Log4j通过配置文件(通常是log4j.properties或log4j.xml)来设定日志输出级别、格式、目的地等参数。如果日志没有按预期输出,我们需要检查以下几个方面: 1. **配置文件**:确认配置文件是否正确包含在项目中,...
Log4j提供了一个灵活且高效的日志系统,允许开发者自定义日志级别、输出格式和存储位置。 1. **日志级别**:Log4j支持多种日志级别,包括TRACE, DEBUG, INFO, WARN, ERROR, FATAL, OFF。其中,DEBUG用于调试信息,...
下面我们将从配置文件类型、核心JAR包、文件渲染和Log调用四个方面来比较Log4j和Log4j2的区别。 配置文件类型 Log4j通过一个.properties文件作为主配置文件,而Log4j2则弃用了这种方式,采用的是.xml、.json或者....
2. **配置全局 Log4j 属性文件**:在任意位置创建 `log4j.properties` 文件,并设置全局的日志级别、输出格式及存储路径等。通常会将该文件放置在 Tomcat 的 `conf` 目录下。 ```properties log4j.rootLogger=...
在《Log4j将System.out搞到log4j中输出四》这篇博文中,作者可能详细讨论了这些步骤,并可能分享了一些实战经验。通过学习这篇博文,读者可以更深入地了解如何在实际项目中实现这一转换,提升日志管理的效率。 总结...
1. **配置文件**:Log4j的配置文件通常是`log4j.properties`或`log4j.xml`,它定义了日志的级别(如DEBUG、INFO、WARN、ERROR、FATAL)、输出目的地(控制台、文件、数据库等)以及布局格式。 2. **日志类**:在...
压缩包中的"**log4j.properties**"文件是Log4j的配置文件,用于定义日志的输出级别、格式、目的地等。配置文件中的关键字和参数包括: 1. **rootLogger**: 定义了应用的根日志器,设置其级别(如DEBUG, INFO, WARN,...