Мое приложение имеет много операторов System.out.println().
Я хочу поймать сообщения от println и отправить их на стандартный регистратор (Log4j, ИЮЛЬ и т.д.).
Как сделать это?
Класс System имеет setOut
и setErr
, которые можно использовать для изменения выходного потока, например, на новый PrintStream
с резервным файлом
или, в данном случае, возможно, с другим потоком, который использует выбранную вами подсистему ведения журнала.
Имейте в виду, что у вас могут возникнуть проблемы, если вы когда-нибудь сконфигурируете свою библиотеку протоколирования для вывода на стандартный вывод или на ошибку (возможно, с бесконечной рекурсией).
В этом случае вы можете просто заменить операторы типа System.out.print
реальными вызовами журналирования.
Однажды у меня была аналогичная потребность. Мне нужно было перехватить вывод какого-то стороннего компонента и отреагировать на сообщение об ошибке. Концепция выглядит так:
private class Interceptor extends PrintStream
{
public Interceptor(OutputStream out)
{
super(out, true);
}
@Override
public void print(String s)
{//do what ever you like
super.print(s);
}
}
public static void main(String[] args)
{
PrintStream origOut = System.out;
PrintStream interceptor = new Interceptor(origOut);
System.setOut(interceptor);// just add the interceptor
}
Лучшее решение - это пройтись и изменить все операторы println, чтобы использовать подходящую библиотеку протоколирования. То, что вы пытаетесь сделать - это большой хак.