当前位置: 首页 > 知识库问答 >
问题:

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

柳羽
2023-03-14

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

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

我创建了一个如下所示的< code>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>

我知道使用< code>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>

上面的日志给出了以下错误:

[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

如何访问请求标头?

共有2个答案

富念
2023-03-14

请查看以下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> {
        ....
    }
    

日志返回.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>
郑西岭
2023-03-14

这种配置适合我:

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

源:

    < Li > https://log back . QoS . ch/access . html #配置 < Li > https://log back . QoS . ch/manual/layouts . html # AccessPatternLayout
 类似资料:
  • 我已经尝试PostSharp AOP一段时间了。我能够设计简单的方面并很好地使用它们。但是我正在努力找到实现这个场景的最佳方法。 场景: > 在方法中记录开发人员指定的语句。 假设我构建了一个Apsect(LogMethodAspect),在进入和退出期间记录该方法。 但是,现在我想记录一条特定的语句。我希望此语句是同一日志的一部分。 选项: 创建另一个将记录参数的方面(LogStatementA

  • 我正在使用log4j进行日志记录。我有一个场景,我必须为不同的严重性使用单独的日志记录。例如,对于软件包foo,我必须在控制台中打印具有严重性ERROR的消息,而我必须在日志文件中打印具有严重性WARN的消息。我如何配置我的log4j.xml相同。

  • 我正在系统上处理一个新函数,现在我需要选择一个文件,并保存在用户C:的文件夹中。这个过程是这样发生的,用户上传一个文件到系统中,这个文件可以是任何东西,文本,图像,除了视频,现在它被保存在系统数据库中,但是我的老板想要改变这个过程,所以我需要保存在用户C:上的一个特定文件夹上,我已经创建了特定文件夹,但是我不知道如何将文件保存在创建的文件夹上。因此上载文件的代码如下所示:

  • 问题内容: 在我的应用程序中,我使用Java Hibernate。 日志记录:我使用logback.xml 任何人都可以建议是否有一种方法可以从Hibernate jar中禁用以下特定类的日志。 *日志 *记录器将从特定类中删除 :错误ohejdbc.spi.SqlExceptionHelper logback.xml: 问题答案: 将以下内容添加到您的配置文件中: 指令:告诉Logback禁用给

  • 显示特定的通话记录     可显示指定的通话记录。选择通话记录后按下按钮,并选择选项选单的[依种类排列记录]。 通话记录可从以下项目中选择。 所有通话记录 显示通话记录。 XX件未处理事项 显示前次确认后发生的记录。 没有其他记录时,会显示[暂无任何未处理事项]。 语音消息 显示语音消息。 未接来电 显示未接来电记录。 已接来电 显示已接来电记录。 已拨电话 显示已拨电话记录。 提示 亦可于显示通