Удаление доступа к System.out в Java - PullRequest
5 голосов
/ 10 ноября 2009

Я поддерживаю приложение, которое действует как контейнер для нескольких отдельных программ.Эти программы имеют свои собственные средства ведения журнала, то есть все, что они регистрируют, делает со специальным файлом журнала.

Тем не менее, разработчики приложений, похоже, любят , чтобы выбросить 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 загружается из загрузчика системного класса.

Ответы [ 12 ]

1 голос
/ 10 ноября 2009

Преобразование потоков System.out и System.err в специальные реализации, которые генерируют исключение RuntimeException («Использовать ведение журнала вместо System.out») каждый раз, когда пишется символ.

Если ваш контейнер важен, они довольно быстро поймут идею:)

(для дополнительного бонуса вместо этого выведите OutOfMemoryException; -))

0 голосов
/ 11 ноября 2009

Мы используем трюк log4j, но ведем журнал для разделения файлов (stdout.log, stderr.log). Бесполезно смешивать их вывод с частями, которые действительно понимают ведение журнала ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...