log4j学习一:解决系统日志错位问题
2014-04-28 21:02
381 查看
这两天,开发的系统遇到了一个非常奇怪的问题,我们的前台程序会将日志时而输出到webapp.log,时而输出到其他日志文件如AlarmThreshold.log中,初看并无规律,但秉着“机器永远不会出错,出错的总是人”这一理念,试着分析原因。
log4j是java使用最为广泛的日志框架,它的使用也相对简单,通过配置appender,logger来定义日志的输出位置,输出格式等,也可以将数据输出到控制台,远程文件系统,数据库等。下面给出一个log4.xml的配置文件:
系统运行时首先会读取该配置文件初始化logger,对于rootlogger来说,通常是全局的。
经过分析,系统出现日志错误答应你的原因是,后台jar包与前台使用了不同的日志打印方式,后台程序在拿不到指定logger后,会使用root节点配置的appender,最过分的是,私有实现竟在代码中修改了appender指向的File,这种流氓似得行径给定位问题带来了巨大困难,与发射类似,运行时修改代码的成本太高了。
原因找到之后,剩下的就简单了,在重定向逻辑中加入判断是否是前后台分别处理,即可。
log4j是java使用最为广泛的日志框架,它的使用也相对简单,通过配置appender,logger来定义日志的输出位置,输出格式等,也可以将数据输出到控制台,远程文件系统,数据库等。下面给出一个log4.xml的配置文件:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration debug="false" xmlns:log4j="http://jakarta.apache.org/log4j/"> <appender name="console" class="org.apache.log4j.ConsoleAppender">//控制台输出 <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d{hh:mm:ss.SSS} [%t] %p - %m%n"/> </layout> </appender> <appender name="OptToDB" class="com.langchao.comm.logweb.OperationAppender">//自定义输出 <param name="Sql" value="%m" /> <filter class="org.apache.log4j.varia.LevelRangeFilter"> <param name="LevelMin" value="INFO" /> <param name="LevelMax" value="INFO" /> </filter> </appender> <appender name="common" class="org.apache.log4j.DailyRollingFileAppender">//滚动文件输出 <param name="File" value="${PM4H_LOG}/webapp.log"/> <param name="DatePattern" value="'.'yyyy-MM-dd"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %p - %m%n"/> </layout> <filter class="org.apache.log4j.varia.LevelRangeFilter"> <param name="LevelMin" value="DEBUG" /> <param name="LevelMax" value="FATAL" /> </filter> </appender> <appender name="development" class="org.apache.log4j.DailyRollingFileAppender"> <param name="File" value="${PM4H_LOG}/webdevelopment.log"/> <param name="DatePattern" value="'.'yyyy-MM-dd"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %p - %m%n"/> </layout> <filter class="org.apache.log4j.varia.LevelRangeFilter"> <param name="LevelMin" value="DEBUG" /> <param name="LevelMax" value="FATAL" /> </filter> </appender> <!-- ============================================ new pm log =============================================== --> <appender name="pm.web.log.debug" class="org.apache.log4j.DailyRollingFileAppender"> <param name="File" value="${PM4H_LOG}/webapp.log" /> <param name="DatePattern" value="'.'yyyy-MM-dd" /> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %p [%X{module}-%X{lognumber}] [USER:%X{user}] [%X{class}].[%X{method}]: %m%n" /> </layout> <filter class="org.apache.log4j.varia.LevelRangeFilter"> <param name="LevelMin" value="DEBUG" /> <param name="LevelMax" value="DEBUG" /> </filter> </appender> <appender name="pm.web.log.error" class="org.apache.log4j.DailyRollingFileAppender"> <param name="File" value="${PM4H_LOG}/webapp.log" /> <param name="DatePattern" value="'.'yyyy-MM-dd" /> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %p [%X{module}-%X{lognumber}] [USER:%X{user}] [%X{class}].[%X{method}]: %m%n" /> </layout> <filter class="org.apache.log4j.varia.LevelRangeFilter"> <param name="LevelMin" value="WARN" /> <param name="LevelMax" value="FATAL" /> </filter> </appender> <appender name="pm.web.log.info" class="org.apache.log4j.DailyRollingFileAppender"> <param name="File" value="${PM4H_LOG}/webapp.log" /> <param name="DatePattern" value="'.'yyyy-MM-dd" /> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %p [%X{module}-%X{lognumber}] [USER:%X{user}] %X{operation} %X{target} %X{target_count} %X{operation_action}: %m%n" /> </layout> <filter class="org.apache.log4j.varia.LevelRangeFilter"> <param name="LevelMin" value="INFO" /> <param name="LevelMax" value="INFO" /> </filter> </appender> <!-- ==================================== end =========================================== --> <logger name="commonLogger" additivity="false"> <level value ="INFO"/> <appender-ref ref="common" /> <appender-ref ref="console" /> </logger> <logger name="developmentLogger" additivity="false"> <level value ="INFO"/> <appender-ref ref="common" /> <appender-ref ref="console" /> </logger> <logger name="operationlog" additivity="false"> <level value ="INFO"/> <appender-ref ref="OptToDB" /> </logger> <logger name="com.ibatis" additivity="false"> <level value ="DEBUG"/> <appender-ref ref="console" /> </logger> <logger name="java.sql" additivity="false"> <level value ="DEBUG"/> <appender-ref ref="console" /> </logger> <logger name="pm.web.log" additivity="false">//自定义logger,代码中可以通过Log.getLogger获取 <level value ="DEBUG"/> <appender-ref ref="pm.web.log.error" /> <appender-ref ref="pm.web.log.info" /> <appender-ref ref="pm.web.log.debug" /> <appender-ref ref="console" /> </logger> <root>//默认logger,其他logger均集成此logger <level value="INFO" /> <appender-ref ref="common" /> </root> </log4j:configuration>
系统运行时首先会读取该配置文件初始化logger,对于rootlogger来说,通常是全局的。
经过分析,系统出现日志错误答应你的原因是,后台jar包与前台使用了不同的日志打印方式,后台程序在拿不到指定logger后,会使用root节点配置的appender,最过分的是,私有实现竟在代码中修改了appender指向的File,这种流氓似得行径给定位问题带来了巨大困难,与发射类似,运行时修改代码的成本太高了。
原因找到之后,剩下的就简单了,在重定向逻辑中加入判断是否是前后台分别处理,即可。
相关文章推荐
- log4j日志时间与系统时间不一致问题解决方法
- 学习的过程之一==关于log4j日志管理看到的自己之二=log4j后台打印日志看解决问题
- log4j日志时间与系统时间不一致问题解决方法
- 解决IntelliJ IDEA控制台乱码问题[包含程序运行时的log4j日志以及tomcat日志乱码]
- 解决系统日志: kernel: printk: xxxx messages suppressed. 问题
- JAVA学习日志 坦克游戏 解决了对象数组的问题,检测碰撞,随机下落速度,计时,线程终止
- Log4j创建日志服务器 解决集群日志问题及话单文件
- ELK学习10_ELK系列--实时日志分析系统ELK 部署与运行中的问题汇总
- 解决BlogEngine.Net系统 Inove主题 在IE6下错位的问题
- 解决log4j BufferedIO=true 时,buffer有残余日志不能记录的问题
- Java日志系统学习之log4j!
- 流式计算strom,Strom解决的问题,实现实时计算系统要解决那些问题,离线计算是什么,流式计算什么,离线和实时计算区别,strom应用场景,Strorm架构图和编程模型(来自学习资料)
- log4j日志文件乱码问题的解决方法
- 系统日志输出之log4j学习笔记
- Websphere6.1.x不打印Log4j日志问题解决办法
- log4j日志文件乱码问题的解决方法
- vim学习日志(5):vim下wimrc的配置,解决中文乱码问题
- Websphere6.1.x不打印Log4j日志问题解决办法
- mysql dba系统学习(10)innodb引擎的redo log日志的原理 mysql dba系统学习(11)管理innodb引擎的redo log日志的一个问题