В более крупной программе я использую статический экземпляр java.util.logging.Logger
, но перенаправляю System.err
нескольким различным файлам подряд. Logger
не удается зарегистрировать второй раз, когда я пытаюсь перенаправить System.err
.System.setErr() вмешивается в Logger
Вот тестовая программа, чтобы показать проблему:
import java.io.FileNotFoundException;
import java.io.PrintStream;
import java.util.logging.Logger;
class TestRedirect {
static final Logger logger = Logger.getLogger("test");
public static void main(String[] args) throws FileNotFoundException {
for (int i = 1; i <= 2; i++) {
TestRedirect ti = new TestRedirect();
ti.test(i);
}
}
void test(int i) throws FileNotFoundException {
PrintStream filePrintStream = new PrintStream("test" + i + ".log");
PrintStream stderr = System.err; // Save stderr stream.
System.setErr(filePrintStream); // Redirect stderr to file.
System.err.println("about to log " + i);
logger.info("at step " + i);
System.setErr(stderr); // Restore stderr stream.
filePrintStream.close();
}
}
Вот вывод:
test1.log:
about to log 1
Jan 28, 2014 4:34:20 PM TestRedirect test
INFO: at step 1
test2.log:
about to log 2
Я думал, что увижу сообщение сгенерированное Logger
в test2.log. Почему Logger
перестает работать, и что я могу сделать по этому поводу?
Обычно я рекомендую не перенаправлять стандартные потоки на Java, если есть другой возможный подход. Вы уверены, что вам нужно использовать 'setErr()'? – Darkhogg
@ Darkhogg: оригинальная программа на самом деле использовала Groovy 'SystemOutputInterceptor' (в основном« tee »на основе« FilteredOutputStream') для прямого ввода stdout и stderr в файл журнала, а также на консоль. 'SystemOutputInterceptor' вызывает' setErr() 'под обложками. Некоторые из различных частей программы использовали Logger, а некоторые просто записывали информацию и ошибки в stderr и stdout. –