Uploaded image for project: 'logback'
  1. logback
  2. LOGBACK-1775

Last argument of log message stripped if Throwable, even when cause is given as well (Issue #876)

    XMLWordPrintable

Details

    • Icon: Bug Bug
    • Resolution: Fixed
    • Icon: Major Major
    • 1.5.12
    • 1.5.10
    • logback-classic
    • None

    Description

      If a Throwable type is passed to match the last {} argument, it is ignored, and the formatted log message will write {} instead.

      package com.test;
      
      import ch.qos.logback.core.Appender;
      import org.slf4j.Logger;
      import org.slf4j.LoggerFactory;
      import org.slf4j.event.Level;
      
      public class Test {
        static final Logger log = LoggerFactory.getLogger(Test.class);
      
        public static void main(String[] args) {
          log.info("SLF4J Version: {}", Logger.class.getPackage().getImplementationVersion());
          log.info("Logback Version: {}", Appender.class.getPackage().getImplementationVersion());
      
          Exception ex = new CustomException("Some message");
          log.error("Exception Message: {}", ex, ex);
      
          log.makeLoggingEventBuilder(Level.WARN)
              .setMessage("Exception Message: {}")
              .addArgument(ex)
              .setCause(ex)
              .log();
        }
      
        static class CustomException extends Exception {
          public CustomException(String msg) {
            super(msg);
          }
      
          @Override
          public String toString() {
            return "Custom Message";
          }
        }
      }
      

      Expected output:

      [main] INFO com.test.Test – SLF4J Version: 2.0.15
      [main] INFO com.test.Test – Logback Version: 1.5.11
      [main] ERROR com.test.Test – Exception Message: Custom Message
      com.test.Test$CustomException: Some message
      at com.test.Test.main(Test.java:15)
      [main] WARN com.test.Test – Exception Message: Custom Message
      com.test.Test$CustomException: Some message
      at com.test.Test.main(Test.java:15)

      Actual output:

      [main] INFO com.test.Test – SLF4J Version: 2.0.15
      [main] INFO com.test.Test – Logback Version: 1.5.11
      [main] ERROR com.test.Test – Exception Message: {}
      com.test.Test$CustomException: Some message
      at com.test.Test.main(Test.java:15)
      [main] WARN com.test.Test – Exception Message: {}
      com.test.Test$CustomException: Some message
      at com.test.Test.main(Test.java:15)

      Workaround:
      Explicitly calling .toString() on the argument (log.error("Exception Message: {}", ex.toString(), ex)), or adding a bogus extra "" argument (log.error("Exception Message: {}", ex, "", ex)) works as a work around, but causes static analysis tools, including the one in IntelliJ, to warn about it.

      Attachments

        Activity

          People

            ceki Ceki Gülcü
            ceki Ceki Gülcü
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: