log4j向多个文件记录日志

今天配置了log4j中写多个文件的内容,配置了半天才搞出来,为了避免类似问题,写个博客吧。

首先说一下需求,每天要在7个文件夹中生成文件,文件格式为xxx.log.2000.01.01,自己开发个写文件工具也不是不可以,但是一想log4j有现成的功能,何乐而不为呢,思想胜于一切。所以需要一个logger对应一个文件,开始配置,我定义了7个rootLogger,分别是

[plain]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. charge_log, gold_log, prop_log, register_log, active_log, game_play_log, online_log  
[plain]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. </pre><pre name="code" class="plain">timer_log是错误日志记录。  

下面是我的配置文件:

[plain]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. log4j.rootLogger=INFO,stdout, timer_log, charge_log, gold_log, prop_log, register_log, active_log, game_play_log, online_log  
  2.   
  3. log4j.appender.stdout = org.apache.log4j.ConsoleAppender     
  4. log4j.appender.stdout.Target = System.out     
  5. log4j.appender.stdout.layout = org.apache.log4j.PatternLayout     
  6. log4j.appender.stdout.layout.ConversionPattern =  %d{ABSOLUTE} %5p %c{1}:%L - %m%n  
  7.   
  8. log4j.appender.timer_log=org.apache.log4j.DailyRollingFileAppender  
  9. log4j.appender.timer_log.Append=true  
  10. log4j.appender.timer_log.DatePattern='.'yyyy-MM-dd  
  11. log4j.appender.timer_log.File=../logs/timer/timer.log  
  12. log4j.appender.timer_log.Threshold=INFO  
  13. log4j.appender.timer_log.layout=org.apache.log4j.PatternLayout  
  14. log4j.appender.timer_log.layout.ConversionPattern=%d - %c [%t] %-5p %c %x %l - %m%n  
  15.   
  16. log4j.logger.charge_log=INFO, charge_log  
  17. log4j.appender.charge_log=org.apache.log4j.DailyRollingFileAppender  
  18. log4j.appender.charge_log.Append=true  
  19. log4j.appender.charge_log.DatePattern='.'yyyy-MM-dd  
  20. log4j.appender.charge_log.File=../logs/charge_log/charge.log  
  21. log4j.appender.charge_log.Threshold=INFO  
  22. log4j.appender.charge_log.layout=org.apache.log4j.PatternLayout  
  23. log4j.appender.charge_log.layout.ConversionPattern=%m%n  
  24. log4j.additivity.charge_log=false  
  25.   
  26. log4j.logger.gold_log=INFO, gold_log  
  27. log4j.appender.gold_log=org.apache.log4j.DailyRollingFileAppender  
  28. log4j.appender.gold_log.Append=true  
  29. log4j.appender.gold_log.DatePattern='.'yyyy-MM-dd  
  30. log4j.appender.gold_log.File=../logs/gold_log/gold_log.log  
  31. log4j.appender.gold_log.Threshold=INFO  
  32. log4j.appender.gold_log.layout=org.apache.log4j.PatternLayout  
  33. log4j.appender.gold_log.layout.ConversionPattern=%m%n  
  34. log4j.additivity.gold_log=false  
  35.   
  36. log4j.logger.prop_log=INFO, prop_log  
  37. log4j.appender.prop_log=org.apache.log4j.DailyRollingFileAppender  
  38. log4j.appender.prop_log.Append=true  
  39. log4j.appender.prop_log.DatePattern='.'yyyy-MM-dd  
  40. log4j.appender.prop_log.File=../logs/prop_log/prop_log.log  
  41. log4j.appender.prop_log.Threshold=INFO  
  42. log4j.appender.prop_log.layout=org.apache.log4j.PatternLayout  
  43. log4j.appender.prop_log.layout.ConversionPattern=%m%n  
  44. log4j.additivity.prop_log=false  
  45.   
  46. log4j.logger.register_log=INFO, register_log  
  47. log4j.appender.register_log=org.apache.log4j.DailyRollingFileAppender  
  48. log4j.appender.register_log.Append=true  
  49. log4j.appender.register_log.DatePattern='.'yyyy-MM-dd  
  50. log4j.appender.register_log.File=../logs/register_log/register_log.log  
  51. log4j.appender.register_log.Threshold=INFO  
  52. log4j.appender.register_log.layout=org.apache.log4j.PatternLayout  
  53. log4j.appender.register_log.layout.ConversionPattern=%m%n  
  54. log4j.additivity.register_log=false  
  55.   
  56. log4j.logger.active_log=INFO, active_log  
  57. log4j.appender.active_log=org.apache.log4j.DailyRollingFileAppender  
  58. log4j.appender.active_log.Append=true  
  59. log4j.appender.active_log.DatePattern='.'yyyy-MM-dd  
  60. log4j.appender.active_log.File=../logs/active_log/active_log.log  
  61. log4j.appender.active_log.Threshold=INFO  
  62. log4j.appender.active_log.layout=org.apache.log4j.PatternLayout  
  63. log4j.appender.active_log.layout.ConversionPattern=%m%n  
  64. log4j.additivity.active_log=false  
  65.   
  66. log4j.logger.game_play_log=INFO, game_play_log  
  67. log4j.appender.game_play_log=org.apache.log4j.DailyRollingFileAppender  
  68. log4j.appender.game_play_log.Append=true  
  69. log4j.appender.game_play_log.DatePattern='.'yyyy-MM-dd  
  70. log4j.appender.game_play_log.File=../logs/game_play_log/game_play_log.log  
  71. log4j.appender.game_play_log.Threshold=INFO  
  72. log4j.appender.game_play_log.layout=org.apache.log4j.PatternLayout  
  73. log4j.appender.game_play_log.layout.ConversionPattern=%m%n  
  74. log4j.additivity.game_play_log=false  
  75.   
  76. log4j.logger.online_log=INFO, online_log  
  77. log4j.appender.online_log=org.apache.log4j.DailyRollingFileAppender  
  78. log4j.appender.online_log.Append=true  
  79. log4j.appender.online_log.DatePattern='.'yyyy-MM-dd  
  80. log4j.appender.online_log.File=../logs/online_log/online_log.log  
  81. log4j.appender.online_log.Threshold=INFO  
  82. log4j.appender.online_log.layout=org.apache.log4j.PatternLayout  
  83. log4j.appender.online_log.layout.ConversionPattern=%m%n  
  84. log4j.additivity.online_log=false  

