Перенаправление System.out.println

Мое приложение имеет много операторов System.out.println().

Я хочу поймать сообщения от println и отправить их на стандартный регистратор (Log4j, ИЮЛЬ и т.д.).

Как сделать это?

32
задан Ian Zhang 14 May 2016 в 14:48
поделиться

3 ответа

Класс System имеет setOut и setErr , которые можно использовать для изменения выходного потока, например, на новый PrintStream с резервным файлом или, в данном случае, возможно, с другим потоком, который использует выбранную вами подсистему ведения журнала.


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

В этом случае вы можете просто заменить операторы типа System.out.print реальными вызовами журналирования.

35
ответ дан 27 November 2019 в 20:12
поделиться

Однажды у меня была аналогичная потребность. Мне нужно было перехватить вывод какого-то стороннего компонента и отреагировать на сообщение об ошибке. Концепция выглядит так:

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
}
30
ответ дан 27 November 2019 в 20:12
поделиться

Лучшее решение - это пройтись и изменить все операторы println, чтобы использовать подходящую библиотеку протоколирования. То, что вы пытаетесь сделать - это большой хак.

9
ответ дан 27 November 2019 в 20:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: