Как настроить приложение GELF для log4j2? - PullRequest
0 голосов
/ 05 февраля 2020

У нас есть файл log4j2-graylog. xml, который мы используем, чтобы соединить наш вывод log4j с GrayLog 3.0 с помощью пакета biz.paluch.logging.gelf.log4j2. Этот конфигурационный файл основан на этом примере :

<?xml version="1.0" encoding="utf-8"?>
<Configuration monitorInterval="60" packages="biz.paluch.logging.gelf.log4j2">
    <Appenders>
      <Gelf name="gelf" host="10.13.10.192" port="12201" version="1.1" extractStackTrace="true" filterStackTrace="true" mdcProfiling="true" includeFullMdc="true" maximumMessageSize="8192" originHost="swarm" additionalFieldTypes="environment=String,application=String">
        <Field name="timestamp" pattern="%d{dd MMM yyyy HH:mm:ss,SSS}" />
        <Field name="level" pattern="%level" />
        <Field name="simpleClassName" pattern="%C{1}" />
        <Field name="className" pattern="%C" />
        <Field name="server.fqdn" pattern="%host{fqdn}" />
        <Field name="threadName" />  <!-- didn't seem to work -->

        <!-- This is a static field -->
        <Field name="application" literal="PISM-webapp" />       
      </Gelf>
    </Appenders>
    <Loggers>
      <Logger name="com.xxx" level="DEBUG" additivity="false">
        <AppenderRef ref="gelf" />
      </Logger>
    </Loggers>
</Configuration>    

В основном это работает. Наши Java вызовы log4j logging отображаются в GrayLog.

Основываясь на информации из здесь , кажется, что должно быть легко добавить поле, которое захватывает данные потока, но наши попытки пока не увенчались успехом. Также нам нужно поле, которое сообщает значение определенной переменной среды. Кто-нибудь может сказать мне, как сделать любую из этих двух вещей?

1 Ответ

0 голосов
/ 05 февраля 2020

На основании информации из руководства log4j2 я смог получить имя потока, добавив threadName к additionalFieldTypes и используя спецификатор шаблона %t, например:

   <Gelf name="gelf" host="10.13.10.192" port="12201" version="1.1" extractStackTrace="true" filterStackTrace="true"
               mdcProfiling="true" includeFullMdc="true" maximumMessageSize="8192" originHost="swarm"
               additionalFieldTypes="environment=String,application=String,threadName=String,fbHost=String">
...
    <Field name="threadName" pattern="%t" />

Однако, когда я попытался использовать синтаксис, предоставленный на странице, для получения значения переменной среды, например, так:

  <Field name="fbHost" pattern="$${env:LB_COOKIE_VALUE}" />

Я не получил значение LB_COOKIE_VALUE значение среды в GrayLog. Вместо этого я получил буквальную строку - "$ {env: LB_COOKIE_VALUE}". Этот StackOverflow post дал достаточно информации для устранения проблемы. Когда я предоставил значение по умолчанию,

<Field name="fbHost" pattern="$${env:LB_COOKIE_VALUE:-unset_env_LB_COOKIE_VALUE}" />

я получил "unset_env_LB_COOKIE_VALUE" в выводе, указывая, что переменная среды не была установлена. Однако системное свойство Java было установлено, поэтому

<Field name="fbHost" pattern="$${sys:LB_COOKIE_VALUE:-unset_sys_LB_COOKIE_VALUE}" />

предоставило искомое значение.

...