Logging in Java: Switching to logback and slf4j
log4j was and maybe still is the de facto standard when it comes to logging in Java applications.
Sun's solution with the internal JDK logging could not be enforced across the board. The reasons for this are certainly the lack of configurability and flexibility. For simple projects the JDK logging is certainly a solution, but not for enterprise applications.
Now, in addition to log4j a new implementation that is more powerful, faster and more flexible than log4j has entered the market: logback. Ok, in fact logback was started in 2006, but version 1.0 was released in Nov. 2011.
logback has been created as a successor to log4j by the same developer and is now available after many years of testing and development in a version 1.0 (current version is 1.0.1). To avoid misunderstandings due to the small version number it should be said that logback is already in use for years in business and the version number does not reflect in any case a statement about the stability or functionality.
logback provides several advantages over log4j. Among other things:
- Much faster implementation
- Automatic reloading of logging configuration
- Better filter
- Automatic compression of archived log files
- Stack traces with information about the manufacturing Java Package (jar file)
- Automatic removal of old log archives
For the developer a switch from log4j to logback is very easy. Just switch a dependency in your Maven POM and you are ready to go:
<dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.0.0</version> </dependency>
Thanks to the transitive dependencies you now also have the logging facade slf4j added to your project.A "Hello World" example using slf4j looks like this:
package demo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class HelloWorld { public static void main(String[] args) { Logger log = LoggerFactory.getLogger(HelloWorld.class); log.info("Hello World"); } }
All that remains is a configuration file to control log output. With log4j it is usually called log4j.xml. With logback it is called logback.xml or logback-test.xml for testing environment.
In Maven projects the file logback.xml must be placed into $PROJECT_HOME/src/main/resources. The file logback-test.xml must be placed into $PROJECT_HOME/src/test/resources. A simple configuration looks like this:
<configuration> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <!-- encoders are assigned the type ch.qos.logback.classic.encoder.PatternLayoutEncoder by default --> <encoder> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <root level="debug"> <appender-ref ref="STDOUT" /> </root> </configuration>The complete manual for logback is very detailed and available here.
(Note: Opinions expressed in this article and its replies are the opinions of their respective authors and not those of DZone, Inc.)
Comments
Fabrizio Giudici replied on Sun, 2013/02/17 - 6:39am
Definitely +1 for slf4j and logback. Most of the recent FLOSS products standardize on slf4j, I've been using both in production, even for my customers, and it's fine.
Grzegorz Grzybek replied on Mon, 2013/02/18 - 2:18am
Ralf Quebbemann replied on Mon, 2013/02/18 - 3:20am
in response to:
Grzegorz Grzybek
JBoss Logging is also new to me. Have to check it out. Maybe the reason for switching to JBoss Logging is a better integration into the JBoss stack, or not relying too much on external libraries.