logfellow/logstash-logback-encoder

`fieldNames` attribute throws IllegalStateException

pyaqubzade opened this issue · 2 comments

Describe the bug
When I try to override some field names Logback throws java.lang.IllegalStateException: Logback configuration error detected:

To Reproduce
Steps to reproduce the behavior:

  1. Use this configuration on the Spring Boot application. (logback-spring.xml)
<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <springProfile name="dev">
        <appender name="CONSOLE_LOGSTASH" class="ch.qos.logback.core.ConsoleAppender">
            <encoder class="net.logstash.logback.encoder.LogstashEncoder">
                <fieldNames>
                    <loggerName>logger.name</loggerName>
<!--                    <threadName>logger.thread_name</threadName>-->
                    <stackTrace>error.stack</stackTrace>
<!--                    <throwableMessage>error.message</throwableMessage>-->
<!--                    <throwableClassName>error.kind</throwableClassName>-->
                </fieldNames>
            </encoder>
        </appender>

        <root level="INFO" additivity="false">
            <appender-ref ref="CONSOLE_LOGSTASH"/>
        </root>
    </springProfile>

    <springProfile name="integration">
        <include resource="org/springframework/boot/logging/logback/defaults.xml"/>

        <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
            <encoder>
                <pattern>${CONSOLE_LOG_PATTERN}</pattern>
                <charset>utf8</charset>
            </encoder>
        </appender>

        <root level="DEBUG">
            <appender-ref ref="STDOUT"/>
        </root>
    </springProfile>
</configuration>
  1. Run application with develop profile
  2. Application will throw exception similar to below example
