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 = falseSIFT 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, siftCustomizing 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 -
nameis 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 -
nameis treated as part of OSGi filter(&(objectClass=org.ops4j.pax.logging.spi.PaxErrorHandler)(org.ops4j.pax.logging.filter.name=name)).org.apache.log4j.Layout -
nameis treated as part of OSGi filter(&(objectClass=org.ops4j.pax.logging.spi.PaxLayout)(org.ops4j.pax.logging.layout.name=name)).org.apache.log4j.Appender -
nameis 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.