Используйте log4j для регистрации сообщения в консоли свободы - PullRequest
0 голосов
/ 11 декабря 2018

Наш сервер журналов принимает наши сообщения журнала через sysout kubernetes pods, отформатированный в json и индексирует поля json.Нам нужно указать несколько предопределенных полей в сообщениях, чтобы мы могли отслеживать транзакции между модулями.Для одного из наших модулей мы используем профиль Liberty и имеем проблему с настройкой ведения журнала для этих нужд.

Одной из идей было использование log4j для отправки настроенного сообщения json в консоль.Но все сообщения повреждены системой журналов Liberty, которая обрабатывает и изменяет все журналы, сделанные в консоли.Мне не удалось настроить параметры ведения журналов Liberty (copySystemStreams = false, уровень журнала консоли = NO) для моих нужд, и я всегда мог свободно изменять мои выходные данные и чередующиеся сообщения, отличные от json.

Чтобы обойти все, что я использовал, liberty consoleFormat = "Параметр журнала json ", но это привело к появлению ненужных полей и также не позволяет мне указывать свои настраиваемые поля.

Можно ли управлять регистрацией свободы и консолью?Как лучше всего использовать мой сценарий использования Liberty (и, если возможно, Log4j)

Ответы [ 2 ]

0 голосов
/ 22 января 2019

На всякий случай, если это поможет, я столкнулся с той же проблемой, и лучшее решение, которое я нашел, было:

  • Преобразование приложения для использования java.util.Logging (JUL)
  • В server.xml добавьте <logging consoleSource="message,trace" consoleFormat="json" traceSpecification="{package}={level}"/> (поменяйте местами пакет и уровень).
  • Добавьте bootstrap.properties, содержащий com.ibm.ws.logging.console.format=json.

Это обеспечит согласованную регистрацию сервера и приложения в формате JSON.Несколько строк в загрузке сервера не являются json, но это была одна пустая строка и строка «Launching defaultServer ...».

Я тоже хотел, чтобы структура JSON была совместима с другими контейнерами, использующими Log4j2, поэтому я последовал совету dbourne выше и добавил jq к моему CMD в моем файле Docker для переформатирования JSON:

CMD /opt/ol/wlp/bin/server run defaultServer | stdbuf -o0 -i0 -e0 jq -crR '. as $line | try (fromjson | {level: .loglevel, message: .message, loggerName: .module, thread: .ext_thread}) catch $line'

stdbuf -o0 -i0 -e0 останавливает канал ("|") для буферизации выходных данных.

Это удаляет специфичные для свободы атрибуты json, что либо хорошо, либоплохо в зависимости от вашей точки зрения.Мне не нужны новые значения, поэтому у меня нет для этого хорошей рекомендации.

Хотя JUL API не так хорош, как Log4j2 или SLF4j, очень мало кода, чтобы обернуть JUL API вчто-то ближе к Log4j2 Например, чтобы иметь varargs, а не Object [].

OpenLiberty также будет динамически изменять журналирование, если вы редактируете server.xml, поэтому он в значительной степени имеет все необходимые биты;ИМХО.

0 голосов
/ 12 декабря 2018

Как вы упомянули, у Liberty есть возможность входа в консоль в формате JSON [1].Две проблемы, о которых вы упомянули, для вашего случая использования: 1) ненужные поля и 2) не позволили вам указать свои настраиваемые поля.

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

  • использовать Logstash.
    Некоторые инструменты обработки журналов, такие как Logstash, позволяют удалить[2] или изменить [3] поля.Если вы отправляете свои журналы в Logstash, вы можете настроить JSON в соответствии с вашими потребностями.

  • изменить формат JSON, который Liberty отправляет на стандартный вывод с помощью jq.
    CMD по умолчанию (сDockerfile ядра websphere-liberty:):

    CMD ["/opt/ibm/wlp/bin/server", "run", "defaultServer"]

    Вы можете добавить свой собственный CMD в Dockerfile, чтобы переопределить его следующим образом (при необходимости измените команду jq):

    CMD /opt/ibm/wlp/bin/server run defaultServer | grep --line-buffered "}" | jq -c '{ibm_datetime, message}'

Если в вашем случае использования также требуется отправка вывода log4J на стандартный вывод, я бы предложил изменить CMD Dockerfile для запуска сценария, добавляемого в образ.В этом сценарии вам нужно будет привязать файл журнала log4J следующим образом (это может быть совмещено с приведенным выше советом о том, как изменить CMD на использование также jq)

`tail -F myLog.json &`
`/opt/ibm/wlp/bin/server run defaultServer`

[1] https://www.ibm.com/support/knowledgecenter/en/SSEQTP_liberty/com.ibm.websphere.wlp.doc/ae/rwlp_logging.html

[2] https://www.elastic.co/guide/en/logstash/current/plugins-filters-prune.html

[3] https://www.elastic.co/guide/en/logstash/current/plugins-filters-mutate.html

...