Хотите, чтобы "System.out.println ()" печатал сообщение в log4j - PullRequest
3 голосов
/ 04 июля 2011

наш проект использует System.out.println () или System.err.println () для вывода отладочного сообщения. Теперь мы хотим использовать log4j для направления этих выходных данных в файлы журналов, а не только в консоль. Чтобы избежать влияния или риска, мы не хотим заменять все «System.out.println ()» на «logger.debug», а просто хотим написать несколько кодов, чтобы эти выходные данные перенаправлялись в файлы журнала log4j, которые не изменение кода в каждом классе, все еще использующем System.out.println () (мы знаем, что это плохая практика, но в настоящее время мы не хотим выполнять глобальный поиск и замену). Является ли это возможным? Спасибо.

Ответы [ 5 ]

7 голосов
/ 04 июля 2011

Полагаю, это возможно, хотя это определенно плохая идея. Вы должны укусить пулю и заменить все звонки System.out.printXXx() и System.err.printXXx().

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


Вы можете изменить направление этих потоков, используя System.setOut и System.setErr, чтобы указать им файл журнала log4j. Однако:

  • могут возникнуть проблемы с перемежением вывода и / или усечением файла журнала, в зависимости от того, как именно реализованы добавщики log4j
  • вы не получите метки времени log4j и т. Д.
  • у вас не будет возможности контролировать ведение журнала через конфиги log4j, потому что ваше перенаправление происходит за спиной log4j
  • log4j вращение файла журнала не будет работать правильно

Более сложной альтернативой было бы создание специального объекта OutputStream для перехвата вывода и превращения его в вызовы Log4j Logger. Но это также будет иметь проблемы:

  • может быть сложно определить, где заканчивается каждое «сообщение журнала консоли», особенно если вы хотите, чтобы несколько строк вывода консоли обрабатывались как одно событие журнала
  • у вас будет только ограниченная конфигурируемость log4j, потому что все "сообщения журнала консоли" будут проходить через один регистратор (или, возможно, одно для out и одно для err)
  • производительность будет большей и менее уязвимой, чем при обычной регистрации в log4j.
1 голос
/ 04 июля 2011

Вы должны быть в состоянии позвонить System.setOut(new SomeCustomLog4JAdapter()); Где class SomeCustomLog4JAdapter extends PrintStream

0 голосов
/ 04 июля 2011

Согласно ответам других парней, да, это возможно с System.setOut(...). Но я бы порекомендовал вам не делать этого. Вы просто создаете кошмар для будущего разработчика и не экономите время и деньги. Сделайте работу сейчас, чтобы сделать это правильно, и это окупится в долгосрочной перспективе.

Кроме того, маршрутизация текста из System.out и System.err в log4j (на мой взгляд) не позволяет использовать его, поскольку вы не сможете использовать уровни ведения журнала для отделения отладочной информации от информации об ошибках.

0 голосов
/ 04 июля 2011

Учитывая ваши ограничения, будет ли достаточно перенаправить stdout и stderr в файлы?

File outFile  = new File("/var/log/jiang/stdout.log");
PrintStream outStream = new PrintStream(new FileOutputStream(outFile));
System.setOut(outStream);

File errFile  = new File("/var/log/jiang/stderr.log");
PrintStream errStream = new PrintStream(new FileOutputStream(errFile));
System.setErr(errStream);
0 голосов
/ 04 июля 2011

Да, это так.Используйте java.lang.System.setOut(java.io.PrintStream) и java.lang.System.setErr(java.io.PrintStream) для замены стандартных потоков вывода и ошибок.

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