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

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

logname.2008-10-10.log 

Кто-нибудь знает, как мне это сделать?

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

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

        

Использование файла 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 

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

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

Я создал приложение, которое сделает это. 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 DailyRollingFileAppender and open the * file designated by filename. 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, но в .NET свойство StaticLogFileName на RollingFileAppender дает вам то, что вы хотите. Значение по умолчанию – true.

  

Полная конфигурация:

           

".log" заключается в том, чтобы не дать dateformat распознать глобальный шаблон даты ‘g’ в журнале.

В ответ на два ответа, в которых упоминается DailyRollingFileAppender (извините, у меня недостаточно комментариев, чтобы прокомментировать их напрямую, и я думаю, что это нужно упомянуть), я бы предупредил, что, к сожалению, разработчики этого classа задокументировали, что это демонстрирует синхронизацию и потерю данных и рекомендует использовать альтернативы для новых развертываний.

DailyRollingFileAppender JavaDoc

Вы можете установить FileAppender динамически

 SimpleLayout layout = new SimpleLayout(); FileAppender appender = new FileAppender(layout,"logname."+new Date().toLocaleString(),false); logger.addAppender(appender); 

этот пример будет создавать регистратор для каждой минуты, если вы хотите изменить для каждого дня изменение значения DatePattern .

                   

Даже если вы используете DailyRollingFileAppender, например, @gedevan, вы все равно получите logname.log.2008-10-10 (через день, потому что журнал предыдущего дня будет заархивирован, а дата будет объединена с его именем файла). Так что, если вы хотите .log в конце, вам придется делать это так на DatePattern:

log4j.appender.file.DatePattern='.'yyyy-MM-dd-HH-mm'.log'

  • Dropwizard не регистрирует пользовательские журналы в файле
  • Как настроить log4j для регистрации различных уровней журнала для разных файлов для одного и того же регистратора
  • Отключение выхода Log4J в Java
  • Как найти метод, называемый текущим методом?
  • log4net: настроить игнорирование сообщений определенного classа
  • Перенаправить System.out и System.err в slf4j
  • Настройка RollingFileAppender в log4j
  • Трассировка стека NullPointerException недоступна без агента отладки
  • Динамическое изменение уровня журнала log4j
  • Как создать пользовательский аккаунт в log4j2?
  • Как распечатать текущую трассировку стека в .NET без каких-либо исключений?
  • Interesting Posts

    Зачем использовать именованные функциональные выражения?

    Что заставляет javac выдавать предупреждение «использует непроверенные или небезопасные операции»

    Почему Java ограничивает размер метода до 65535 байт?

    gcc, строгие сглаживания и ужасы

    Что такое статические заводские методы?

    Как я могу автоматически печатать файлы электронной таблицы Excel?

    Почему там черная панель поверх Google Chrome?

    Почему бы было два отдельных раздела восстановления

    Как бороться с ошибкой «данных classа uneval» от ggplot2?

    Отключить гиперпоточность в реестре Windows 7

    Mac OS X автоматически отключает аэропорт, если кабель Ethernet подключен

    Почему Firefox не распознает быстрые клавиши приложения, созданные в Mac OS X System Preferences?

    JFreechart Loop через сектора полярных диаграмм

    Всякий раз, когда Google Chrome открыт, мой жесткий диск очень быстро вращается

    Изменение размера разделов в mdadm RAID1

    Давайте будем гением компьютера.