Use slf4j together with log4j2 for logging

Context and Problem Statement

Up to version 4.1 JabRef uses apache-commons-logging 1.2 for logging errors and messages. However, this is not compatible with java 9 and is superseded by log4j.

Decision Drivers

  • SLF4J provides a façade for several logging frameworks, including log4j and supports already java 9
  • Log4j is already defined as dependency and slf4j has already been required by a third party dependency

Considered Alternatives

Decision Outcome

Chosen option: "SLF4J with Log4j2 binding", because comes out best (see below).

Pros and Cons of the Options

Log4j2

  • Good, because dependency already exists
  • Good, because Java 9 support since version 2.10
  • Bad, because direct dependency

SLF4J with log4j2 binding

  • Good, because it only requires minimal changes to our logging infrastructure
  • Good, because Apache Log4j 2 is an upgrade to Log4j that provides significant improvements over its predecessor, Log4j 1.x, and provides many of the improvements available in Logback while fixing some inherent problems in Logback’s architecture.
  • Good, because supports other loggers as well
  • Good, because Java 9 support
  • Good, because already defined
  • Good, because migration tool available
  • Good, because it is a façade for several loggers. Thus, the underlying implementation can easily be changed in the future.
  • Bad, because logger statements require a slight different syntax

SLF4J with Logback binding

  • Good, because migration tool available
  • Good, because native implementation of slf4j
  • Bad, because Java 9 support only available in alpha
  • Bad, because different syntax than log4j/commons logging