Я разобрался в одном. Сначала удалите обработчик консоли по умолчанию:
setUseParentHandlers (false);
Затем подкласс ConsoleHandler и в конструкторе:
setOutputStream (System.out);
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(){}
};
Взгляните на документы и источник для ConsoleHandler - я уверен, что Вы могли легко записать версию, которая просто использует System.err вместо System.out. (Это - позор, что ConsoleHandler не позволяет этому быть настроенным, быть честным.)
Тогда это - просто случай конфигурирования системы регистрации для использования нового StdoutHandler (или независимо от того, что Вы называете его) нормальным способом.
Если вы используете журналирование Java, вы можете изменить обработчик по умолчанию:
Например, для файлов: Handler fh = new FileHandler (FILENAME); Logger.getLogger (LOGGER_NAME) .addHandler (fh);
Если вы хотите вывести в поток, вы можете использовать StreamHandler, я думаю, вы можете настроить его для любого потока вывода, который вам нравится, включая системный поток ,
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);
}
Это предполагает, что у кода есть разрешение на изменение потока ошибок и что никакой другой работающий код не обращается к потоку ошибок. Короче говоря, это вариант, но есть более безопасные альтернативы.
Если Вы устанавливаете setUseParentHandlers (ложь); только ТОТ класс имеет его набор. Другие классы в приложении все еще передадут его до stderr.
Просто расширьте StreamHandler & amp; в конструкторе вызвать Super (System.out,). Это позволит избежать закрытия System.err - спасибо