如何添加HTTP标头Logback Logstash

时间:2018-08-21 22:17:34

标签: http-headers logstash logback request-headers logstash-logback-encoder

我通读了以下文档,但无法弄清楚我还需要什么其他配置:https://github.com/logstash/logstash-logback-encoder#header-fields

我的配置文件:          

    <include resource="org/springframework/boot/logging/logback/defaults.xml" />

    <include resource="org/springframework/boot/logging/logback/console-appender.xml" />

    <property name="LOG_FILE" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}}/spring.log}"/>

    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder class="net.logstash.logback.encoder.LogstashEncoder">
            <customFields>{"app_name":"${APP_NAME:-N/A}","app_version":"${APP_VERSION:-N/A}","hostname":"${HOST:-N/A}","environment":"${environment:-${ENVIRONMENT:-N/A}}"}</customFields>
            <includeContext>false</includeContext>
            <timeZone>UTC</timeZone>
       </encoder>

      <encoder class="net.logstash.logback.encoder.LogstashAccessEncoder">
        <fieldNames>
            <requestHeaders>request_headers</requestHeaders>
        </fieldNames>
      </encoder>

        <file>${LOG_FILE}</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_FILE_ROTATION:-${LOG_FILE}%d{yyyy-MM-dd}.%i}</fileNamePattern>
            <maxHistory>${LOG_FILE_ROTATION_MAX_HISTORY:-1}</maxHistory>
            <totalSizeCap>${LOG_FILE_ROTATION_TOTAL_SIZE_CAP:-3GB}</totalSizeCap>
            <maxFileSize>${LOG_FILE_ROTATION_MAX_FILE_SIZE:-1GB}</maxFileSize>
        </rollingPolicy>
    </appender>

    <root level="${LOG_LEVEL:-INFO}">
        <appender-ref ref="CONSOLE" />
        <appender-ref ref="FILE" />
    </root>

</configuration>

错误:

    java.lang.IllegalStateException: Logback configuration error detected: 
ERROR in ch.qos.logback.core.joran.spi.Interpreter@19:29 - no applicable action for [requestHeaders], current ElementPath  is [[configuration][appender][encoder][fieldNames][requestHeaders]]

1 个答案:

答案 0 :(得分:0)

您提供的xml配置文件似乎用于logback-classic(因为它包含<root level=...)。

logstash-logback-encoder自动记录请求标头仅适用于通过logback-access记录的IAccessEvent个。

换句话说,对于通过ILoggingEvent从logback-classic记录的Logger,对请求标头的自动日志记录不可用。但是,如下所述,您可以在使用经典的logback时手动添加它们。

通过logback-access记录请求标头

要记录通过logback-access记录的IAccessEvent的请求标头,请按照说明为tomcat或jetty设置logback-access,并将以下内容添加到您的logback-access.xml中。 (请注意,这不是经典的logback使用的logback.xml文件)。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<configuration>
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="net.logstash.logback.encoder.LogstashAccessEncoder">
            <fieldNames>
                <requestHeaders>request_headers</requestHeaders>
            </fieldNames>
        </encoder>
    </appender>

    <appender-ref ref="console"/>

</configuration>

此配置已使用logstash-logback-encoder 5.3进行了测试。请注意,在5.0之前的logstash-logback-encoder版本中,xml元素名称有所不同,因此请确保您在该配置中使用5.0 +。

使用logback-classic记录请求标头

logstash-logback-encoder不提供通过logback-classic记录请求标头的一流支持。但是,您可以使用event-specific custom fields将它们包括在通过Logger记录的日志事件中。

例如,在可以访问http请求的类(例如servlet过滤器)中,您可以执行以下操作:

Map<String, String> httpHeadersMap = ...; // get http request headers as a map
LOGGER.info("request", StructuredArguments.entries(httpHeadersMap));

并在LogbackEncoder中配置logback.xml,如下所示:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<configuration>
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="net.logstash.logback.encoder.LogstashEncoder"/>
    </appender>

    <root level="info">
        <appender-ref ref="console" />
    </root>

</configuration>