Как я изменяюсь, консольный вывод входа Java от станд. допускают ошибку к станд.?

31
задан Genhis 17 February 2017 в 16:55
поделиться

7 ответов

Я разобрался в одном. Сначала удалите обработчик консоли по умолчанию:

setUseParentHandlers (false);

Затем подкласс ConsoleHandler и в конструкторе:

setOutputStream (System.out);

9
ответ дан Obediah Stane 27 November 2019 в 22:20
поделиться
Handler consoleHandler = new Handler(){
         @Override
            public void publish(LogRecord record)
            {
                if (getFormatter() == null)
                {
                    setFormatter(new SimpleFormatter());
                }

                try {
                    String message = getFormatter().format(record);
                    if (record.getLevel().intValue() >= Level.WARNING.intValue())
                    {
                        System.err.write(message.getBytes());                       
                    }
                    else
                    {
                        System.out.write(message.getBytes());
                    }
                } catch (Exception exception) {
                    reportError(null, exception, ErrorManager.FORMAT_FAILURE);
                }

            }

            @Override
            public void close() throws SecurityException {}
            @Override
            public void flush(){}
        };
9
ответ дан Evan Knowles 27 November 2019 в 22:20
поделиться

Взгляните на документы и источник для ConsoleHandler - я уверен, что Вы могли легко записать версию, которая просто использует System.err вместо System.out. (Это - позор, что ConsoleHandler не позволяет этому быть настроенным, быть честным.)

Тогда это - просто случай конфигурирования системы регистрации для использования нового StdoutHandler (или независимо от того, что Вы называете его) нормальным способом.

3
ответ дан Jon Skeet 27 November 2019 в 22:20
поделиться

Если вы используете журналирование Java, вы можете изменить обработчик по умолчанию:

Например, для файлов: Handler fh = new FileHandler (FILENAME); Logger.getLogger (LOGGER_NAME) .addHandler (fh);

Если вы хотите вывести в поток, вы можете использовать StreamHandler, я думаю, вы можете настроить его для любого потока вывода, который вам нравится, включая системный поток ,

1
ответ дан Uri 27 November 2019 в 22:20
поделиться

ConsoleHandler сделает снимок System.err во время строительства. Один из вариантов - заменить глобальный поток ошибок глобальным выходным потоком, а затем создать ConsoleHandler.

ConsoleHandler h = null;
final PrintStream err = System.err;
System.setErr(System.out);
try {
    h = new ConsoleHandler(); //Snapshot of System.err
} finally {
    System.setErr(err);
}

Это предполагает, что у кода есть разрешение на изменение потока ошибок и что никакой другой работающий код не обращается к потоку ошибок. Короче говоря, это вариант, но есть более безопасные альтернативы.

1
ответ дан jmehrens 27 November 2019 в 22:20
поделиться

Если Вы устанавливаете setUseParentHandlers (ложь); только ТОТ класс имеет его набор. Другие классы в приложении все еще передадут его до stderr.

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

Просто расширьте StreamHandler & amp; в конструкторе вызвать Super (System.out,). Это позволит избежать закрытия System.err - спасибо

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

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