Logging
Logging: A Quick Overview
For logging, we use log4j which implements the slf4j API.
This means you can use any slf4j compliant logging framework,
with a default configuration which just works out of the box
and bindings to the other common libraries (java.util.logging
, logback
, ...)
if you prefer one of those.
OSGi based Apache Brooklyn
While developing it may be useful to change logging level of some of the Apache Brooklyn modules.
The easiest way to do that is via the karaf console which can be started by bin/client
.
(Details regarding using Apache Brooklyn Karaf console)
For example if you would like to inspect jclouds API calls, enable jclouds.wire logging just enable it from karaf client.
log:set DEBUG jclouds.wire
To check other log levels.
log:list
If for some reason log level needs modified before the first start of Karaf
then you can modify the config file etc/org.ops4j.pax.logging.cfg
before hand.
For more information check
https://ops4j1.jira.com/wiki/display/paxlogging/Configuration.
Karaf Log commands
Logging commands are available through the karaf console. These let you interact with the logs and dynamically change logging configuration in a running application.
Some useful log: commands are:
log:display mylogger -p "%d - %c - %m%n" - Show the log entries for a specific logger with a different pattern.
log:get/set - Show / set the currently configured log levels
log:tail - As display but will show continuously
log:exception-display - Display the last exception
Bundles
You can capture logs from a specific bundle or set of bundles and e.g. write that to a different file.
log4j.appender.sift=org.apache.log4j.sift.MDCSiftingAppender
log4j.appender.sift.key=myBundle
log4j.appender.sift.default=karaf
log4j.appender.sift.appender=org.apache.log4j.FileAppender
log4j.appender.sift.appender.layout=org.apache.log4j.PatternLayout
log4j.appender.sift.appender.layout.ConversionPattern=%d{ISO8601} | %-5.5p | %-16.16t | %-32.32c{1} | %m%n
log4j.appender.sift.appender.file=${karaf.data}/log/mybundle.debug.log
log4j.appender.sift.appender.append=true
For a detailed reference to the sift appender see Karaf Advanced configuration
Tests
For unit testing, where no karaf context exits, Brooklyn uses logback. Brooklyn project's test
scope includes the brooklyn-utils-test-support
project
which supplies a logback-test.xml
. logback uses this file in preference to logback.xml
when available (ie when running tests).
Caveats
If you're not getting the logging you expect in the IDE, make sure
src/main/resources
is included in the classpath. (In eclipse, right-click the project, the Build Path -> Configure, then make sure all dirs are included (All) and excluded (None) --mvn clean install
should do this for you.)You may find that your IDE logs to a file
brooklyn-tests.log
if it doesn't distinguish between test build classpaths and normal classpaths.Logging configuration using file overrides such as this is very sensitive to classpath order. To get a separate
brooklyn-tests.log
file during testing, for example, thebrooklyn-test-support
project with scopetest
must be declared as a dependency beforebrooklyn-logback-includes
, due to the way both files declarelogback-appender-file.xml
.Similarly note that the
logback-custom.xml
file is included after logging categories and levels are declared, but before appenders are declared, so that logging levels declared in that file dominate, and that properties from that file apply to appenders.Finally remember this is open to improvement. It's the best system we've found so far but we welcome advice. In particular if it could be possible to include files from the classpath with wildcards in alphabetical order, we'd be able to remove some of the quirks listed above (though at a cost of some complexity!).