Вопрос-ответ

Setting a log file name to include current date in Log4j

Настройка имени файла журнала для включения текущей даты в Log4j

Я хотел бы установить в имени файла журнала для приложения log4j и log4net текущую дату. Мы выполняем ежедневные ролловеры, но в текущем файле журнала нет даты. Формат имени файла журнала будет следующим

logname.2008-10-10.log

Кто-нибудь знает лучший способ для меня сделать это?

Редактировать: Я забыл упомянуть, что мы хотели бы сделать это и в log4net. Плюс любое решение должно быть доступно в JBoss.

Переведено автоматически
Ответ 1

DailyRollingFileAppender - это именно то, что вы ищете.

<appender name="roll" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="application.log" />
<param name="DatePattern" value=".yyyy-MM-dd" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern"
value="%d{yyyy-MMM-dd HH:mm:ss,SSS} [%t] %c %x%n %-5p %m%n"/>
</layout>
</appender>
Ответ 2

Использование файла log4j.properties и включение apache-log4j-extras 1.1 в мой POM с log4j 1.2.16

log4j.appender.LOGFILE=org.apache.log4j.rolling.RollingFileAppender
log4j.appender.LOGFILE.RollingPolicy=org.apache.log4j.rolling.TimeBasedRollingPolicy
log4j.appender.LOGFILE.RollingPolicy.FileNamePattern=/logs/application_%d{yyyy-MM-dd}.log
Ответ 3

Я на 99% уверен, что RollingFileAppender / DailyRollingFileAppender, хотя и предоставляет вам желаемую функциональность переноса даты, не имеет никакого способа указать, что текущий файл журнала также должен использовать DatePattern.

Возможно, вы сможете просто создать подкласс RollingFileAppender (или DailyRollingFileAppender, я забыл, что есть что в log4net) и изменить логику именования.

Ответ 4

Я создал приложение, которое будет это делать. http://stauffer.james.googlepages.com/DateFormatFileAppender.java

/*
* Copyright (C) The Apache Software Foundation. All rights reserved.
*
* This software is published under the terms of the Apache Software
* License version 1.1, a copy of which has been included with this
* distribution in the LICENSE.txt file. */


package sps.log.log4j;

import java.io.IOException;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.apache.log4j.*;
import org.apache.log4j.helpers.LogLog;
import org.apache.log4j.spi.LoggingEvent;

/**
* DateFormatFileAppender is a log4j Appender and extends
* {@link FileAppender} so each log is
* named based on a date format defined in the File property.
*
* Sample File: 'logs/'yyyy/MM-MMM/dd-EEE/HH-mm-ss-S'.log'
* Makes a file like: logs/2004/04-Apr/13-Tue/09-45-15-937.log
* @author James Stauffer
*/

public class DateFormatFileAppender extends FileAppender {

/**
* The default constructor does nothing.
*/

public DateFormatFileAppender() {
}

/**
* Instantiate a <code>DailyRollingFileAppender</code> and open the
* file designated by <code>filename</code>. The opened filename will
* become the ouput destination for this appender.
*/

public DateFormatFileAppender (Layout layout, String filename) throws IOException {
super(layout, filename, true);
}

private String fileBackup;//Saves the file pattern
private boolean separate = false;

public void setFile(String file) {
super.setFile(file);
this.fileBackup = getFile();
}

/**
* If true each LoggingEvent causes that file to close and open.
* This is useful when the file is a pattern that would often
* produce a different filename.
*/

public void setSeparate(boolean separate) {
this.separate = separate;
}

protected void subAppend(LoggingEvent event) {
if(separate) {
try {//First reset the file so each new log gets a new file.
setFile(getFile(), getAppend(), getBufferedIO(), getBufferSize());
} catch(IOException e) {
LogLog.error("Unable to reset fileName.");
}
}
super.subAppend(event);
}


public
synchronized
void setFile(String fileName, boolean append, boolean bufferedIO, int bufferSize)
throws IOException {
SimpleDateFormat sdf = new SimpleDateFormat(fileBackup);
String actualFileName = sdf.format(new Date());
makeDirs(actualFileName);
super.setFile(actualFileName, append, bufferedIO, bufferSize);
}

/**
* Ensures that all of the directories for the given path exist.
* Anything after the last / or \ is assumed to be a filename.
*/

private void makeDirs (String path) {
int indexSlash = path.lastIndexOf("/");
int indexBackSlash = path.lastIndexOf("\\");
int index = Math.max(indexSlash, indexBackSlash);
if(index > 0) {
String dirs = path.substring(0, index);
// LogLog.debug("Making " + dirs);
File dir = new File(dirs);
if(!dir.exists()) {
boolean success = dir.mkdirs();
if(!success) {
LogLog.error("Unable to create directories for " + dirs);
}
}
}
}

}
java logging