记录-分模块输出到不同的日志文件
文章目录
- 原因剖析
- 解决1
- 测试
- 解决二
- 测试
今天碰到一个业务场景:
之前做好了一个web系统,接到任务需要将一个独立的Java系统嵌入到web系统中,Java系统嵌入顺利完成,此时出现了一个问题
由于Java和web两个系统都使用了日志系统
,造成此前的web系统中日志文件全部定向到嵌入后的Java系统日志输出文件内。
原因剖析
web中日志配置文件(log4j.properties)
log4j.rootLogger=info,A1,R
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.Target=System.out
log4j.appender.common.DatePattern = '.'yyyy-MM-dd
log4j.appender.common.Threshold = INFO
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=[%d{yyyy-MM-dd HH:mm:ss}] [%p] [%c:%L] %m%nlog4j.appender.R=org.apache.log4j.DailyRollingFileAppender
log4j.appender.R.File=../logs/xxx
log4j.appender.R.DatePattern ='-'yyyy-MM-dd'.log'
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.Append = true
log4j.appender.R.ImmediateFlush = true
log4j.appender.R.layout.ConversionPattern=[%d{yyyy-MM-dd HH:mm:ss}] [%p] [%c:%L] %m%n
Java中日志配置文件(log4j.properties)
log4j.rootLogger=info,stdout,R
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 = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%nlog4j.appender.R=org.apache.log4j.DailyRollingFileAppender
log4j.appender.R.File=../logs/xxx
log4j.appender.R.DatePattern ='-'yyyy-MM-dd'.log'
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.Append = true
log4j.appender.R.ImmediateFlush = true
log4j.appender.R.layout.ConversionPattern=[%d{yyyy-MM-dd HH:mm:ss}] [%p] [%c:%L] %m%n
由于都配置了log R对象因此会被覆盖指向为后者的文件中
解决1
### 根设置###
log4j.rootLogger = info,stdout,D,E### 输出信息到控制抬 ###
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 = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n### 输出DEBUG 级别以上的日志
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = /Users/mac/Documents/Java_log/InfoLog.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = info
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n### 输出ERROR 级别以上的日志
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File =/Users/mac/Documents/Java_log/ErrorLog.log
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n###新增其他日志文件
#新增log对象'collectLogger'
log4j.logger.collectLogger=info,DefaultCollectLog
#每天生成日志文件类'DailyRollingFileAppender'
log4j.appender.DefaultCollectLog = org.apache.log4j.DailyRollingFileAppender
log4j.appender.DefaultCollectLog.File =/Users/mac/Documents/Java_log/default_collect.log
log4j.appender.DefaultCollectLog.Append = true
log4j.appender.DefaultCollectLog.layout = org.apache.log4j.PatternLayout
log4j.appender.DefaultCollectLog.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
其中
新增其他日志文件
下扩充了log4j collectLogger对象,并且设置了该日志对象的等级为info
测试
假定log1,log2,log3为之前的web系统中类。而collect1,ollect2,ollect3为新增的Java系统中得类。
/*** TODO:<p> log1类,其他的两个log2和log3内容一致 <p/>** @package: log1* @Author mac* @Date 2020/4/15 8:14 下午* @Version V1.0**/
public class log1 {private static final Logger logger = Logger.getLogger(log1.class);public void run(){logger.info("log1 > > > >信息");logger.info("log1 > > > >信息");logger.info("log1 > > > >信息");logger.info("log1 > > > >信息");logger.info("log1 > > > >信息");logger.info("log1 > > > >信息");logger.info("log1 > > > >信息");}
}
/*** TODO:<p> collect1,其余collect2和collect3内容一致 <p/>** @package: log1* @Author mac* @Date 2020/4/15 8:31 下午* @Version V1.0**/
public class collect1 {// 注意,这里是刚刚定义的log4j 对象 ‘collectLogger’private static final Logger logger = Logger.getLogger("collectLogger");public void run(){logger.info("collect1 > > > >信息");logger.info("collect1 > > > >信息");logger.info("collect1 > > > >信息");logger.info("collect1 > > > >信息");logger.info("collect1 > > > >信息");logger.info("collect1 > > > >信息");logger.info("collect1 > > > >信息");}
}
java系统类中的日志输出为 ‘default_collect.log’
2020-04-15 20:53:57 [ main:9 ] - [ INFO ] collect1 > > > >信息
2020-04-15 20:53:57 [ main:10 ] - [ INFO ] collect1 > > > >信息
2020-04-15 20:53:57 [ main:10 ] - [ INFO ] collect1 > > > >信息
2020-04-15 20:53:57 [ main:10 ] - [ INFO ] collect1 > > > >信息
2020-04-15 20:53:57 [ main:10 ] - [ INFO ] collect1 > > > >信息
2020-04-15 20:53:57 [ main:10 ] - [ INFO ] collect1 > > > >信息
2020-04-15 20:53:57 [ main:11 ] - [ INFO ] collect1 > > > >信息
2020-04-15 20:53:57 [ main:11 ] - [ INFO ] collect2 > > > >信息
2020-04-15 20:53:57 [ main:11 ] - [ INFO ] collect2 > > > >信息
2020-04-15 20:53:57 [ main:11 ] - [ INFO ] collect2 > > > >信息
2020-04-15 20:53:57 [ main:12 ] - [ INFO ] collect2 > > > >信息
2020-04-15 20:53:57 [ main:12 ] - [ INFO ] collect2 > > > >信息
2020-04-15 20:53:57 [ main:12 ] - [ INFO ] collect2 > > > >信息
2020-04-15 20:53:57 [ main:12 ] - [ INFO ] collect2 > > > >信息
2020-04-15 20:53:57 [ main:13 ] - [ INFO ] collect3 > > > >信息
2020-04-15 20:53:57 [ main:13 ] - [ INFO ] collect3 > > > >信息
2020-04-15 20:53:57 [ main:13 ] - [ INFO ] collect3 > > > >信息
2020-04-15 20:53:57 [ main:13 ] - [ INFO ] collect3 > > > >信息
2020-04-15 20:53:57 [ main:14 ] - [ INFO ] collect3 > > > >信息
2020-04-15 20:53:57 [ main:14 ] - [ INFO ] collect3 > > > >信息
2020-04-15 20:53:57 [ main:14 ] - [ INFO ] collect3 > > > >信息
web系统类中的日志输出为 ‘infoLog.log’
2020-04-15 20:53:57 [ main:0 ] - [ INFO ] log1 > > > >信息
2020-04-15 20:53:57 [ main:2 ] - [ INFO ] log1 > > > >信息
2020-04-15 20:53:57 [ main:2 ] - [ INFO ] log1 > > > >信息
2020-04-15 20:53:57 [ main:3 ] - [ INFO ] log1 > > > >信息
2020-04-15 20:53:57 [ main:3 ] - [ INFO ] log1 > > > >信息
2020-04-15 20:53:57 [ main:3 ] - [ INFO ] log1 > > > >信息
2020-04-15 20:53:57 [ main:5 ] - [ INFO ] log1 > > > >信息
2020-04-15 20:53:57 [ main:5 ] - [ INFO ] log2 > > > >信息
2020-04-15 20:53:57 [ main:5 ] - [ INFO ] log2 > > > >信息
2020-04-15 20:53:57 [ main:5 ] - [ INFO ] log2 > > > >信息
2020-04-15 20:53:57 [ main:6 ] - [ INFO ] log2 > > > >信息
2020-04-15 20:53:57 [ main:6 ] - [ INFO ] log2 > > > >信息
2020-04-15 20:53:57 [ main:6 ] - [ INFO ] log2 > > > >信息
2020-04-15 20:53:57 [ main:6 ] - [ INFO ] log2 > > > >信息
2020-04-15 20:53:57 [ main:6 ] - [ INFO ] log3 > > > >信息
2020-04-15 20:53:57 [ main:7 ] - [ INFO ] log3 > > > >信息
2020-04-15 20:53:57 [ main:8 ] - [ INFO ] log3 > > > >信息
2020-04-15 20:53:57 [ main:9 ] - [ INFO ] log3 > > > >信息
2020-04-15 20:53:57 [ main:9 ] - [ INFO ] log3 > > > >信息
2020-04-15 20:53:57 [ main:9 ] - [ INFO ] log3 > > > >信息
2020-04-15 20:53:57 [ main:9 ] - [ INFO ] log3 > > > >信息
2020-04-15 20:53:57 [ main:9 ] - [ INFO ] collect1 > > > >信息
2020-04-15 20:53:57 [ main:10 ] - [ INFO ] collect1 > > > >信息
2020-04-15 20:53:57 [ main:10 ] - [ INFO ] collect1 > > > >信息
2020-04-15 20:53:57 [ main:10 ] - [ INFO ] collect1 > > > >信息
2020-04-15 20:53:57 [ main:10 ] - [ INFO ] collect1 > > > >信息
2020-04-15 20:53:57 [ main:10 ] - [ INFO ] collect1 > > > >信息
2020-04-15 20:53:57 [ main:11 ] - [ INFO ] collect1 > > > >信息
2020-04-15 20:53:57 [ main:11 ] - [ INFO ] collect2 > > > >信息
2020-04-15 20:53:57 [ main:11 ] - [ INFO ] collect2 > > > >信息
2020-04-15 20:53:57 [ main:11 ] - [ INFO ] collect2 > > > >信息
2020-04-15 20:53:57 [ main:12 ] - [ INFO ] collect2 > > > >信息
2020-04-15 20:53:57 [ main:12 ] - [ INFO ] collect2 > > > >信息
2020-04-15 20:53:57 [ main:12 ] - [ INFO ] collect2 > > > >信息
2020-04-15 20:53:57 [ main:12 ] - [ INFO ] collect2 > > > >信息
2020-04-15 20:53:57 [ main:13 ] - [ INFO ] collect3 > > > >信息
2020-04-15 20:53:57 [ main:13 ] - [ INFO ] collect3 > > > >信息
2020-04-15 20:53:57 [ main:13 ] - [ INFO ] collect3 > > > >信息
2020-04-15 20:53:57 [ main:13 ] - [ INFO ] collect3 > > > >信息
2020-04-15 20:53:57 [ main:14 ] - [ INFO ] collect3 > > > >信息
2020-04-15 20:53:57 [ main:14 ] - [ INFO ] collect3 > > > >信息
2020-04-15 20:53:57 [ main:14 ] - [ INFO ] collect3 > > > >信息
问题:该方案中web系统日志文件包含了java系统的输出日志,如并且java系统日志文件时独立的,如果你想要这种效果那么可以使用该方案
原因是:由于log4j.rootLogger = info,stdout,D,E中‘rootLogger’为根对象,所有的日志对象都继承于该对象,因此新增的log4j collectLogger对象也属于根对象的子类,并且子类中输出的内容也要输出到根对象配置的日志文件中。
解决二
## Global logging configuration 开发时候建议使用 debug
#log4j.rootLogger=DEBUG, stdout
## Console output...
#log4j.appender.stdout=org.apache.log4j.ConsoleAppender
#log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
#log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
##log4j.appender.A1.File=/Volumes/mac资料/IdeaWorkSpace/maven-Java/src/main/java/thread_lean/threadSafety/logFile.log
#log4j.appender.A1.File=../logs/logFile.log### 根设置###
log4j.rootLogger = info,stdout,D,E### 输出信息到控制抬 ###
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 = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n### 输出DEBUG 级别以上的日志
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = /Users/mac/Documents/Java_log/InfoLog.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = info
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n### 输出ERROR 级别以上的日志
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File =/Users/mac/Documents/Java_log/ErrorLog.log
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n###新增其他日志文件:即系统中分模块来进行日志控制,不同的模块设定不一样的日志文件
#新增log对象'collectLogger'
log4j.logger.collectLogger=info,DefaultCollectLog
#每天生成日志文件类'DailyRollingFileAppender'
log4j.appender.DefaultCollectLog = org.apache.log4j.DailyRollingFileAppender
log4j.appender.DefaultCollectLog.File =/Users/mac/Documents/Java_log/default_collect.log
log4j.appender.DefaultCollectLog.Append = true
log4j.appender.DefaultCollectLog.layout = org.apache.log4j.PatternLayout
log4j.appender.DefaultCollectLog.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n###新增log对象'com.logtest'
#com.logtest 是包名,这个包里面的log日志会打到下面配置的路径下,且这个包里的日志文件不会再打到上面配置的总的log日志路径里
log4j.logger.com.logtest=info, service
log4j.additivity.com.logtest=false
log4j.appender.service=org.apache.log4j.DailyRollingFileAppender
log4j.appender.service.File=/Users/mac/Documents/Java_log/server.log
log4j.appender.service.Append=true
log4j.appender.service.layout=org.apache.log4j.PatternLayout
log4j.appender.service.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%-5p][%c{1}] [%t] - %m%n
log4j.appender.service.encoding=UTF-8
其中
新增log对象'com.logtest'
下扩充了log4j com.logtest对象,并且设置了该日志对象的等级为info
测试
/*** TODO:<p> 在此前测试类基础上新增test1用以测试 com.logtest对象<p/>** @package: com.logtest* @Author mac* @Date 2020/4/15 8:43 下午* @Version V1.0**/
public class test1 {private static final Logger logger = Logger.getLogger(test1.class);public void run(){logger.info("test1 > > > >信息");logger.info("test1 > > > >信息");logger.info("test1 > > > >信息");logger.info("test1 > > > >信息");logger.info("test1 > > > >信息");logger.info("test1 > > > >信息");logger.info("test1 > > > >信息");}
}
server.log
2020-04-15 20:53:57 [INFO ][test1] [main] - test1 > > > >信息
2020-04-15 20:53:57 [INFO ][test1] [main] - test1 > > > >信息
2020-04-15 20:53:57 [INFO ][test1] [main] - test1 > > > >信息
2020-04-15 20:53:57 [INFO ][test1] [main] - test1 > > > >信息
2020-04-15 20:53:57 [INFO ][test1] [main] - test1 > > > >信息
2020-04-15 20:53:57 [INFO ][test1] [main] - test1 > > > >信息
2020-04-15 20:53:57 [INFO ][test1] [main] - test1 > > > >信息
注意点
该方案中web系统中的InfoLog.log文件中并不会包含server.log中的内容
该方案适用于迁移有日志系统的程序时使用,因为该方案中com.logtest日志对象对应的就是包名,因此你只需要设置该方案中com.logtest对象为你迁移的项目包名即可全部修改该包下所有的日志输出配置。
该方案中com.logtest对象由于使用了‘log4j.additivity.com.logtest=false’会导致控制台中不会输出该包下所有的日志输出内容。
2020/5/8
在log4j.properties中使用相对路径配置日志文件有时候找不到项目相对路径,从而导致日志文件并没有产生。此时可以使用服务器环境变量或者vm环境变量。修改 … 为${catalina.home}。
log4j配置文件中路径配置一般有三种方法:
(1)绝对路径法:直接配置为系统绝对路径;
(2)相对路径法:
log4j.appender.logfile.File=…/logs/app.log,将日志记录到tomcat下的logs文件夹;
log4j.appender.logfile.File=logs/app.log,将日志记录到tomcat的bin目录下的logs文件夹;
(3)使用环境变量相对路径法:程序会优先找jvm环境变量,然后再找系统环境变量,来查找配置文件中的变量。
log4j.appender.logfile.File=user.dir/logs/app.log,使用tomcat容器时{user.dir}/logs/app.log,使用tomcat容器时user.dir/logs/app.log,使用tomcat容器时{user.dir}对应tomcat的bin目录;
log4j.appender.logfile.File=user.home/logs/app.log,{user.home}/logs/app.log,user.home/logs/app.log,{user.home}对应操作系统当前用户目录;
log4j.appender.logfile.File=webApp.root/logs/app.log,{webApp.root}/logs/app.log,webApp.root/logs/app.log,{webApp.root}对应当前应用根目录;
记录-分模块输出到不同的日志文件相关推荐
- linux 输出gc日志,Tomcat输出保存JVM GC日志文件
当系统出现问题时,分析java虚拟机GC日志可以帮助我们定位问题,一般来说, 我们可以通过制定JVM参数使tomcat保存GC日志文件,具体实现如下: Windows下 找到tomcat的解压目录,进 ...
- linux将屏幕输出到文件,Linux命令执行的屏幕输出内容重定向到日志文件
摘要: 作者:Syn良子 出处:http://www.cnblogs.com/cssdongl 转载请注明出处 快速mark一下这个命令细节,免得以后使用又忘记了 大家都知道可以用echo来输出内容到 ...
- log4j输出多个自定义日志文件、动态配置多个日志文件
转:http://blog.sina.com.cn/s/blog_8417657f0101lskw.html log4j的强大功能无可置疑,但实际应用中免不了遇到某个功能需要输出独立的日志文件的情况, ...
- java 某个类 单独输出日志_log4j实现特定功能的日志单独输出到指定的日志文件...
如何实现按需要,使某个功能的日志单独输出到指定的日志文件呢? 其实只要在现有的log4j基础上稍加配置即可实现这一功能. 1.常用配置如下: #Level log4j.rootLogger = deb ...
- Nginx输出header到access日志文件
Nginx输出header到access日志文件 背景 配置 nginx配置如下 http块配置如下 日志效果如下 背景 为了排查线上的bug,需要在nginx的日志中,打印客户端上传上来的heade ...
- QMT中print内容同时输出到控制台和日志文件
在QMT中使用print可以打印出执行的日志,但是有时候执行程序时间长,打印的内容比较多,控制台中就要覆盖前面的内容,不能够完整的保留下来做分析,下面示例可以在print到控制台的同时记录到日志文件中 ...
- log4j输出多个自定义日志文件
导入包 commons-logging-1.1.1.jar log4j-1.2.16.jar 如果在实际应用中需要输出独立的日志文件,怎样才能把所需的内容从原有日志中分离,形成单独的日志文件呢? 先看 ...
- java输出一些内容到日志文件
在eclipse中新建一个项目,在src下新建一个log4j.properties文件,文件内容为下: log4j.rootLogger = debug,stdout,D,E log4j.append ...
- python写日志文件_Python logging日志模块 配置文件方式
在一些微服务或web服务中我们难免需要日志功能,用来记录一些用户的登录记录,操作记录,以及一些程序的崩溃定位,执行访问定位等等; Python内置 非常强大的日志模块 ==> logging 今 ...
最新文章
- 哥德尔90年前的「不完备性定理」,奠定了计算机与AI的理论基础
- wince系统改安卓系统_什么是实时操作系统(RTOS)
- JAVA并发编程8_线程池的使用
- JavaScript事件的捕获阶段(Capture phase)
- JWT-基于token的认证方式
- TensorFlow学习笔记之五(卷积神经网络)
- 事件处理之二:点击事件监听器的五种写法
- mysql浅拷贝_深拷贝与浅拷贝
- Linux上构建一个RADIUS服务器详解
- 在VS 2010中查询和导航代码
- Linux 命令(4)—— declare/typeset 命令(builtin)
- ctrl+d与ctrl+c
- Hadoop系列之MapReduce 数据本地化 (29)
- 浪潮激荡大时代,存储起航新十年
- android 快速开机启动,MTK6577+Android之快速开机
- 18. Redis 管理命令-查看服务器状态
- Oracle-SQL语句的逻辑读怎么计算
- python读取csmar_wind数据转为国泰安数据 stata命令
- Android 8 WiFi断流,小米8wifi断流怎么解决
- input输入框只能输入整数
热门文章
- 拖得太久了 美运营商ATT取消三星折叠手机Galaxy Fold预购订单
- 有点香!苹果首次参加天猫618 iPhone/iPad全线降价
- 任性!特斯拉又涨价了 Model S、Model X国内售价上调
- X战警大战复联要来了?迪士尼收购21世纪福克斯后开始狂秀IP...
- python 内建函数basestring笔记
- 程序员:像机器一样思考
- php foreach结果如何保存_每天一个PHP语法四引用使用及实现
- python web开发基础_python web开发基本概念
- GB28181系统设计(四)-横向扩展和纵向扩展
- 新型智慧讲台的人工智能