我们在生产环境中面临一个问题,在某些情况下,日志文件不能被翻转。我们使用的是log4j1.2.17版本以及apache.commons-logging。创建一个自定义追加器来滚动文件。appender正在扩展log4j的FileAppender。下面是subAppend(LoggingEvent事件)方法的算法:
long n = System.currentTimeMillis();
// Has the time come to roll the log file?
if (n >= nextCheck)
{
now.setTime(n);
nextCheck = rc.getNextCheckMillis(now);
rollOver();
reachedMaxSize = false;
else
{
File f = new File(getFile());
// Has the log file has exceeded its maximum size?
if (!reachedMaxSize && f.length() > maxFileSize)
{
// Log file has reached it maximum size.
reachedMaxSize = true;
// Log one last message to the file stating the max has been reached.
LoggingEvent exeededEvent = new LoggingEvent(
getClass().getName(),
Logger.getLogger(getClass().getName()),
Priority.ERROR,
"Maximum log file size has been reached ("+maxFileSize/1024+"KB)",
null);
super.subAppend(exeededEvent);
}
// If the log has not reached its max size, write it. Otherwise,
// send log event to stdout.
if (!reachedMaxSize)
{
super.subAppend(event);
}
else
{
System.out.println(event.getRenderedMessage());
}
下面是log4j.properties文件
log4j.rootLogger=INFO,RCFLog
log4j.appender.RCFLog=com.ge.medit.util.logging.MaxFileSizeRollingFileAppender
log4j.appender.RCFLog.File=runtime/logs/rcf.log
log4j.appender.RCFLog.DatePattern=yyyyMMdd'_'{0}
log4j.appender.RCFLog.Encoding=UTF-8
log4j.appender.RCFLog.Append=true
log4j.appender.ConsoleLog=org.apache.log4j.ConsoleAppender
log4j.appender.ConsoleLog.layout=org.apache.log4j.PatternLayout
log4j.appender.ConsoleLog.layout.ConversionPattern=%p [%t] %c{1}: %m%n
log4j.appender.RCFLog.layout=org.apache.log4j.PatternLayout
log4j.appender.RCFLog.layout.ConversionPattern=@%d{yyyyMMdd HH:mm:ss.SSS}@ %p {%t} %c{1}: %m%n
log4j.logger.GUIEVT=INFO
根据观察,系统上有一个日期变化。日期被设定为当前日期前3个月。
Current Date- 10th May 2018
nextCheck - 11th May 2018 00:00
Changed Date- 10th March 2018
No backup is created as a condition at line 3 failed.
我相信最好的方法就是调试代码,log4j可以像其他代码一样调试,没有这个我们只能推测。
我从您的配置中看到,您使用的是com.ge.medit.util.logging.maxFileSizerOllingFileAppender
,它不是log4j的标准滚动文件追加器(可能是您公司的自定义追加器,可能有缺陷)。
如果您不能调试它,我只能提供几个提示,希望能有所帮助。
在debug中很容易跟踪,因为从技术上讲,重命名可能是用java.io.file#renameto
完成的,它返回true/false,这取决于重命名操作是成功还是失败。
为了模拟这种情况,您可以部署“隐藏”代码,它只是用消息“淹没”日志(您可以使用JMX、内部web servlet/消息处理程序--无论您想要什么,但它内部可以在循环中包含过多的日志消息(假的),如下所示:
class MyHiddenMBean {
Logger logger = ...
public void doLogManyTimes(int times) {
for(int i = 0; i < times; i++) {
logger.info("Artificial Logging Message : " + i);
}
}
}
您将立即到达max文件(当然,为了更快地模拟,您可以故意将其小得可笑),然后您将能够看到为什么renameto
不能工作
我最近一直在使用log4j2,遇到了一个问题。发生翻转时,活动日志文件保留其日志。是否可以清除日志文件,以便滚动的文件将只保留日志在名称中指定的时间段?
问题内容: 我有一个使用JDK Logging和logging.properties文件的应用程序,该文件通过java.util.logging.FileHandler.count配置许多较旧的日志文件。 在应用程序中的某些点上,我想触发日志文件的手动翻转以启动新的日志文件,例如在计划的活动开始之前。 JDK日志记录可能吗? 在Log4j中,我使用以下内容,但是在这种情况下,我想使用JDK Log
以下是发生这种情况的日志: 如果我在文件名中添加参数,那么我的新文件将不会被删除,但是翻转过程仍然会在初始的翻转过程完成后每秒触发一次,并且我会为发送到记录器的每个日志事件生成一个新文件。 编辑:我只是使用XML配置文件而不是上面的编程方法进行了尝试,得到了类似的结果。下面是我使用的配置文件: > 第一个是在初始事件之后每秒翻转一次,每个日志事件都有一个新文件 第二个是我上面描述的,在我的翻转文件
本文向大家介绍Android实现页面翻转和自动翻转功能,包括了Android实现页面翻转和自动翻转功能的使用技巧和注意事项,需要的朋友参考一下 1. 效果图,本功能用了ViewFlipper和GestureDetector (手势检测器)两个关键技术点: 2. 先写好布局文件,这里用到了ViewFlipper类,用于切换视图,毕竟ViewFlipper见得少,先介绍一下。 在xml布局中的方法介绍
本文向大家介绍Mysql日志文件和日志类型介绍,包括了Mysql日志文件和日志类型介绍的使用技巧和注意事项,需要的朋友参考一下 日志文件类型 MySQL有几个不同的日志文件,可以帮助你找出mysqld内部发生的事情: 日志文件 记入文件中的信息类型 错误日志 记录启动、运行或停止mysqld时出现的问题。 查询日志 记录建立的客户端连接和执行的语句。 更新日志 记录更改数据的语句。不赞成使用该日志
如何编写一个简单的log4j2.xml文件,将不同级别的日志放入不同的文件中? 例如,我们有错误日志,任何信息日志,我需要将所有错误日志消息推入一个日志文件,所有信息日志消息推入另一个文件。 我怎么做?