文章目录

  • 原因剖析
  • 解决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 > > > >信息

注意点

  1. 该方案中web系统中的InfoLog.log文件中并不会包含server.log中的内容

  2. 该方案适用于迁移有日志系统的程序时使用,因为该方案中com.logtest日志对象对应的就是包名,因此你只需要设置该方案中com.logtest对象为你迁移的项目包名即可全部修改该包下所有的日志输出配置。

  3. 该方案中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}对应当前应用根目录;

记录-分模块输出到不同的日志文件相关推荐

  1. linux 输出gc日志,Tomcat输出保存JVM GC日志文件

    当系统出现问题时,分析java虚拟机GC日志可以帮助我们定位问题,一般来说, 我们可以通过制定JVM参数使tomcat保存GC日志文件,具体实现如下: Windows下 找到tomcat的解压目录,进 ...

  2. linux将屏幕输出到文件,Linux命令执行的屏幕输出内容重定向到日志文件

    摘要: 作者:Syn良子 出处:http://www.cnblogs.com/cssdongl 转载请注明出处 快速mark一下这个命令细节,免得以后使用又忘记了 大家都知道可以用echo来输出内容到 ...

  3. log4j输出多个自定义日志文件、动态配置多个日志文件

    转:http://blog.sina.com.cn/s/blog_8417657f0101lskw.html log4j的强大功能无可置疑,但实际应用中免不了遇到某个功能需要输出独立的日志文件的情况, ...

  4. java 某个类 单独输出日志_log4j实现特定功能的日志单独输出到指定的日志文件...

    如何实现按需要,使某个功能的日志单独输出到指定的日志文件呢? 其实只要在现有的log4j基础上稍加配置即可实现这一功能. 1.常用配置如下: #Level log4j.rootLogger = deb ...

  5. Nginx输出header到access日志文件

    Nginx输出header到access日志文件 背景 配置 nginx配置如下 http块配置如下 日志效果如下 背景 为了排查线上的bug,需要在nginx的日志中,打印客户端上传上来的heade ...

  6. QMT中print内容同时输出到控制台和日志文件

    在QMT中使用print可以打印出执行的日志,但是有时候执行程序时间长,打印的内容比较多,控制台中就要覆盖前面的内容,不能够完整的保留下来做分析,下面示例可以在print到控制台的同时记录到日志文件中 ...

  7. log4j输出多个自定义日志文件

    导入包 commons-logging-1.1.1.jar log4j-1.2.16.jar 如果在实际应用中需要输出独立的日志文件,怎样才能把所需的内容从原有日志中分离,形成单独的日志文件呢? 先看 ...

  8. java输出一些内容到日志文件

    在eclipse中新建一个项目,在src下新建一个log4j.properties文件,文件内容为下: log4j.rootLogger = debug,stdout,D,E log4j.append ...

  9. python写日志文件_Python logging日志模块 配置文件方式

    在一些微服务或web服务中我们难免需要日志功能,用来记录一些用户的登录记录,操作记录,以及一些程序的崩溃定位,执行访问定位等等; Python内置 非常强大的日志模块 ==> logging 今 ...

最新文章

  1. 哥德尔90年前的「不完备性定理」,奠定了计算机与AI的理论基础
  2. wince系统改安卓系统_什么是实时操作系统(RTOS)
  3. JAVA并发编程8_线程池的使用
  4. JavaScript事件的捕获阶段(Capture phase)
  5. JWT-基于token的认证方式
  6. TensorFlow学习笔记之五(卷积神经网络)
  7. 事件处理之二:点击事件监听器的五种写法
  8. mysql浅拷贝_深拷贝与浅拷贝
  9. Linux上构建一个RADIUS服务器详解
  10. 在VS 2010中查询和导航代码
  11. Linux 命令(4)—— declare/typeset 命令(builtin)
  12. ctrl+d与ctrl+c
  13. Hadoop系列之MapReduce 数据本地化 (29)
  14. 浪潮激荡大时代,存储起航新十年
  15. android 快速开机启动,MTK6577+Android之快速开机
  16. 18. Redis 管理命令-查看服务器状态
  17. Oracle-SQL语句的逻辑读怎么计算
  18. python读取csmar_wind数据转为国泰安数据 stata命令
  19. Android 8 WiFi断流,小米8wifi断流怎么解决
  20. input输入框只能输入整数

热门文章

  1. 拖得太久了 美运营商ATT取消三星折叠手机Galaxy Fold预购订单
  2. 有点香!苹果首次参加天猫618 iPhone/iPad全线降价
  3. 任性!特斯拉又涨价了 Model S、Model X国内售价上调
  4. X战警大战复联要来了?迪士尼收购21世纪福克斯后开始狂秀IP...
  5. python 内建函数basestring笔记
  6. 程序员:像机器一样思考
  7. php foreach结果如何保存_每天一个PHP语法四引用使用及实现
  8. python web开发基础_python web开发基本概念
  9. GB28181系统设计(四)-横向扩展和纵向扩展
  10. 新型智慧讲台的人工智能