java - Log4j - 使用 DatePattern 后文件扩展名 (.log) 消失

标签 java log4j

我的 Log4j.xml 文件有问题。 当我保存这样的日志文件时:

<appender name="file" class="org.apache.log4j.DailyRollingFileAppender">
    <param name="append" value="true" />
    <param name="datePattern" value="_dd.MM.yyyy_HH.mm.ss" />
    <param name="file" value="/logs/dailyschedule.log" />
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" 
                   value="%d{dd.MM.yyyy HH:mm:ss} class:[%c] method:[%t] [%-5p] : %m%n"/>
    </layout>
</appender>

文件没问题,但没有文件扩展名。是错误还是我做错了什么?

编辑: 在我看到 Paul 的回答之前,我通过使用一个简单的类来初始化我的记录器暂时解决了我的问题。这不是最好的决定,但对有类似问题的人可能有用:

public class DomainLogger {

private Logger logger = null;

public DomainLogger(String directoryName, String fileName) throws Exception {

    SimpleDateFormat sdf = new SimpleDateFormat("_dd.MM.yyyy");
    String timeNow = sdf.format(new Date());

    String fullFilePath = System.getenv("DOMAIN_HOME") + 
            directoryName + "\\" + 
            fileName + timeNow + ".log";
    System.out.println("full filepath is " + fullFilePath);

    logger = Logger.getLogger(timeNow);
    //warning! different time will create a new file !!!

    PatternLayout patternLayout = new PatternLayout("%m%n");
    FileAppender fileAppender = new FileAppender(patternLayout, fullFilePath);
    logger.addAppender(fileAppender);
}

public void writeLog(String logMessage) {
    logger.info(logMessage);
}

最佳答案

如果您使用的是 log4j 1.x,我们强烈建议您使用 org.apache.log4j.rolling.RollingFileAppender 1 而不是 org.apache.log4j.DailyRollingFileAppender (可能会丢失消息,Bug 43374)。

所以你的 appender 的配置可以是:

<appender name="file" class="org.apache.log4j.rolling.RollingFileAppender">
    <param name="encoding" value="UTF-8" />
    <rollingPolicy class="org.apache.log4j.rolling.TimeBasedRollingPolicy">
        <param name="activeFileName" value="/logs/dailyschedule.log" />
        <param name="fileNamePattern" 
               value="/logs/dailyschedule%d{_dd.MM.yyyy_HH.mm.ss}.log" />
    </rollingPolicy>
    <layout class="org.apache.log4j.PatternLayout">
        <param name="conversionPattern" 
               value="%d{dd.MM.yyyy HH:mm:ss} class:[%c] method:[%t] [%-5p] : %m%n" />
    </layout>
</appender>

使用此配置,您将获得如下的精细名称: 2

dailyschedule.log
dailyschedule_28.08.2014_14.57.45.log
dailyschedule_28.08.2014_14.57.46.log
dailyschedule_28.08.2014_14.57.47.log
dailyschedule_28.08.2014_14.57.48.log
dailyschedule_28.08.2014_14.57.49.log

注释

  1. 在这种情况下,您需要添加相应的 jar ( apache-log4j-extras-1.2.17.jar)。
  2. 如果您不需要第一个文件名 (dailyschedule.log),请在滚动策略中删除参数 activeFileName

关于java - Log4j - 使用 DatePattern 后文件扩展名 (.log) 消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25343866/

相关文章:

java - Java 中从右到左的语言

java - Android Studio 语法错误

java - 在基本的 Java POJO 中,log4j.Logger 是否过大?

java - Log4j.xml动态文件属性

java - Log4j 记录器和并发

java - 获取文件的锁

java - 如何获取JButton的位置?

java - 如何在 Nutiteq 中启用指南针模式?

java - Log4j SMTP 附加程序

java - 带微秒的 log4j ConversionPattern 时间戳