log4j学习一:解决系统日志错位问题

这两天,开发的系统遇到了一个非常奇怪的问题,我们的前台程序会将日志时而输出到webapp.log,时而输出到其他日志文件如AlarmThreshold.log中,初看并无规律,但秉着“机器永远不会出错,出错的总是人”这一理念,试着分析原因。

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学习一:解决系统日志错位问题,布布扣,bubuko.com

时间: 2024-11-11 22:30:58

log4j学习一:解决系统日志错位问题的相关文章

struts2 log4j:WARN Please initialize the log4j system properly. 解决方法

在tomcat启动的时候,出现这个警告: log4j:WARN No appenders could be found for logger (org.apache.commons.digester.Digester.sax).log4j:WARN Please initialize the log4j system properly. 解决办法: log4j.properties文件需要放到web-inf/class目录下面,在eclipse里面放到src目录下面,会自动拷贝到class目录下

Log4J学习【一】Log4J简介

Log4J简介 基本上所有的大型应用,包括我们常用的框架,比如hibernate:spring:struts等,在其内部都做了一定数量的日志信息.为什么要做这些日志信息,在系统中硬编码日志记录信息是调试系统,观察系统运行状态的一种方式.可能大部分程序员都还记得自己最开始写代码的时候,写一个方法总是出错,就喜欢使用System.out.println("1111111")之类的代码来查看程序的运行是否按照自己想要的方式在运行,其实这些sysout就是日志记录信息,但使用System.ou

【IScroll深入学习】解决IScroll疑难杂症

前言 在去年,我们对IScroll的源码进行了学习,并且分离出了一段代码自己使用,在使用学习过程中发现几个致命问题: ① 光标移位 ② 文本框找不到(先让文本框获取焦点,再滑动一下,输入文字便可重现) ③ 偶尔导致头部消失,头部可不是fixed哦   由于以上问题,加之去年我们团队的工作量极大,和中间一些组织架构调整,这个事情一直被放到了今天,心里一直对此耿耿于怀,因为IScroll让人忘不了的好处 小钗坚信,IScroll可以带来前端体验上的革命,因为他可以解决以下问题 区域滑动顺滑感的体验

log4j学习二-log4j认识

log4j(标准日志工具)三大组件: logger appender layout 例如: ? 1 2 3 log4j.logger.myTest2=INFO,B   log4j.appender.B=org.apache.log4j.ConsoleAppender   log4j.appender.B.layout=org.apache.log4j.PatternLayout  日志级别: off---------------------------------最高等级的,用于关闭所有日志记录

解决TextView错位的问题

错位,大多数是全角半角的问题 转化成全角 public String ToFull(String input){ char[] c=input.toCharArray(); for(int i=0;i if(c[i]==32){ c[i]=(char)12288; continue; } if(c[i]<127 && c[i]>32){ c[i]=(char)(c[i]+65248); } } return new String(c); } 转化成半角 public stati

vue学习:解决Apycharm的 * is only available in ES6(use &#39;esversion: 6&#39;) 问题

使用pycharm打开main.js,代码前出现黄点,js报错了 把鼠标移至import的波浪线上,出现提示:W119 - ‘import’  is only available in ES6(use 'esversion: 6') .意思是import属于ES6的语法,当前页面不能用. 在页面上加上 /* jshint esversion: 6 */ 就好了 vue学习:解决Apycharm的 * is only available in ES6(use 'esversion: 6') 问题

原创Log4j学习----会飞的猪

在前面,我们学习到了关于Log4j的一些知识,如它的构成由三大重要组成部分构成,Logger.Appenders.Layout.相关的作用,这里就不一一介绍了. 如Logger:控制要启用或禁用哪些日志记录语句,并对日志信息进行级别限制:Appenders指定了日志将打印到控制台还是文件中;而Layout则控制日志信息的显示格式. 下面简单介绍下,如何创建Logger对象及配置log4j.properties文件. A).Logger对象的获得或创建:            Logger被指定为

log4j学习(一)最简单的例子

前言: 之前笔者一直是在System.out中打日志的,由于笔者大部分时候是编写在tomcat容器里运行的一些个小web应用,所以这么做似乎没什么问题:打印出来的日志都可以在tomcat自己的log目录下的一些个日志文件里找到.但是,最近笔者接触到一个项目,需要编写一个不依赖于容器的能够直接在系统上运行的socket服务器程序,使得笔者急需一个能够打自己日志的地方,于是开始学习log4j.顺便,也逼迫笔者真正的好好学习关于流.比http更为底层TCP和其对应的socket通信.多线程等知识. 正

Log4J学习【二十三】常用的Appender之SocketAppender

前面这几个Appender就是Log4J提供的基于文件系统的Appender.当然,在一些特殊的需要记录到文件的Appender来说,我们只需要选择一个合适的Appender来继承并完成自己的逻辑即可.关于自定义Appender,待会再看.下面来看几个比较特殊的Appender. 前面所有介绍的Appender都有一个共同的特点,就是他们都需要配置一个Layout对象,下面要介绍的这个Appender非常特殊,他本身不需要任何Layout对象,这个Appender就是SocketAppender