Skip to content

Configurable policies for formatting Markers/StructuredArguments as strings to substitute into PatternLayout #632

Open
@Mumeii

Description

@Mumeii

Describe the bug

Whenever I use Markers.appendFields() :

  • 🟢 the fields of the given POJO are well sent to the logstash backend as new entries in the JSON root payload
  • 🔴 but what is displayed in the console thru a net.logstash.logback.appender.LogstashAccessTcpSocketAppender is simply the POJO instance reference ... not even it's toString version 😋

Is it a Markers.appendFields related trouble, or a ch.qos.logback.classic.PatternLayout related trouble ?

From my point of view I would expect Markers.appendFields building a data structure that would be compatible with both appenders.

To Reproduce

Steps to reproduce the behavior:

  1. Use this logback.xml configuration :
<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <appender name="Console" class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
            <Pattern>%marker</Pattern>
        </layout>
    </appender>

    <springProperty name="logstash-url" source="custom.logstash.url"/>

    <appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashAccessTcpSocketAppender">
        <destination>${logstash-url}</destination>
        <encoder class="net.logstash.logback.encoder.LogstashEncoder"/>
    </appender>

    <root level="DEBUG">
        <appender-ref ref="Console"/>
        <appender-ref ref="LOGSTASH"/>
    </root>

</configuration>
  1. Execute this code :
    public class MyPojo {

        public static void main(String[] args) {

            MyPojo pojoInstance = new MyPojo();

            log.debug( 
                Markers.appendFields( pojoInstance ), 
                "who cares, only markers are displayed on the console appender :)" 
            );
        }

        final String innerField = "test";

        public String getInnerField() {
            return innerField;
        }

        @Override
        public String toString() {
            return "MyPojo{" +
                "innerField='" + innerField + '\'' +
                '}';
        }
    }
  1. The output on the console is something like that :
MyPojo@91ca23d

Expected behavior
I'm expecting the object fields been displayed in the console instead of there parent object reference, so at best, something like that :

innerField: "test"

Or at least, it's toString representation, but in that case it wouldn't fit well if something got appended to the marker instance returned from Markers.appendFields(), either by using .and(), .add() or Markers.aggregate()

  • what output did you expect
innerField: "test"

Additional context

  • java version : openjdk-11.0.2.jdk

  • logstash-logback-encoder version :
    ~/.m2/repository/net/logstash/logback/logstash-logback-encoder/6.6/logstash-logback-encoder-6.6.jar

  • logback version :
    ~/.m2/repository/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar
    ~/.m2/repository/ch/qos/logback/logback-core/1.2.3/logback-core-1.2.3.jar

  • jackson version :
    ~/.m2/repository/com/fasterxml/jackson/datatype/jackson-datatype-jdk8/2.11.4/jackson-datatype-jdk8-2.11.4.jar
    ~/.m2/repository/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.11.4/jackson-datatype-jsr310-2.11.4.jar
    ~/.m2/repository/com/fasterxml/jackson/module/jackson-module-parameter-names/2.11.4/jackson-module-parameter-names-2.11.4.jar
    ~/.m2/repository/com/fasterxml/jackson/core/jackson-databind/2.11.4/jackson-databind-2.11.4.jar
    ~/.m2/repository/com/fasterxml/jackson/core/jackson-annotations/2.11.4/jackson-annotations-2.11.4.jar
    ~/.m2/repository/com/fasterxml/jackson/core/jackson-core/2.11.4/jackson-core-2.11.4.jar

  • extra log related dependencies :
    ~/.m2/repository/org/springframework/boot/spring-boot-starter-logging/2.4.2/spring-boot-starter-logging-2.4.2.jar
    ~/.m2/repository/org/apache/logging/log4j/log4j-to-slf4j/2.13.3/log4j-to-slf4j-2.13.3.jar
    ~/.m2/repository/org/apache/logging/log4j/log4j-api/2.13.3/log4j-api-2.13.3.jar
    ~/.m2/repository/org/slf4j/jul-to-slf4j/1.7.30/jul-to-slf4j-1.7.30.jar
    ~/.m2/repository/org/slf4j/slf4j-api/1.7.30/slf4j-api-1.7.30.jar

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions