当前位置: 首页 > 知识库问答 >
问题:

log4j1.2.17和java8u162不能翻转日志文件

武彭薄
2023-03-14

我们在生产环境中面临一个问题,在某些情况下,日志文件不能被翻转。我们使用的是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.

共有1个答案

林华皓
2023-03-14

我相信最好的方法就是调试代码,log4j可以像其他代码一样调试,没有这个我们只能推测。

我从您的配置中看到,您使用的是com.ge.medit.util.logging.maxFileSizerOllingFileAppender,它不是log4j的标准滚动文件追加器(可能是您公司的自定义追加器,可能有缺陷)。

如果您不能调试它,我只能提供几个提示,希望能有所帮助。

    null

在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时出现的问题。 查询日志 记录建立的客户端连接和执行的语句。 更新日志 记录更改数据的语句。不赞成使用该日志

  • 日志文件是重要的系统信息文件,其中记录了许多重要的系统事件,包括用户的登录信息、系统的启动信息、系统的安全信息、邮件相关信息、各种服务相关信息等。这些信息有些非常敏感,所以在 Linux 中这些日志文件只有 root 用户可以读取。   那么,系统日志文件保存在什么地方呢?还记得 /var/ 目录吗?它是用来保存系统动态数据的目录,那么 /var/log/ 目录就是系统日志文件的保存位置。我们通过