динамическое создание и удаление приложений ведения журнала

У меня есть устаревшее приложение PSVM, которое я хотел бы перенаправить вывод журнала в уникальные файлы для каждого выполнения. Итак, если я вызову его в 10:00, он перенаправит вывод на {thread-id}-10:00.log; и другой поток выполнения может начать выполнение в 10:01, и его выходные данные будут отправлены в {thread-id}-10:01.log. Я понимаю, что это не элегантно.

Мои вопросы:

  • Это возможно?
  • у кого-то есть идея, как подойти?
  • можно ли освободить/уничтожить приложение, когда оно больше не нужно?

Спасибо!


person Edward Q. Bridges    schedule 06.08.2009    source источник


Ответы (2)


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

Написание приложений довольно тривиально — вот руководство по Javaworld как это сделать.

В приведенном выше, есть ли вообще вероятность того, что ваша программа запустится дважды в одну минуту? Вы хотите добавить идентификатор процесса или что-то подобное, чтобы сохранить уникальность?

person Brian Agnew    schedule 06.08.2009
comment
Спасибо за быстрый ответ! это не тот случай, когда один поток делает это более одного раза. Но, в любом случае, это просто пример для обсуждения. имя будет ограничено для уникальности. Любые идеи о том, как выпустить средство записи файлов? - person Edward Q. Bridges; 06.08.2009
comment
Ре. выпуск. Я думаю, что вы должны очищать модуль записи после каждого сообщения журнала (чтобы гарантировать запись на диск) и не беспокоиться об его выпуске. Пусть JVM все уберет. Если только вы не пишете много тем и не открываете много файлов. Тогда вы можете просто захотеть держать n писателей открытыми одновременно и закрывать некоторые из них, когда вы не вошли в систему. Однако это может привести к некоторой тряске :-) - person Brian Agnew; 06.08.2009
comment
Оказывается, я просто удаляю приложение из регистратора (Logger.removeAppender()), а затем закрываю его, вызывая Appender.close(). Э-З! - person Edward Q. Bridges; 06.08.2009

Это невозможно, по крайней мере, это нелегко сделать в log4j. Однако если вы посмотрите на SiftingAppender, поставляемый с logback (преемник log4j), он предназначен для обработки создания приложений по критериям времени выполнения, а также их удаления, когда они больше не нужны.

Если вашему приложению необходимо создать только один файл журнала для каждого запуска приложения, вы можете просто назвать свой файл журнала на основе метки времени. Пишите в список рассылки logback-user, если вам нужна дополнительная помощь.

person Ceki    schedule 07.08.2009
comment
Мне любопытно узнать больше о том, почему это невозможно. Это кажется относительно простым. Я отправил сообщение пользователю logback-user. Я надеюсь, что вы можете найти его там и уточнить. Спасибо! - person Edward Q. Bridges; 08.08.2009
comment
Это зависит от того, хотите ли вы настроить пользовательское приложение программно или через файл конфигурации. Также возникает вопрос управления лог-файлами (по одному на поток) в многопоточном приложении. Первоначальный вопрос не был очень конкретным в отношении этих двух вопросов. - person Ceki; 08.08.2009