Log4j ведение журнала в общий файл журнала

Есть ли способ записывать события журнала log4j в файл журнала, который также записывается другими приложениями. Другие приложения могут быть не Java-приложениями. Какие есть недостатки? Проблемы с блокировкой? Форматирование?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
7
0
10 532
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Лучше всего разрешить каждому приложению регистрироваться отдельно, а затем назначить запланированное задание для «скрепления» файлов вместе в зависимости от времени. Если вам нужен действительно актуальный доступ к полному журналу, вы можете запускать его каждый час.

Log4j достаточно гибок, поэтому вы можете создавать записи журнала в формате, совместимом с записями, уже находящимися в файле. Просто посмотрите в приложениях, как отформатировать определенные поля данных.

Ваша основная проблема будет связана с блокировкой, скорее всего, другими приложениями. Убедитесь, что все приложения не имеют монопольной блокировки файла, и все будет в порядке.

Ответ принят как подходящий

В Log4j есть SocketAppender, который отправляет события в службу, которую вы можете реализовать самостоятельно или использовать простую реализацию в комплекте с Log4j.

Он также поддерживает syslogd и журнал событий Windows, которые могут быть полезны при попытке унифицировать вывод журнала с событиями из приложений, отличных от Java.

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

У меня есть опыт использования следующих двух подходов:

  1. Используйте базу данных для ведения журнала вместо обычного текстового файла - это может быть непозволительно из-за проблем с производительностью, с другой стороны, очень легко анализировать журналы, создавать отчеты. База данных решает все проблемы параллелизма.
  2. Другой подход предполагает использование сервера JBoss, который можно использовать для чтения журнальной информации из других источников. JBoss можно запустить в минимальной конфигурации, и благодаря этому он действительно легкий (время запуска 2 секунды). Подробности можно найти здесь http://docs.jboss.org/process-guide/en/html/logging.html (Вход на отдельный сервер). Log4J заботится обо всех проблемах блокировки / параллелизма.

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

Я не думаю, что приложения log4j по умолчанию выполняют какую-либо блокировку или синхронизацию файлов. Без такой блокировки вы, вероятно, потеряете сообщения журнала или получите их искаженными.

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

Log4perl имеет синхронизирующий Appender, Log :: Log4perl :: Appender :: Synchronized, который обертывает Appender и выполняет это, а также, кажется, предоставляет флаг в своем Log :: Log4perl :: Appender :: File, который предотвращает чередование строк. Вы можете посмотреть, что они делают, чтобы увидеть, можно ли это воспроизвести на Java.

Другие вопросы по теме