【问题标题】:How to log specific HTTP header using logback.xml如何使用 logback.xml 记录特定的 HTTP 标头
【发布时间】:2017-08-31 17:53:53
【问题描述】:

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

> [INFO] { "time": "2017-08-31 12:14:32,583", "app-id": "my-app", "my-header": "my-header-value" } -- "Hello, World"

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

<?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>

我已经读到使用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>

上面的 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

如何访问请求标头?

【问题讨论】:

  • 你是怎么解决的
  • springProperty 来自哪里?它不是 Logback 的一部分?!
  • springProperty 是 Spring Boot 对 Logback 的扩展。 Reference doc

标签: logback


【解决方案1】:

这个配置对我有用:

    <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>

标题的名称放在大括号之间,例如%header{Content-type}%header{My-header},如果您希望记录所有标头,则只需 %header

来源:

【讨论】:

  • @Billa 不确定我还能添加什么,稍微扩展答案并添加对文档的引用
【解决方案2】:

请在下面找到 Spring 示例

如果要记录 http 标头,则需要使用 MDC 功能:http://logback.qos.ch/manual/mdc.html

创建过滤器:

@Component
class RequestHeaderFilterConfig : Filter {

    private val xRequestId = "X-Request-Id"

    override fun doFilter(request: ServletRequest?, response: ServletResponse?, chain: FilterChain?) {
        val httpRequest = request as HttpServletRequest
        MDC.put(xRequestId, httpRequest.getHeader(xRequestId))
        chain?.doFilter(request, response)
    }

    override fun destroy() = MDC.remove(xRequestId)
}

控制器:

@PostMapping
    fun operation(@RequestHeader(value = "X-Request-Id", required = false) xRequestId: String? = null): ResponseEntity<Output> {
        ....
    }
    

logback.xml

<Pattern>%d{dd-MM-yyyy HH:mm:ss.SSS} [%thread] %-5level [X-Request-Id: %X{X-Request-Id}] %logger{36}.%M:%line - %msg%n</Pattern>
猜你喜欢
  • 2018-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-05
  • 1970-01-01
  • 2012-04-09
相关资源
最近更新 更多