Jump to content

Java logging framework

From Wikipedia, the free encyclopedia
This is an old revision of this page, as edited by 85.211.171.245 (talk) at 22:42, 28 November 2019 (Summary). The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.

A Java logging framework is a computer data logging package for the Java platform.

Logging refers to the recording of activity. Logging is a common issue for development teams. Several frameworks ease and standardize the process of logging for the Java platform. This article covers general purpose logging frameworks.

Unfortunately the JDK did not include logging in its original release so by the time the Java Logging API was added several other logging frameworks had become widely used - in particular Apache Commons Logging (also known as Java Commons Logging or JCL) and log4j. This led to problems when integrating different third-party libraries using different logging frameworks. Pluggable logging frameworks were developed to solve this problem.

Functionality overview

Logging is typically broken into three major pieces: the Logger, the Formatter and the Appender (or Handler).

  • The Logger is responsible for capturing the message to be logged along with certain metadata and passing it to the logging framework.
  • After receiving the message, the framework calls the Formatter with the message which formats it for output.
  • The framework then hands the formatted message to the appropriate Appender/Handler for disposition. This might include output to a console display, writing to disk, appending to a database, or generating an email.

Simpler logging frameworks, like Java Logging Framework by the Object Guy, combine the logger and the appender. This simplifies default operation, but it is less configurable, especially if the project is moved across environments.

Logger

A Logger is an object that allows the application to log without regard to where the output is sent/stored. The application logs a message by passing an object or an object and an exception with an optional severity level to the logger object under a given a name/identifier.

Name

A logger has a name. The name is usually structured hierarchically, with periods (.) separating the levels. A common scheme is to use the name of the class or package that is doing the logging. Both log4j and the Java logging API support defining handlers higher up the hierarchy.

For example, the logger might be named "com.sun.some.UsefulClass". The handler can be defined for any of the following:

  • com
  • com.sun
  • com.sun.some
  • com.sun.some.UsefulClass

As long as there is a handler defined somewhere in this stack, logging may occur. For example a message logged to the com.sun.some.UsefulClass logger, may get written by the com.sun handler. Typically there is a global handler that receives and processes messages generated by any logger.

Severity level

The message is logged at a certain level. Common level names are copied from Apache Commons Logging (although the Java Logging API defines different level names):

Common levels
Level Description
FATAL Severe errors that cause premature termination. Expect these to be immediately visible on a status console.
ERROR Other runtime errors or unexpected conditions. Expect these to be immediately visible on a status console.
WARNING Use of deprecated APIs, poor use of API, 'almost' errors, other runtime situations that are undesirable or unexpected, but not necessarily "wrong". Expect these to be immediately visible on a status console.
INFO Interesting runtime events (startup/shutdown). Expect these to be immediately visible on a console, so be conservative and keep to a minimum.
DEBUG detailed information on the flow through the system. Expect these to be written to logs only.
TRACE more detailed information. Expect these to be written to logs only.

The logging framework maintains the current logging level for each logger. The logging level can be set more or less restrictive. For example, if the logging level is set to "WARNING", then all messages of that level or higher are logged: ERROR and FATAL.

Severity levels can be assigned to both loggers and appenders. Both must be enabled for a given severity level for output to be generated. So a logger enabled for debug output will not generate output if the handler that gets the message is not also enabled for debug.

Formatters or renderers

A Formatter is an object that formats a given object. Mostly this consists of taking the binary object and converting it to a string representation. Each framework defines a default output format that can be overridden if desired.

Appenders or handlers

Appenders listen for messages at or above a specified minimum severity level. The Appender takes the message it is passed and posts it appropriately. Message dispositions include:

  • display on the console
  • write to a file or syslog
  • append to a database table
  • distribute via Java Messaging Services
  • send via email
  • write to a socket
  • discard to the "bit-bucket" (/dev/null)

Feature comparison

Features
Framework Supported log levels Standard appenders Popularity Cost / licence
Log4J FATAL ERROR WARN INFO DEBUG TRACE Too many to list: See Appender Documentation Widely used in many projects and platforms Apache License, Version 2.0
Java Logging API SEVERE WARNING INFO CONFIG FINE FINER FINEST Sun's default Java Virtual Machine (JVM) has the following: ConsoleHandler, FileHandler, SocketHandler, MemoryHandler Comes with the JRE
Apache Commons Logging FATAL ERROR WARN INFO DEBUG TRACE Depends on the underlying framework Widely used, often in conjunction with log4j Apache License, Version 2.0
SLF4J ERROR WARN INFO DEBUG TRACE Depends on the underlying framework, which is pluggable. Provides API compatible shims for JCL, JDK and log4j logging packages. It can also use any of them to generate output. Defaults to using Logback for output if available. Widely used in many projects and platforms, typically in conjunction with slf4j. MIT License
tinylog ERROR WARNING INFO DEBUG TRACE ConsoleWriter, FileWriter, LogcatWriter, JdbcWriter, RollingFileWriter, SharedFileWriter and null (discards all log entries) [1] Apache License, Version 2.0
Logback ERROR WARN INFO DEBUG TRACE Too many to list: see Appender JavaDoc Developed as a replacement for log4j, with many improvements. It is used by many projects, typically behind slf4j, such as Akka, Apache Camel, Apache Cocoon, Artifactory, Gradle, Lift Framework, Play Framework, Scalatra, SonarQube, etc... LGPL, Version 2.1

Summary

JCL and log4j are very common simply because they have been around for so long and were the only choices for a long time. Increasingly the flexibility of slf4j (using Logback underneath) makes it the popular choice.

slf4j is a set of logging wrappers (or shims) that allow it to imitate any of the other frameworks. Thus multiple third-party libraries can be incorporated into an application, regardless of the logging framework each has chosen to use. However all logging output is generated in a standard way, typically via Logback.

JCL isn't really a logging framework, but a wrapper for one. As such, it requires a logging framework underneath it, although it can default to using its own SimpleLog logger.

Both JCL and slf4j are useful when developing reusable libraries which need to write to whichever underlying logging system is being used by the application. This also provides flexibility in heterogeneous environments where the logging framework is likely to change, although in most cases, once a logging framework has been chosen, there is little need to change it over the life of the project. sjf4j benefits from being a newer and builds on the lessons learned from older frameworks. Moreover JCL has known problems with class-loaders when determining what logging library it should wrap - see for example [1].

The Java Logging API is also not a logging framework, but a standard API for accessing a logging framework. Compatible frameworks can be loaded into JVM and accessed via the API. There is also a logging implementation supplied with the Sun JVM which is the default logging framework accessed by the API. Many developers confuse this implementation with the Java Logging API. Configuration is by external files only which is not easily changed on the fly (other frameworks support programmatic configuration).

See also

References

  1. ^ "User manual of tinylog".