Я поддерживаю приложение, которое действует как контейнер для нескольких отдельных программ.Эти программы имеют свои собственные средства ведения журнала, то есть все, что они регистрируют, делает со специальным файлом журнала.
Тем не менее, разработчики приложений, похоже, любят , чтобы выбросить System.out.println
, а e.printStackTrace
вызывает всеболее, что делает невозможным поддерживать чистую консоль при запуске контейнера.
Как можно предотвратить загрязнение этих приложений System.out
и System.err
?
Замечания по реализации:
- приложения используют Log4j для ведения журнала;
- контейнер также использует консоль для ведения журнала, но он строго зарезервирован для событий и проблем жизненного цикла, поэтому мне все еще нужна консоль;
- приложения загружаются с помощью пользовательского загрузчика классов, но проверки безопасности не применяются.
Обновление :
Простое перенаправление System.out
не будет работать, поскольку он перенаправляет все выходные данные, поэтому что-то вроде этого не получается:
System.setOut(new PrintStream(new OutputStream() {
@Override
public void write(int b) {
throw new Error("Not on my watch you don't");
}
}));
Logger logger = Logger.getLogger(Runner.class);
logger.info("My log message");
Это должно быть успешно.
Обновление 2:
ПриложениеЗагрузка и настройка выполняется с использованием кода, аналогичного
App app = new UrlClassLoader(...).loadClass(className)).newInstance();
app.setLogger(loggerForClass(app));
Log4j загружается из загрузчика системного класса.