Переименование файла журнала Log4J во время выполнения программы - PullRequest
1 голос
/ 28 марта 2011

Мы недавно переключились на Log4J из JUL (java.util.Logging), потому что я хотел добавить дополнительные файлы журнала для разных уровней ведения журнала.

У нас есть возможность в программе дополнительно добавитьзначение и метка даты / времени для имени файла журнала в конце (для всех целей и задач) выполнения программы.

Поскольку JUL, казалось, открывал и закрывал файл по мере необходимости для записи в файл,он не был заблокирован, и мы могли просто использовать .renameTo (), чтобы изменить имя файла.

Теперь, используя Log4J, этот файл остается открытым и заблокирован, что не позволяет нам переименовывать файл (ы).

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

Есть ли у вас какие-либо предложения относительно того, как этого можно достичь?

Поможет или помешает Logback и / или SLF4J?


Я как-то обошел проблему, используя системный параметр в файле свойств log4j, установив свойство и перезагрузив файл свойств.

Это позволяет мне изменить имя файла журнала на другоеконец прогона, а затем переименуйте старые файлы.

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

Ответы [ 2 ]

2 голосов
/ 30 марта 2011

Одним из надежных подходов было бы внедрение собственного приложения log4j, возможно, на основе FileAppender (http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/FileAppender.html). Добавьте собственный специализированный API для запроса переименования файла.

Я еще не пробовал это, но я выбрал бы тактику использования базового API setFile (...): http://www.jdocs.com/log4j/1.2.13/org/apache/log4j/FileAppender.html#M-setFile%28String,boolean,boolean,int%29

Например:

public class RenamingFileAppender extends FileAppender {

...

/** fix concurrency issue in stock implementation **/
public synchronized void setFile(String file) {
  super.setFile(file);
}

public synchronized void renameFile(String newName) {
  // whole method is synchronized to avoid losing log messages
  // implementation can be smarter in having a short term queue
  // for any messages that arrive while file is being renamed
  File currentFile = new File(this.fileName);
  File newFile = new File(newName);
  // do checks to ensure current file exists, can be renamed etc.
  ...
  // create a temp file to use while current log gets renamed
  File tempFile = File.createTempFile("renaming-appender", ".log");
  tempFile.deleteOnExit();
  // tell underlying impl to use temporary file, so current file is flushed and closed
  super.setFile(tempFile.getAbsolutePath(), false, this.bufferedIO, this.bufferSize);
  // rename the recently closed file
  currentFile.renameTo(newFile);
  // now go back to the original log contents under the new name. Note append=true
  super.setFile(newFile.getAbsolutePath(), true, this.bufferedIO, this.bufferSize);
}
0 голосов
/ 28 марта 2011

Рассмотрите возможность использования перехватчиков завершения работы и переименования файла там ...

http://onjava.com/pub/a/onjava/2003/03/26/shutdownhook.html

http://www.developerfeed.com/threads/tutorial/understanding-java-shutdown-hook

http://download.oracle.com/javase/1.4.2/docs/guide/lang/hook-design.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...