Полагаю, это возможно, хотя это определенно плохая идея. Вы должны укусить пулю и заменить все звонки System.out.printXXx()
и System.err.printXXx()
.
(Вам не нужно делать это в одно большое изменение, и вам не нужно делать это с помощью автоматического поиска / замены ... если эти вещи заставляют вас чувствовать себя некомфортно.)
Вы можете изменить направление этих потоков, используя System.setOut
и System.setErr
, чтобы указать им файл журнала log4j. Однако:
- могут возникнуть проблемы с перемежением вывода и / или усечением файла журнала, в зависимости от того, как именно реализованы добавщики log4j
- вы не получите метки времени log4j и т. Д.
- у вас не будет возможности контролировать ведение журнала через конфиги log4j, потому что ваше перенаправление происходит за спиной log4j
- log4j вращение файла журнала не будет работать правильно
Более сложной альтернативой было бы создание специального объекта OutputStream для перехвата вывода и превращения его в вызовы Log4j Logger. Но это также будет иметь проблемы:
- может быть сложно определить, где заканчивается каждое «сообщение журнала консоли», особенно если вы хотите, чтобы несколько строк вывода консоли обрабатывались как одно событие журнала
- у вас будет только ограниченная конфигурируемость log4j, потому что все "сообщения журнала консоли" будут проходить через один регистратор (или, возможно, одно для
out
и одно для err
)
- производительность будет большей и менее уязвимой, чем при обычной регистрации в log4j.