Logging system failed to initialize using configuration from 'null'
java.lang.IllegalStateException: Logback configuration error detected: 
ERROR in ch.qos.logback.core.joran.spi.Interpreter@9:33 - no applicable action for [loggerName], current ElementPath  is [[configuration][appender][encoder][fieldNames][loggerName]]
	at spring.boot@2.6.7/org.springframework.boot.logging.logback.LogbackLoggingSystem.loadConfiguration(LogbackLoggingSystem.java:179)
	at spring.boot@2.6.7/org.springframework.boot.logging.AbstractLoggingSystem.initializeWithConventions(AbstractLoggingSystem.java:80)
	at spring.boot@2.6.7/org.springframework.boot.logging.AbstractLoggingSystem.initialize(AbstractLoggingSystem.java:60)
	at spring.boot@2.6.7/org.springframework.boot.logging.logback.LogbackLoggingSystem.initialize(LogbackLoggingSystem.java:132)
	at spring.boot@2.6.7/org.springframework.boot.context.logging.LoggingApplicationListener.initializeSystem(LoggingApplicationListener.java:313)
	at spring.boot@2.6.7/org.springframework.boot.context.logging.LoggingApplicationListener.initialize(LoggingApplicationListener.java:282)
	at spring.boot@2.6.7/org.springframework.boot.context.logging.LoggingApplicationListener.onApplicationEnvironmentPreparedEvent(LoggingApplicationListener.java:240)
	at spring.boot@2.6.7/org.springframework.boot.context.logging.LoggingApplicationListener.onApplicationEvent(LoggingApplicationListener.java:216)
	at spring.context@5.3.19/org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:176)
	at spring.context@5.3.19/org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:169)
	at spring.context@5.3.19/org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:143)
	at spring.context@5.3.19/org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:131)
	at spring.boot@2.6.7/org.springframework.boot.context.event.EventPublishingRunListener.environmentPrepared(EventPublishingRunListener.java:85)
	at spring.boot@2.6.7/org.springframework.boot.SpringApplicationRunListeners.lambda$environmentPrepared$2(SpringApplicationRunListeners.java:66)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
	at spring.boot@2.6.7/org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:120)
	at spring.boot@2.6.7/org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:114)
	at spring.boot@2.6.7/org.springframework.boot.SpringApplicationRunListeners.environmentPrepared(SpringApplicationRunListeners.java:65)
	at spring.boot@2.6.7/org.springframework.boot.SpringApplication.prepareEnvironment(SpringApplication.java:339)
	at spring.boot@2.6.7/org.springframework.boot.SpringApplication.run(SpringApplication.java:297)
	at spring.boot@2.6.7/org.springframework.boot.SpringApplication.run(SpringApplication.java:1312)
	at spring.boot@2.6.7/org.springframework.boot.SpringApplication.run(SpringApplication.java:1301)
	at app/com.example.Application.main(Application.java:14)
{"@timestamp":"2023-02-14T13:28:48.704+04:00","@version":"1","message":"Application run failed","logger_name":"org.springframework.boot.SpringApplication","thread_name":"main","level":"ERROR","level_value":40000,"error.stack":"java.lang.IllegalStateException: java.lang.IllegalStateException: Logback configuration error detected: \r\nERROR in ch.qos.logback.core.joran.spi.Interpreter@9:33 - no applicable action for [loggerName], current ElementPath  is [[configuration][appender][encoder][fieldNames][loggerName]]\r\n\tat spring.boot@2.6.7/org.springframework.boot.context.logging.LoggingApplicationListener.initializeSystem(LoggingApplicationListener.java:328)\r\n\tat spring.boot@2.6.7/org.springframework.boot.context.logging.LoggingApplicationListener.initialize(LoggingApplicationListener.java:282)\r\n\tat spring.boot@2.6.7/org.springframework.boot.context.logging.LoggingApplicationListener.onApplicationEnvironmentPreparedEvent(LoggingApplicationListener.java:240)\r\n\tat spring.boot@2.6.7/org.springframework.boot.context.logging.LoggingApplicationListener.onApplicationEvent(LoggingApplicationListener.java:216)\r\n\tat spring.context@5.3.19/org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:176)\r\n\tat spring.context@5.3.19/org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:169)\r\n\tat spring.context@5.3.19/org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:143)\r\n\tat spring.context@5.3.19/org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:131)\r\n\tat spring.boot@2.6.7/org.springframework.boot.context.event.EventPublishingRunListener.environmentPrepared(EventPublishingRunListener.java:85)\r\n\tat spring.boot@2.6.7/org.springframework.boot.SpringApplicationRunListeners.lambda$environmentPrepared$2(SpringApplicationRunListeners.java:66)\r\n\tat java.base/java.util.ArrayList.forEach(ArrayList.java:1511)\r\n\tat spring.boot@2.6.7/org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:120)\r\n\tat spring.boot@2.6.7/org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:114)\r\n\tat spring.boot@2.6.7/org.springframework.boot.SpringApplicationRunListeners.environmentPrepared(SpringApplicationRunListeners.java:65)\r\n\tat spring.boot@2.6.7/org.springframework.boot.SpringApplication.prepareEnvironment(SpringApplication.java:339)\r\n\tat spring.boot@2.6.7/org.springframework.boot.SpringApplication.run(SpringApplication.java:297)\r\n\tat spring.boot@2.6.7/org.springframework.boot.SpringApplication.run(SpringApplication.java:1312)\r\n\tat spring.boot@2.6.7/org.springframework.boot.SpringApplication.run(SpringApplication.java:1301)\r\n\tat app/com.example.Application.main(Application.java:14)\r\nCaused by: java.lang.IllegalStateException: Logback configuration error detected: \r\nERROR in ch.qos.logback.core.joran.spi.Interpreter@9:33 - no applicable action for [loggerName], current ElementPath  is [[configuration][appender][encoder][fieldNames][loggerName]]\r\n\tat spring.boot@2.6.7/org.springframework.boot.logging.logback.LogbackLoggingSystem.loadConfiguration(LogbackLoggingSystem.java:179)\r\n\tat spring.boot@2.6.7/org.springframework.boot.logging.AbstractLoggingSystem.initializeWithConventions(AbstractLoggingSystem.java:80)\r\n\tat spring.boot@2.6.7/org.springframework.boot.logging.AbstractLoggingSystem.initialize(AbstractLoggingSystem.java:60)\r\n\tat spring.boot@2.6.7/org.springframework.boot.logging.logback.LogbackLoggingSystem.initialize(LogbackLoggingSystem.java:132)\r\n\tat spring.boot@2.6.7/org.springframework.boot.context.logging.LoggingApplicationListener.initializeSystem(LoggingApplicationListener.java:313)\r\n\t... 18 common frames omitted\r\n"}
Exception in thread "main" java.lang.IllegalStateException: java.lang.IllegalStateException: Logback configuration error detected: 
ERROR in ch.qos.logback.core.joran.spi.Interpreter@9:33 - no applicable action for [loggerName], current ElementPath  is [[configuration][appender][encoder][fieldNames][loggerName]]
	at spring.boot@2.6.7/org.springframework.boot.context.logging.LoggingApplicationListener.initializeSystem(LoggingApplicationListener.java:328)
	at spring.boot@2.6.7/org.springframework.boot.context.logging.LoggingApplicationListener.initialize(LoggingApplicationListener.java:282)
	at spring.boot@2.6.7/org.springframework.boot.context.logging.LoggingApplicationListener.onApplicationEnvironmentPreparedEvent(LoggingApplicationListener.java:240)
	at spring.boot@2.6.7/org.springframework.boot.context.logging.LoggingApplicationListener.onApplicationEvent(LoggingApplicationListener.java:216)
	at spring.context@5.3.19/org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:176)
	at spring.context@5.3.19/org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:169)
	at spring.context@5.3.19/org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:143)
	at spring.context@5.3.19/org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:131)
	at spring.boot@2.6.7/org.springframework.boot.context.event.EventPublishingRunListener.environmentPrepared(EventPublishingRunListener.java:85)
	at spring.boot@2.6.7/org.springframework.boot.SpringApplicationRunListeners.lambda$environmentPrepared$2(SpringApplicationRunListeners.java:66)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
	at spring.boot@2.6.7/org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:120)
	at spring.boot@2.6.7/org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:114)
	at spring.boot@2.6.7/org.springframework.boot.SpringApplicationRunListeners.environmentPrepared(SpringApplicationRunListeners.java:65)
	at spring.boot@2.6.7/org.springframework.boot.SpringApplication.prepareEnvironment(SpringApplication.java:339)
	at spring.boot@2.6.7/org.springframework.boot.SpringApplication.run(SpringApplication.java:297)
	at spring.boot@2.6.7/org.springframework.boot.SpringApplication.run(SpringApplication.java:1312)
	at spring.boot@2.6.7/org.springframework.boot.SpringApplication.run(SpringApplication.java:1301)
	at app/com.example.Application.main(Application.java:14)
