您的位置:首页 > 其它

Log4j配置学习文档之二 处理日滚文件-实现原理

2017-04-19 13:55 1436 查看

实现原理

处理系统自己log4j定义的日滚日志文件

在系统中使用log4j中的RollingFileAppender和DailyRollingFileAppender可以实现日志文件的滚动,这里主要针对DailyRollingFileAppender产生的日滚文件做处理,因为DailyRollingFileAppender是每天都会滚动产生一个日志文件的(默认每天产生,DatePattern为’.’yyyy-MM-dd也会每天产生),产生的文件格式类似(设定的日志文件如果叫logfile.log的话)logfile.log.2016-12-27。而DailyRollingFileAppender又不支持MaxFileSize和MaxBackupIndex,所以时间一长的话,服务器里的日志文件就会很多,很耗存储空间,如果能够保留最近几天或者最近一周的文件就好了。所以本文档的出发点就是要让DailyRollingFileAppender产生的日滚文件保留最近一周的。

系统log4.properties配置如下

log4j.rootLogger=INFO, stdout, logfile

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%t] - <%m>%n

#add the parameter can write the sql to console
log4j.logger.org.apache=INFO
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
log4j.logger.java.sql.ResultSet=INFO

log4j.appender.logfile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.logfile.File=${catalina.home}/logs/OpenLog.log
#DailyRollingFileAppender不支持MaxFileSize和MaxBackupIndex
#log4j.appender.logfile.MaxFileSize=100MB
# 但是这里可以通过程序来让他“支持”MaxBackupIndex
log4j.appender.logfile.MaxBackupIndex=7
# Pattern to output: date priority [category] - message
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%t] - %m%n


原理

原理大概是:定义一个监听器,监听器在启动的时候启动一个定时器,log4j.properties文件加上一个表示保留日志文件备份数的属性,比如MaxBackupIndex,然后定时器每天定时扫描tomcat下的日志文件,按日志文件后缀升序排序,和MaxBackupIndex作比较,如果产生的日志文件数比MaxBackupIndex大的话就把时间较小的多余的日志文件删除掉,这样的话就可以保证log4j里定义的logfile.log在tomcat中只保留时间最近的MaxBackupIndex这么多个的日志文件了。

处理localhost_access_log

在tomcat的conf目录下的server.xml有这样一段配置

<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" pattern="%h %l %u %t "%r" %s %b" prefix="localhost_access_log." suffix=".txt"/>


这个会在logs下每天生成一个localhost_access_log的日志文件,文件的内容记录的是http请求信息。

产生的日志文件名格式类似这样



也就是说localhost_access_log日志文件也是一个日滚文件,每天都会生成一个的话,服务器会有压力,利用上面的原理,我们可以把localhost_access_log产生的文件名格式改成像上面那样以[.日期]结尾,就可以重用上面的方法来删除掉多余的localhost_access_log文件了。

原理:

把server.xml中的localhost_access_log的配置的[suffix=”.txt”]去掉

<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" pattern   ="%h %l %u %t "%r" %s %b" prefix="localhost_access_log." suffix=".txt"/>
去掉suffix=".txt"改为
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" pattern="%h %l %u %t "%r" %s %b" prefix="localhost_access_log."/>


这样tomcat产生的localhost_access_log就也是以日期为后缀的日志文件了



然后在上面对log4j系统日志文件做处理的时候就可以顺便处理localhost_access_log文件了。

当然了,原来就已经生成的localhost_access_log.txt文件还是会存在的,这就需要我们手动删除掉,或者批量把他们的.txt后缀去掉

linux中tomcat/logs下执行

rename 's/\.txt//'  ./*


去掉文件的.txt后缀,然后就可以统一交给程序来处理了

处理catalina.out

catalina.out里记录的内容主要是程序里System.out,e.printStackTrace等的信息,catalina.out日志文件只有一个,不会自己日滚,所以往往时间长了之后,catalina.out文件会非常大,所以需要对catalina.out做大小的控制处理,网上有些解决办法是直接把catalina.out的输出给关闭掉或者修改日志信息输出的等级来减少信息输出(参考:http://blog.csdn.net/vicky_yaoxj/article/details/25110033)。还有另外一种方法是把catalina.out变成像log4j那样的日滚文件来控制每个文件的大小,这里也主要实现一下这种方法。

原理

首先需要把catalina.out变成每日产生一个文件并且是以[.日期]结尾的形式,然后再通过上面的处理方法来删除多余的catalina.out

把catalina.out变成日滚文件有两种办法:

Linux下使用cronolog工具来切分catalina.out (参考:http://www.tuicool.com/articles/IZNrYb)

使用log4j切割 (参考:http://baalwolf.iteye.com/blog/1464093)

这里用第二种,步骤:

下载tomcat-juli.jar放在tomcat的bin目录下

拷贝log4j.jar,lo4j.properties到tomcat的lib目录下

删除conf/logging.properties

重启tomcat

log4j.properties的配置如下

log4j.rootLogger=INFO,CATALINA
log4j.logger.com.danga.MemCached.MemCachedClient=WARN,CATALINA
#log4j.appender.CONSOLE = org.apache.log4j.ConsoleAppender
#log4j.appender.CONSOLE.layout = org.apache.log4j.PatternLayout
#log4j.appender.CONSOLE.encoding = UTF-8
#log4j.appender.CONSOLE.layout.conversionPattern =[%p-%d{yyyy/MM/dd/HH:mm:ss}]%c{1}.(%L) - %m%n

# Define CATALINA appenders
log4j.appender.CATALINA = org.apache.log4j.DailyRollingFileAppender
log4j.appender.CATALINA.file = ${catalina.base}/logs/catalina.out
log4j.appender.CATALINA.DatePattern ='.'yyyy-MM-dd
log4j.appender.CATALINA.layout = org.apache.log4j.PatternLayout
log4j.appender.CATALINA.layout.conversionPattern = [%p-%d{yyyy/MM/dd/HH:mm:ss}]%c{1}.(%L) - %m%n
log4j.appender.CATALINA.append = true


这样lo4j会自动在午夜切割catalina.out成catalina.out.2011-03-07
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: