Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to log specific HTTP header using logback.xml

Tags:

I would like to create a console appender that displays some log info, and also prints out a particular http header, similar to this:

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

I have created a logback-spring.xml file like below, but "my-header" just prints out blank.

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

I have read that using logback-access gives you access to HTTP request/response properties, but when I try setting the encoder class I cannot use any of the classic logback conversion words:

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

The logback above gives these errors:

[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

How can I access a request header?

like image 652
Brittany Avatar asked Aug 31 '17 17:08

Brittany


People also ask

What is logger name in Logback xml?

Loggers. Loggers are the third main component of Logback, which developers can use to log messages at a certain level. The library defines 5 log levels: TRACE, DEBUG, INFO, WARN, ERROR; each of these has a corresponding logging method: trace(), debug(), info(), warn(), error().

How do I enable debug logs in Logback xml?

debug=true to enable debugging of the logback setup. Unfortunately, there is no way to enable debugging via a System property. You have to use <configuration debug="true"> in the logback. xml .


1 Answers

This configuration worked for me:

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

Name of the header goes in between curly braces, e.g. %header{Content-type} or %header{My-header}, or just %header if you want all headers to be logged.

Source:

  • https://logback.qos.ch/access.html#configuration
  • https://logback.qos.ch/manual/layouts.html#AccessPatternLayout
like image 192
Anoobizzz Avatar answered Oct 11 '22 14:10

Anoobizzz