Log4j 不同的包输出到不同的文件
来源:互联网 发布:ios10蜂窝数据快捷键 编辑:程序博客网 时间:2024/05/16 07:18
今天想做个小项目,用quartz启动两个自动作业,因为以后还要有很多自动作业要添加进来,所以考虑不把日志输出到一个文件,而是每个自动作业Log输出到独立的一个文件,每个自动作业放在不同的java包里,用包来配置log4j。问题来了,当我在 log4j.rootLogger 里配置两个不同包的log时,这两个log总是输出到自己以及到对方配置的文件里,如:
log4j.properties:
log4j.rootLogger=info, zeng.quartz , zeng.quartz2
log4j.appender.zeng.quartz=org.apache.log4j.DailyRollingFileAppender
log4j.appender.zeng.quartz.File=../quartzLog/log/log1.log
log4j.appender.zeng.quartz.MaxFileSize=10KB
log4j.appender.zeng.quartz.MaxBackupIndex=4
log4j.appender.zeng.quartz.layout=org.apache.log4j.PatternLayout
log4j.appender.zeng.quartz.DatePattern ='.'yyyy-MM-dd
log4j.appender.zeng.quartz.Threshold = DEBUG
log4j.appender.zeng.quartz.layout.ConversionPattern= %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
#log4j.additivity.zeng.quartz=false
log4j.appender.zeng.quartz2=org.apache.log4j.DailyRollingFileAppender
log4j.appender.zeng.quartz2.File=../quartzLog/log/log2.log
log4j.appender.zeng.quartz2.MaxFileSize=10KB
log4j.appender.zeng.quartz2.MaxBackupIndex=4
log4j.appender.zeng.quartz2.layout=org.apache.log4j.PatternLayout
log4j.appender.zeng.quartz2.DatePattern ='.'yyyy-MM-dd
log4j.appender.zeng.quartz2.Threshold = DEBUG
log4j.appender.zeng.quartz2.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
#log4j.additivity.zeng.quartz2=false
java:
package <span style="color:#FF0000;">zeng.quartz</span>;import java.io.BufferedWriter;import java.io.File;import java.io.FileWriter;import java.text.SimpleDateFormat;import java.util.Date;import org.apache.log4j.Logger;/** * @author Zeng 2016-4-24 */public class MyQuartz1 {private transient static final Logger logger = Logger.getLogger(MyQuartz1.class);//private transient static final Logger logger = Logger//.getLogger("zeng.quartz.MyQuartz1");private static final String OUT_PATH = "C:\\Users\\Administrator\\Desktop\\QuartzLog.txt";private static final String RN = "\n";SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");public void beginTask() throws Exception {logger.info("Task MyQuartz1 begin!");try {File f = new File(OUT_PATH);logger.info("File path: " + OUT_PATH);BufferedWriter bw = new BufferedWriter(new FileWriter(f, true));bw.write(sdf.format(new Date()) + RN);bw.close();logger.info("Already wrote to file");} catch (Exception e) {logger.error(e.getMessage());e.printStackTrace();}logger.info("Task MyQuartz1 end!");}}
package <span style="color:#FF0000;">zeng.quartz2</span>;import java.io.BufferedWriter;import java.io.File;import java.io.FileWriter;import java.text.SimpleDateFormat;import java.util.Date;import org.apache.log4j.Logger;/** * @author Zeng * 2016-4-24 */public class MyQuartz2 {private transient static final Logger logger = Logger.getLogger(MyQuartz2.class);//private transient static final Logger logger = Logger//.getLogger("zeng.quartz2.MyQuartz2");private static final String OUT_PATH = "C:\\Users\\Administrator\\Desktop\\QuartzLog2.txt";private static final String RN = "\n";SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");public void beginTask() throws Exception {logger.info("Task MyQuartz2 begin!");try {File f = new File(OUT_PATH);logger.info("File path: " + OUT_PATH);BufferedWriter bw = new BufferedWriter(new FileWriter(f, true));bw.write(sdf.format(new Date()) + RN);bw.close();logger.info("Already wrote to file");} catch (Exception e) {logger.error(e.getMessage());e.printStackTrace();}logger.info("Task MyQuartz2 end!");}}
这样配置的话,
MyQuartz1的log会打到log1.log和log2.log里!:
2016-04-24 15:32:00 [ schedule_Worker-1:9817 ] - [ INFO ] Task MyQuartz1 begin!
2016-04-24 15:32:00 [ schedule_Worker-1:9819 ] - [ INFO ] File path: C:\Users\Administrator\Desktop\QuartzLog.txt
2016-04-24 15:32:00 [ schedule_Worker-2:9818 ] - [ INFO ] Task MyQuartz2 begin!
2016-04-24 15:32:00 [ schedule_Worker-2:9819 ] - [ INFO ] File path: C:\Users\Administrator\Desktop\QuartzLog2.txt
2016-04-24 15:32:00 [ schedule_Worker-1:9820 ] - [ INFO ] Already wrote to file
2016-04-24 15:32:00 [ schedule_Worker-2:9821 ] - [ INFO ] Already wrote to file
2016-04-24 15:32:00 [ schedule_Worker-1:9821 ] - [ INFO ] Task MyQuartz1 end!
2016-04-24 15:32:00 [ schedule_Worker-2:9821 ] - [ INFO ] Task MyQuartz2 end!
MyQuartz2的log也会打到log1.log和log2.log里!:
2016-04-24 15:32:00 [ schedule_Worker-1:9817 ] - [ INFO ] Task MyQuartz1 begin!
2016-04-24 15:32:00 [ schedule_Worker-1:9819 ] - [ INFO ] File path: C:\Users\Administrator\Desktop\QuartzLog.txt
2016-04-24 15:32:00 [ schedule_Worker-2:9818 ] - [ INFO ] Task MyQuartz2 begin!
2016-04-24 15:32:00 [ schedule_Worker-2:9819 ] - [ INFO ] File path: C:\Users\Administrator\Desktop\QuartzLog2.txt
2016-04-24 15:32:00 [ schedule_Worker-1:9820 ] - [ INFO ] Already wrote to file
2016-04-24 15:32:00 [ schedule_Worker-2:9821 ] - [ INFO ] Already wrote to file
2016-04-24 15:32:00 [ schedule_Worker-1:9821 ] - [ INFO ] Task MyQuartz1 end!
2016-04-24 15:32:00 [ schedule_Worker-2:9821 ] - [ INFO ] Task MyQuartz2 end!
原因是我把 log4j.rootLogger=info, zeng.quartz , zeng.quartz2 中的 zeng.quartz , zeng.quartz2配置到了 rootLogger 里了,而rootLogger 作为跟Log, 里面配置的所有log都会互通的,就是说Java里取到的Logger实例如果属于rootLogger,用这个实例打的log,也会打到 rootLogger其他实例里。具体到我的例子就是,我在
MyQuartz1
private transient static final Logger logger = Logger.getLogger(MyQuartz1.class);拿到的这个 logger,是配置在rootLogger里的,当我用这个logger打
logger.info("Task MyQuartz1 begin!");这条信息时,
这个log打到 zeng.quartz 配置的log1.log里。
然后发现rootLogger里还有 zeng.quartz2这个配置,就又把
logger.info("Task MyQuartz1 begin!");这个log打到 zeng.quartz2 配置的log2.log里。
于是 log1.log 和 log2.log 都有了这条信息。
MyQuartz2里打的log同理。
因为
MyQuartz1和
MyQuartz2同时启动,所以会有上面一个log文件里并行打log的效果。
解决:
不把自定义的log配置到rootLogger里,自定义的log用 log4j.logger 来定义:
log4j.properties:
log4j.rootLogger=info, stdout, rootFile
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d-[quartzProject] %p %m%n
log4j.appender.rootFile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.rootFile.File=../quartzLog/log/root.log
log4j.appender.rootFile.MaxFileSize=10KB
log4j.appender.rootFile.MaxBackupIndex=4
log4j.appender.rootFile.layout=org.apache.log4j.PatternLayout
log4j.appender.rootFile.DatePattern ='.'yyyy-MM-dd
log4j.appender.rootFile.Threshold = DEBUG
log4j.appender.rootFile.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
log4j.logger.zeng.quartz=DEBUG,zeng.quartz
log4j.appender.zeng.quartz=org.apache.log4j.DailyRollingFileAppender
log4j.appender.zeng.quartz.File=../quartzLog/log/log1.log
log4j.appender.zeng.quartz.MaxFileSize=10KB
log4j.appender.zeng.quartz.MaxBackupIndex=4
log4j.appender.zeng.quartz.layout=org.apache.log4j.PatternLayout
log4j.appender.zeng.quartz.DatePattern ='.'yyyy-MM-dd
log4j.appender.zeng.quartz.Threshold = DEBUG
log4j.appender.zeng.quartz.layout.ConversionPattern= %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
#log4j.additivity.zeng.quartz=false
log4j.logger.zeng.quartz2=DEBUG,zeng.quartz2
log4j.appender.zeng.quartz2=org.apache.log4j.DailyRollingFileAppender
log4j.appender.zeng.quartz2.File=../quartzLog/log/log2.log
log4j.appender.zeng.quartz2.MaxFileSize=10KB
log4j.appender.zeng.quartz2.MaxBackupIndex=4
log4j.appender.zeng.quartz2.layout=org.apache.log4j.PatternLayout
log4j.appender.zeng.quartz2.DatePattern ='.'yyyy-MM-dd
log4j.appender.zeng.quartz2.Threshold = DEBUG
log4j.appender.zeng.quartz2.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
#log4j.additivity.zeng.quartz2=false
log4j.logger.org.springframework=ERROR
log4j.logger.org.hibernate=ERROR
log4j.logger.org.hibernate.ps.PreparedStatementCache=ERROR
这样就是预期的那样打log:
log1.log:
2016-04-24 15:32:00 [ schedule_Worker-1:9817 ] - [ INFO ] Task MyQuartz1 begin!
2016-04-24 15:32:00 [ schedule_Worker-1:9819 ] - [ INFO ] File path: C:\Users\Administrator\Desktop\QuartzLog.txt
2016-04-24 15:32:00 [ schedule_Worker-1:9820 ] - [ INFO ] Already wrote to file
2016-04-24 15:32:00 [ schedule_Worker-1:9821 ] - [ INFO ] Task MyQuartz1 end!
log2.log:
2016-04-24 15:32:00 [ schedule_Worker-2:9818 ] - [ INFO ] Task MyQuartz2 begin!
2016-04-24 15:32:00 [ schedule_Worker-2:9819 ] - [ INFO ] File path: C:\Users\Administrator\Desktop\QuartzLog2.txt
2016-04-24 15:32:00 [ schedule_Worker-2:9821 ] - [ INFO ] Already wrote to file
2016-04-24 15:32:00 [ schedule_Worker-2:9821 ] - [ INFO ] Task MyQuartz2 end!
root.log:
2016-04-24 15:32:00 [ schedule_Worker-1:9817 ] - [ INFO ] Task MyQuartz1 begin!
2016-04-24 15:32:00 [ schedule_Worker-1:9819 ] - [ INFO ] File path: C:\Users\Administrator\Desktop\QuartzLog.txt
2016-04-24 15:32:00 [ schedule_Worker-2:9818 ] - [ INFO ] Task MyQuartz2 begin!
2016-04-24 15:32:00 [ schedule_Worker-2:9819 ] - [ INFO ] File path: C:\Users\Administrator\Desktop\QuartzLog2.txt
2016-04-24 15:32:00 [ schedule_Worker-1:9820 ] - [ INFO ] Already wrote to file
2016-04-24 15:32:00 [ schedule_Worker-2:9821 ] - [ INFO ] Already wrote to file
2016-04-24 15:32:00 [ schedule_Worker-1:9821 ] - [ INFO ] Task MyQuartz1 end!
2016-04-24 15:32:00 [ schedule_Worker-2:9821 ] - [ INFO ] Task MyQuartz2 end!
- Log4j 不同的包输出到不同的文件
- log4j的配置及使用,输出到文件和控制台,不同包输出到不同文件
- log4j不同的日志输出到不同的文件中
- 使log4j不同level的日志输出到不同文件
- log4j不同业务逻辑输出到不同的log文件
- log4j 不同模块输出到不同的文件
- log4j 不同模块输出到不同的文件
- Log4j按级别输出日志到不同的文件
- Log4j按级别输出日志到不同的文件
- Log4j按级别输出日志到不同的文件
- Log4j按级别输出日志到不同的文件
- 用log4j如何使不同的类的日志输出到不同的日志文件中.
- log4j不同的类输出到不同的日志文件中
- log4j日志针对不同的类输出到不同的文件中。
- log4j 不同的包(package)下的日志写入到不同的日志文件下
- Log4j 把不同包的日志打印到不同位置
- Log4j 把不同包的日志打印到不同位置
- Log4j 把不同包的日志打印到不同位置
- JEEWX微信企业号管家,开源免费,1.0版本发布
- 【bzoj 3239】【POJ 2417】Discrete Logging(BSGS)
- CentOS禁止packagekit离线更新服务的办法
- 解决方案_北京集体户口离职/辞职/跳槽_集体户口托管/挂靠_2015年9月
- 使用composer新建一个laravel项目
- Log4j 不同的包输出到不同的文件
- OpenCV3.0配置
- 分分钟钟搞定二维码生成以及扫描
- 浅谈Web安全-XSS攻击
- 设计模式总结篇
- 过拟合及其解决方法
- poj 2431 Expedition
- iOS进阶学习——React-Native-环境搭建-run-it
- 1004Toxophily