Caused by: java.lang.IllegalStateException: Logback configuration error detected: 
ERROR in ch.qos.logback.core.joran.spi.Interpreter@9:33 - no applicable action for [loggerName], current ElementPath  is [[configuration][appender][encoder][fieldNames][loggerName]]
	at spring.boot@2.6.7/org.springframework.boot.logging.logback.LogbackLoggingSystem.loadConfiguration(LogbackLoggingSystem.java:179)
	at spring.boot@2.6.7/org.springframework.boot.logging.AbstractLoggingSystem.initializeWithConventions(AbstractLoggingSystem.java:80)
	at spring.boot@2.6.7/org.springframework.boot.logging.AbstractLoggingSystem.initialize(AbstractLoggingSystem.java:60)
	at spring.boot@2.6.7/org.springframework.boot.logging.logback.LogbackLoggingSystem.initialize(LogbackLoggingSystem.java:132)
	at spring.boot@2.6.7/org.springframework.boot.context.logging.LoggingApplicationListener.initializeSystem(LoggingApplicationListener.java:313)
	... 18 more

Process finished with exit code 1

Expected behavior

Usual logs with new field names

Additional context

  • logstash-logback-encoder version 7.2
  • logback version 1.2.11
  • jackson version 2.13.2
  • java version 17

Use <logger> instead of <loggerName>

From the readme...

For LoggingEvents, see LogstashFieldNames for all the field names that can be customized. Each java field name in that class is the name of the xml element that you would use to specify the field name (e.g. logger, levelValue).

I have changed argument names to

<fieldNames>
    <logger>logger.name</logger>
    <thread>logger.thread_name</thread>
    <stackTrace>error.stack</stackTrace>
</fieldNames>

and used providers for exceptions

<provider class="net.logstash.logback.composite.loggingevent.ThrowableMessageJsonProvider">
    <fieldName>error.message</fieldName>
</provider>
<provider class="net.logstash.logback.composite.loggingevent.ThrowableClassNameJsonProvider">
    <fieldName>error.kind</fieldName>
</provider>