如何使用 logback.xml 记录特定的 HTTP 标头

Bri*_*any 5 logback

我想创建一个控制台 appender 来显示一些日志信息,并打印出一个特定的 http 标头,类似于:

> [INFO] { "time": "2017-08-31 12:14:32,583", "app-id": "my-app", "my-header": "my-header-value" } -- "Hello, World"
Run Code Online (Sandbox Code Playgroud)

我创建了一个logback-spring.xml如下所示的文件,但“我的标题”只是打印出空白。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>

<springProperty name="appId" source="spring.app.application_id"/>

<!-- Appender to log to console -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
        <!-- Minimum logging level to be presented in the console logs-->
        <level>INFO</level>
    </filter>
    <encoder>
        <pattern>
            %clr(%5p) %clr({ "time": "%date{ISO8601}", "app-id": "${appId}", "my-header": "%X{my-header}"}){faint} -- %msg%n
        </pattern>
        <charset>utf8</charset>
    </encoder>
</appender>
?
<root level="INFO">
    <appender-ref ref="console"/>
</root>
</configuration>
Run Code Online (Sandbox Code Playgroud)

我读过 using 可以logback-access让您访问 HTTP 请求/响应属性,但是当我尝试设置编码器类时,我无法使用任何经典的 logback 转换词:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>

<!-- Appender to log to console -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
        <!-- Minimum logging level to be presented in the console logs-->
        <level>INFO</level>
    </filter>
    <encoder class="ch.qos.logback.access.PatternLayoutEncoder">
        <pattern class="ch.qos.logback.access.PatternLayoutEncoder">
            %clr(%5p) %clr({ "time": "%date{ISO8601}", "app-id": "${appId}", "my-header": "%header{my-header}"}){faint} -- %msg%n
        </pattern>
        <charset>utf8</charset>
    </encoder>
</appender>
?
<root level="INFO">
    <appender-ref ref="console"/>
</root>
</configuration>
Run Code Online (Sandbox Code Playgroud)

上面的 logback 给出了这些错误:

[ERROR] Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:1.4.0.RELEASE:run (default-cli) on project pd-thundera-server: An exception occurred while running. null: InvocationTargetException: Logback configuration error detected:
[ERROR] ERROR in ch.qos.logback.core.pattern.parser.Compiler@4782f0a4 - There is no conversion class registered for conversion word [p]
[ERROR] ERROR in ch.qos.logback.core.pattern.parser.Compiler@4782f0a4 - [p] is not a valid conversion word
[ERROR] ERROR in ch.qos.logback.core.pattern.parser.Compiler@6071227e - There is no conversion class registered for conversion word [msg]
[ERROR] ERROR in ch.qos.logback.core.pattern.parser.Compiler@6071227e - [msg] is not a valid conversion word
Run Code Online (Sandbox Code Playgroud)

如何访问请求标头?

Ano*_*zzz 4

这个配置对我有用:

    <encoder>
        <charset>utf-8</charset>
        <pattern>%t{yyyy-MM-dd HH:mm:ss,SSS} %h X-Forwarded-For: %header{X-Forwarded-For} "%r", Response status:%s, Bytes sent:%b, Response time:%D</pattern>
    </encoder>
Run Code Online (Sandbox Code Playgroud)

标头的名称位于大括号之间,例如%header{Content-type}%header{My-header},或者只是%header如果您希望记录所有标头。

来源: