Log4j分包输出日志

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配置做了这几个事情

  1. 定义3中输出方式: stdout(标准输出), file(输出到log4_showcase.log), R1(输出到main.log)
  2. 使用log4j.logger.{package}=? 方式控制每个包的输出等级, 输出方式采用stdout, file这两种输出方式
  3. 使用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,684  INFO Main:? - ========== Log4j Showcase :

log4_showcase.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}
  • 随着项目的演进需要对日志文件进行划分,否则这样生成的日志会让后期日志分析工作变成噩梦
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,558评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,002评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,024评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,144评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,255评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,295评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,068评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,478评论 1 305
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,789评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,965评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,649评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,267评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,982评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,800评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,847评论 2 351

推荐阅读更多精彩内容

  • 在应用程序中添加日志记录总的来说基于三个目的:监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统计分析...
    时待吾阅读 5,015评论 1 13
  • 在应用程序中添加日志记录总的来说基于三个目的:监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统计分析...
    时待吾阅读 4,975评论 0 6
  • 一、Log4j简介 Log4j有三个主要的组件:Loggers(记录器),Appenders (输出源)和Layo...
    默默守护阅读 1,904评论 2 8
  • src同级创建并设置log4j.properties #log4j中有五级logger: #FATAL 0 < #...
    米特侠阅读 2,561评论 0 1
  • Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI...
    尼尔君阅读 576评论 0 0