配置文件中有几个关键点:

1.log4j.logger.online_log=INFO, online_log 

2.log4j.additivity.online_log=false 

additivity的含义是 子Logger 是否继承 父Logger 的 输出源(appender) 的标志位。具体说,默认情况下 子Logger 会继承 父Logger 的appender,也就是说 子Logger 会在 父Logger 的appender里输出。若是additivity设为false,则 子Logger 只会在自己的appender里输出,而不会在 父Logger 的appender里输出。 

[plain]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. ConversionPattern=%m%n 是我只输出我的内容加个换行。  
[plain]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. </pre><pre name="code" class="plain">测试代码如下:  
[plain]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <pre name="code" class="java">import java.util.List;  
  2.   
  3. import org.slf4j.Logger;  
  4. import org.slf4j.LoggerFactory;  
  5. public class TestObservable {  
  6.       
  7.     Logger chargeLogger = LoggerFactory.getLogger("charge_log");  
  8.     Logger goldLogger = LoggerFactory.getLogger("gold_log");  
  9.     Logger propLogger = LoggerFactory.getLogger("prop_log");  
  10.     Logger registerLogger = LoggerFactory.getLogger("register_log");  
  11.     Logger activeLogger = LoggerFactory.getLogger("active_log");  
  12.     Logger gamePlayLogger = LoggerFactory.getLogger("game_play_log");  
  13.     Logger onlineLogger = LoggerFactory.getLogger("online_log");  
  14.       
  15.       
  16.     public void setSource(List<?> objectList,LoggerType loggerType) throws Exception {  
  17.   
  18.         if(objectList == null || objectList.isEmpty()) {  
  19.             return;  
  20.         }  
  21.           
  22.         for(Object obj : objectList) {  
  23.   
  24.             switch(loggerType) {  
  25.             case CHARGE_LOG :  
  26.                 chargeLogger.info(obj.toString());  
  27.                 break;  
  28.             case ACTIVE_ACCOUNT :  
  29.                 activeLogger.info(obj.toString());  
  30.                 break;  
  31.             case GAME_PLAY :  
  32.                 gamePlayLogger.info(obj.toString());  
  33.                 break;  
  34.             case GOLD_LOG :  
  35.                 goldLogger.info(obj.toString());  
  36.                 break;  
  37.             case ONLINE_PLAYER :  
  38.                 onlineLogger.info(obj.toString());  
  39.                 break;  
  40.             case PROP_LOG :  
  41.                 propLogger.info(obj.toString());  
  42.                 break;  
  43.             case REGISTER_LOG :  
  44.                 registerLogger.info(obj.toString());  
  45.                 break;  
  46.             default :  
  47.                 throw new Exception("Type not suitable.");  
  48.             }  
  49.         }  
  50.     }  
  51.   
  52.     public void setSource(Object obj,LoggerType loggerType) throws Exception {  
  53.   
  54.         if(obj == null) {  
  55.             return;  
  56.         }  
  57.   
  58.         switch(loggerType) {  
  59.         case CHARGE_LOG :  
  60.             chargeLogger.info(obj.toString());  
  61.             break;  
  62.         case ACTIVE_ACCOUNT :  
  63.             activeLogger.info(obj.toString());  
  64.             break;  
  65.         case GAME_PLAY :  
  66.             gamePlayLogger.info(obj.toString());  
  67.             break;  
  68.         case GOLD_LOG :  
  69.             goldLogger.info(obj.toString());  
  70.             break;  
  71.         case ONLINE_PLAYER :  
  72.             onlineLogger.info(obj.toString());  
  73.             break;  
  74.         case PROP_LOG :  
  75.             propLogger.info(obj.toString());  
  76.             break;  
  77.         case REGISTER_LOG :  
  78.             registerLogger.info(obj.toString());  
  79.             break;  
  80.         default :  
  81.             throw new Exception("Type not suitable.");  
  82.         }  
  83.     }  
  84.       
  85.     public static void main(String[] args) {  
  86.         <pre name="code" class="plain"><span style="white-space:pre">       </span>TestObservable <span style="font-family: Arial, Helvetica, sans-serif;"> abservable = new </span><span style="font-family: Arial, Helvetica, sans-serif;">TestObservable</span><span style="font-family: Arial, Helvetica, sans-serif;">();</span>  
try {abservable.setSource("gole_log", LoggerType.GOLD_LOG);abservable.setSource("charge_log", LoggerType.CHARGE_LOG);abservable.setSource("active_log", LoggerType.ACTIVE_ACCOUNT);abservable.setSource("game_play_log", LoggerType.GAME_PLAY);abservable.setSource("online_player", LoggerType.ONLINE_PLAYER);abservable.setSource("prop_log", LoggerType.PROP_LOG);abservable.setSource("register_log", LoggerType.REGISTER_LOG);} catch (Exception e) {e.printStackTrace();}}}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值