Configuring Log4J1

Configuring Log4J1

This page is dedicated to pax-logging-service backend which provides support for Log4J1 library.

Even if original Log4J1 library supports XML and properties file format, Pax Logging uses only org.apache.log4j.PropertyConfigurator. All properties starting with log4j are extracted from the configuration specified in org.ops4j.pax.logging PID and passed to PropertyConfigurator.

Sample configuration

Typical configuration looks like this (shows console, file and socket appenders):

log4j.appender.console = org.apache.log4j.ConsoleAppender log4j.appender.console.layout = org.apache.log4j.TTCCLayout log4j.appender.file = org.apache.log4j.FileAppender log4j.appender.file.append = false log4j.appender.file.file = example.log log4j.appender.file.layout = org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern = %C | %M | %F | %L : [%p] %m%n log4j.appender.socket = org.apache.log4j.net.SocketAppender log4j.appender.socket.port = 1042 log4j.appender.socket.remoteHost = localhost log4j.appender.socket.layout = org.apache.log4j.PatternLayout log4j.appender.socket.layout.ConversionPattern = %c/%C [%p] %m%n log4j.rootLogger = INFO, console log4j.logger.com.example = INFO, file, socket log4j.additivity.com.example = false

SIFT logging

Sifting (segregating) logger can split incoming logging events and pass them to different or parameterized appenders. Segregation is done using configured key. This key is then looked up in MDC which always contains the following entries (provided by Pax Logging itself):

  • bundle.id

  • bundle.name - from bundle symbolic name

  • bundle.version - from bundle version

Other libraries may use/add other keys. Apache camel adds these, when Camel context is MDC-aware:

  • camel.exchangeId

  • camel.messageId

  • camel.contextId

  • camel.correlationId

  • camel.breadcrumbId

Here’s sample configuration using MDCSiftingAppender:

mdc.appender.log4j.appender.sift = org.apache.log4j.sift.MDCSiftingAppender mdc.appender.log4j.appender.sift.key = bundle.name mdc.appender.log4j.appender.sift.default = no-such-bundle mdc.appender.log4j.appender.sift.appender = org.apache.log4j.FileAppender mdc.appender.log4j.appender.sift.appender.layout = org.apache.log4j.PatternLayout mdc.appender.log4j.appender.sift.appender.layout.ConversionPattern = %c/%C [%p] <%X> %m%n mdc.appender.log4j.appender.sift.appender.append = false # bundle.id and bundle.name have direct 1:1 relation, there's no point of having file *not* keyed by actual MDC key mdc.appender.log4j.appender.sift.appender.file = target/logs-log4j1/${bundle.id}-file-appender.log mdc.appender.log4j.rootLogger = INFO, sift

Customizing Log4J1

Users are allowed to extend the functionality of Log4J1 through mechanisms provided by Pax Logging.

Log4J1 appenders, layouts, error handlers and filters may be specified (in PID / configuration file) not as fully qualified class name, but as identifier in the format osgi:name. Pax Logging then parses such identifier and treats it depending on type of actual component:

  • org.apache.log4j.spi.Filter - name is treated as part of OSGi filter (&(objectClass=org.ops4j.pax.logging.spi.PaxFilter)(org.ops4j.pax.logging.errorhandler.name=name)).

  • org.apache.log4j.spi.ErrorHandler - name is treated as part of OSGi filter (&(objectClass=org.ops4j.pax.logging.spi.PaxErrorHandler)(org.ops4j.pax.logging.filter.name=name)).

  • org.apache.log4j.Layout - name is treated as part of OSGi filter (&(objectClass=org.ops4j.pax.logging.spi.PaxLayout)(org.ops4j.pax.logging.layout.name=name)).

  • org.apache.log4j.Appender - name is treated as part of OSGi filter (&(objectClass=org.ops4j.pax.logging.spi.PaxAppender)(org.ops4j.pax.logging.appender.name=name)).

All the above filters are used by Pax Logging to obtain relevant OSGi services from OSGi registry. User’s role is to register such service implementing interfaces from org.ops4j.pax.logging.spi package. This is OSGi-friendly way of extending behavior of Log4J1.

Another way is to provide fragment bundles for pax-logging-service bundle with special implementations of e.g., appenders. This will be described in more details for pax-logging-log4j2 backend.