`

WAS上日志的问题

阅读更多
过看日志,发现was服务器上的server上的systemout.log太大,打开后发现有关业务数据的日志也全部写在了这个里面,于是进行改进。

先是改写了工程中的log4j配置文件,如下所示


view plaincopy to clipboardprint?
01.log4j.rootLogger=ERROR,A1  
02.log4j.logger.CLIENT=INFO,R  
03.log4j.logger.FUNCTION=INFO,FUNC  
04. 
05.log4j.additivity.CLIENT=false 
06.log4j.additivity.FUNCTION=false 
07. 
08.log4j.appender.A1=org.apache.log4j.ConsoleAppender   
09.log4j.appender.A1.layout=org.apache.log4j.PatternLayout   
10.log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss:SSSS} [%p] %m%n  
11. 
12.#log4j.appender.R=org.apache.log4j.FileAppender  
13.log4j.appender.R.Encoding=utf-8 
14.log4j.appender.R=org.apache.log4j.DailyRollingFileAppender  
15.log4j.appender.R.File=./logs/cussLog/dos_access.log  
16.log4j.appender.R.layout=org.apache.log4j.PatternLayout  
17.log4j.appender.R.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss:SSSS} [%p] %m%n  
18. 
19.log4j.appender.R.MaxFileSize=100MB  
20. 
21. 
22.log4j.appender.FUNC.Encoding=utf-8 
23.log4j.appender.FUNC=org.apache.log4j.DailyRollingFileAppender  
24.log4j.appender.FUNC.File=./logs/cussLog/dos_txn.log  
25.log4j.appender.FUNC.layout=org.apache.log4j.PatternLayout  
26.log4j.appender.FUNC.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss:SSSS} [%p] %m%n  
27. 
28.log4j.appender.FUNC.MaxFileSize=100MB 
log4j.rootLogger=ERROR,A1
log4j.logger.CLIENT=INFO,R
log4j.logger.FUNCTION=INFO,FUNC

log4j.additivity.CLIENT=false
log4j.additivity.FUNCTION=false

log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss:SSSS} [%p] %m%n

#log4j.appender.R=org.apache.log4j.FileAppender
log4j.appender.R.Encoding=utf-8
log4j.appender.R=org.apache.log4j.DailyRollingFileAppender
log4j.appender.R.File=./logs/cussLog/dos_access.log
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss:SSSS} [%p] %m%n

log4j.appender.R.MaxFileSize=100MB


log4j.appender.FUNC.Encoding=utf-8
log4j.appender.FUNC=org.apache.log4j.DailyRollingFileAppender
log4j.appender.FUNC.File=./logs/cussLog/dos_txn.log
log4j.appender.FUNC.layout=org.apache.log4j.PatternLayout
log4j.appender.FUNC.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss:SSSS} [%p] %m%n

log4j.appender.FUNC.MaxFileSize=100MB

主要是添加了additivity,使得自定义的两个logger不往父类的logger里面再写日志,这样就可以将业务日志和系统日志分离开,进行单独的配置和管理。

但是修改后在tomcat上测试成功后,转移到了was服务器上就遇到了一个这样的问题,全部日志仍然都写在了systemout里面,业务数据日志文件为空。

开始怀疑是log4j的配置问题,检查了很多遍,was服务器上使用的共享库也检查了,server也重启了,甚至node agent也重启了,还是一样的问题。

于是开始从tomcat与was的区别开始考虑。

以前代码中写业务日志文件的部分代码大概为:

view plaincopy to clipboardprint?
01.Log log = LogFactory.getLog(getClass()) 
Log log = LogFactory.getLog(getClass())

为了找到原因,将写日志文件的代码修改为:

view plaincopy to clipboardprint?
01.Logger log = Logger.getLogger(a.class)  
Logger log = Logger.getLogger(a.class) 

改成上述方式写业务数据成功,并且系统日志和业务日志也实现了分离。

Google了一下,相关问题还不少,apache甚至专门有文档来说明这个问题。

先说解决方法:

1. 用 Logger log = Logger.getLogger(BudgetQryServiceImpl.class)
直接获得 log4j 的 Logger 实例;

2. 仍用 Log log = LogFactory.getLog(getClass()) 但必须在应用目录的 META-INF/services 中加个文件 org.apache.commons.logging.LogFactory

内容为: org.apache.commons.logging.impl.LogFactoryImpl 。默认时,日志实现会被 websphere 的日志组件接管。

原因分析:

WAS也是用的commons-logging日志框架,commons-logging中LogFactory 获得实现的顺序是


1. 从应用的 META-INF/services/org.apache.commons.logging.LogFactory 中获得 LogFactory实现
2. 从系统环境中获得 org.qpache.commons.logging.LogFactory 获得 LogFactory 实现
3. 从 classpath 下的 commons-logging.properties 文件中获得 LogFactory 实现

而之所以在 tomcat 下表现良好的 log4j 日志输出放到 was 下不灵了,是因为 was 在第二步截住了,was 有一个系统环境变量 org.qpache.commons.logging.LogFactory 的值为 com.ibm.was.commons.logging.TrLogFactory,这个类在 ws-commons-logging.jar 中。

所以我们在使用 commons-logging 时,要能应用到所期望的 LogFactory 实现就要在第一步获得 LogFactory 实现,这就是前面的第二种方法。 而 Logger log = Logger.getLogger(a.class) 用直接得到 Log4j 的 Logger 也就是跳开了用 LogFactory 来获得 Logger 的尴尬。

我相信一句话,任何事情的发生都是有其原因的。小小的日志文件也是一样。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/iv2005/archive/2010/07/26/5767381.aspx
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics