logback logstash encoder Заголовок системного журнала не установлен

Я пытаюсь записывать журналы Java в Syslog в формате JSON, но обнаружил странную проблему, когда заголовок Syslog не устанавливается должным образом.

Я тестирую это на Mac и использую wireshark для захвата пакетов, когда они отправляются на порт UDP 514 (через петлевой интерфейс)

Мой logback.xml выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <conversionRule conversionWord="syslogStart" converterClass="ch.qos.logback.classic.pattern.SyslogStartConverter"/>

  <appender name="stash" class="net.logstash.logback.appender.LogstashSocketAppender">
    <host>localhost</host>
    <port>514</port>
    <prefix class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
      <layout class="ch.qos.logback.classic.PatternLayout">
        <pattern>%syslogStart{LOCAL5}</pattern>
      </layout>
    </prefix>
  </appender>

  <root level="INFO">
    <appender-ref ref="stash"/>
  </root>
</configuration>

и когда я смотрю на вывод wireshark, я вижу только регистрируемый JSON (поле заголовка PRI не указано)

 [truncated]Syslog message: (unknown): {"@timestamp":"2016-03-22T12:13:37.270+11:00","@version":1,"message":"Started App in 4.327 seconds (JVM running for 4.92)","logger_name":"au.com.xxx.App","threa

Если я переключусь на стандартное приложение Syslog logback (не вывод JSON)

...
  <appender name="SYSLOG" class="ch.qos.logback.classic.net.SyslogAppender">
    <syslogHost>127.0.0.1</syslogHost>
    <Facility>LOCAL5</Facility>
    <SuffixPattern>%-5level MyApp %logger %msg</SuffixPattern>
  </appender>
...

Я вижу правильное необработанное значение средства заголовка ‹174> и проанализированные значения LOCAL5.INFO в пакетах wireshark.

 Syslog message: LOCAL5.INFO: Mar 22 12:31:03 sbmelmac-06390.local INFO  App au.com.App Started App in 11.292 seconds (JVM running for 29.336)

Заголовок системного журнала требуется (в конфигурации системного журнала) для направления сообщений журнала в правильные файлы, поэтому без этого я не могу отфильтровать записи журнала на основе фильтров объектов.

Я использую SpringBoot (1.2.7) (который использует logback 1.1.3), apache camel (2.16.1) и logstash-logback-encoder (4.6).

Когда я запускаю отладку, похоже, что метод SyslogStartConverter.convert никогда не вызывается.

Привет Рой


person roy henley    schedule 22.03.2016    source источник


Ответы (1)


После долгих размышлений кажется, что это проблема с оберткой LayoutWrappingEncoder в части примера.

Когда я использую последнюю версию SpringBoot, исключение конфигурации журнала регистрации останавливает запуск приложения (предыдущие версии не останавливали запуск приложения, даже если возникало исключение).

Application startup failed
java.lang.IllegalStateException: Logback configuration error detected: 
ERROR in ch.qos.logback.core.joran.util.PropertySetter@10d307f1 - A "ch.qos.logback.core.encoder.LayoutWrappingEncoder" object is not assignable to a "ch.qos.logback.core.Layout" variable.
ERROR in ch.qos.logback.core.joran.util.PropertySetter@10d307f1 - The class "ch.qos.logback.core.Layout" was loaded by 
ERROR in ch.qos.logback.core.joran.util.PropertySetter@10d307f1 - [sun.misc.Launcher$AppClassLoader@73d16e93] whereas object of type 
ERROR in ch.qos.logback.core.joran.util.PropertySetter@10d307f1 - "ch.qos.logback.core.encoder.LayoutWrappingEncoder" was loaded by [sun.misc.Launcher$AppClassLoader@73d16e93].

поэтому, если я удалю оболочку LayoutWrappingEncoder и использую реализацию шаблона в префиксе, код будет работать, и я увижу правильные сведения об объекте в заголовках системного журнала.

 <conversionRule conversionWord="syslogStart" converterClass="ch.qos.logback.classic.pattern.SyslogStartConverter"/>
 <appender name="JSON_SYSLOG" class="net.logstash.logback.appender.LogstashSocketAppender">
    <host>127.0.0.1</host>
    <port>514</port>
    <prefix class="ch.qos.logback.classic.PatternLayout">
       <pattern>%syslogStart{LOCAL5}</pattern>
    </prefix>
  </appender>

и полученные пакеты wireshark содержат информацию об объекте (LOCAL5.INFO|ERROR)

 [truncated]Syslog message: LOCAL5.INFO: Mar 22 14:12:18 sbmelmac-06390.local {"@timestamp":"2016-03-22T14:12:18.494+11:00","@version":1,"message":"Started App in 4.597 seconds (JVM running for 5.18)","logger":"au.com.myapp.
person roy henley    schedule 22.03.2016