【问题标题】:How do you create log files in log4j per program execution?每个程序执行时如何在 log4j 中创建日志文件?
【发布时间】:2011-06-09 04:43:53
【问题描述】:

我目前正在使用 log4j 中的 DailyRollingFileAppender 类来执行每日日志文件附加,但我希望将日志文件按以下格式分隔:

DATA.log.<date>_<time>_<random_#>

这应该在每个程序执行时完成一次,所以我最终会得到类似...

DATA.log.2011-01-13_12-46-38_<26>
DATA.log.2011-01-13_12-46-38_<79>
DATA.log.2011-01-13_12-46-38_<590>

可以将来自不同环境的不同日志文件汇集在一起​​。

在不扩展 FileAppender 类的情况下有没有办法做到这一点?至少,有没有办法:

DATA.log.<date>_<time>_<sequential_#>.log

谢谢

编辑:我已经在使用 DailyRollingFileAppender 来获取类似 DATA.log.2011-01-13 的内容。我想知道如何在每次程序执行后(或每次程序执行前)让日志文件翻转,并在末尾添加一个随机数字字符串。

【问题讨论】:

  • 谢谢戴夫。另一个问题,我正在尝试向我的班级添加一个属性,即 log4j.appender.DATA.CustomProperty=value。我该怎么做?
  • 没关系...这很简单,我只是没有大写它:/

标签: java logging log4j config


【解决方案1】:

看看:Setting a log file name to include current date in Log4j

编辑: 将此类添加到您的项目中,并将其用作附加程序:

import java.util.Random;

import org.apache.log4j.DailyRollingFileAppender;

public class MyAppender extends DailyRollingFileAppender {    
    @Override
    public void  setFile(String fileName) {
        if (fileName.indexOf("%rnd") >= 0) {
            Random r = new Random();
            fileName = fileName.replaceAll("%rnd", Integer.toString(r.nextInt()));
        }
        super.setFile(fileName);
    }
}

然后只需将 appender 的文件名设置为:filename.%rnd.log

log4j.appender.R=MyAppender.MyAppender
log4j.appender.R.File=.\\test.%rnd.log

【讨论】:

  • 我已经在做你发布的 URL 所说的事情了。我想要做的是在每次程序执行后添加一个额外的随机字符串,以便我可以跟踪多个日志。我将为此编辑我的问题。
  • 您还可以轻松添加其他一些新模式。我们在多个项目中使用它
【解决方案2】:

在你的代码中设置一个新的环境属性:

randomString = Long.toString(Math.abs((new Random()).nextLong()), Character.MAX_RADIX);
System.setProperty("randomString", randomString);

然后,在您的 log4j 文件中使用 ${randomString} 使用该变量。

希望对你有帮助。

【讨论】:

    最近更新 更多