The official page with information regarding Diagnostic Logging resided in the IN Web:
https://www-acc.gsi.de/wiki/IN/DiagnosticLogging
Usage
However, the AP group moved to
log4j 2 and does not use the
log4j 1.2 Socket Appender. Instead we use a custom appender that outputs JSON directly in a
LogStash compatible format.
Enabling log4j 2
To enable
log4j 2 to load the appender (
de.gsi.cs.co.ap.common.dependencies.log4j2LogStashJSONLayout
) you have to add the following maven dependency (please check for the latest version in
artifacts.acc.gsi.de
):
<dependency>
<groupId>de.gsi.fcc.commons</groupId>
<artifactId>common-dependencies</artifactId>
<version>14.0.1</version>
</dependency>
After that you should already be able to use the logging system since a default configuration is also provided inside
common-dependencies
.
By default the
log4j2.xml
is configured to log very detailed
(DEBUG level) information to the console and fewer
(INFO level) to the log server (
https://graylog.acc.gsi.de/).
If you want to use you own configuration you can specify it during program start:
-Dlog4j.configurationFile=path/to/log4j2.xml
If the application uses our regular parent and the dependency
aco-logging-bom the relative path from the resources directory can be used. A list of the standard configurations can be seen here:
https://git.acc.gsi.de/buildsystem-common/aco-logging-bom/src/branch/master/src/main/resources
-Dlog4j.configurationFile=log4j2-dev.xml
When creating your own configuration and if you do not want to start from scratch and instead modify the XML provided by AP, it can be found here
https://git.acc.gsi.de/buildsystem-common/aco-logging-bom/src/branch/master/src/main/resources/log4j2.template.xml
Example
Here is an example how to use the different APIs available
(we strongly suggest to use the Slf4j API):
class LoggingTest {
// Getting an Slf4J logger
private static final org.slf4j.Logger LOGGER_A = org.slf4j.LoggerFactory.getLogger(LoggingTest.class);
// Getting an Apache commons-logging logger
private static final org.apache.commons.logging.Log LOGGER_B = org.apache.commons.logging.LogFactory
.getLog(LoggingTest.class);
// Getting an Log4j 2 logger
private static final org.apache.logging.log4j.Logger LOGGER_C = org.apache.logging.log4j.LogManager
.getLogger("HelloWorld");
{
LOGGER_A.error("This is a logging test 1");
LOGGER_A.warn("This is a logging test 2");
LOGGER_A.info("This is a logging test 3");
LOGGER_A.debug("This is a logging test 4");
LOGGER_B.error("This is a logging test 1");
LOGGER_B.warn("This is a logging test 2");
LOGGER_B.info("This is a logging test 3");
LOGGER_B.debug("This is a logging test 4");
LOGGER_C.error("This is a logging test 1");
LOGGER_C.warn("This is a logging test 2");
LOGGER_C.info("This is a logging test 3");
LOGGER_C.debug("This is a logging test 4");
}
public static void main(String[] args) {
LoggingTest test = new LoggingTest();
}
}
Regardless which API you use the message will be forwarded to
log4j 2 and the formatting from the
log4j.xml
will be used.
This is what the output looks like:
ERROR [07 Jan 2015 10:34:13,052] (LsaTester.java) - This is a logging test 1
WARN [07 Jan 2015 10:34:13,056] (LsaTester.java) - This is a logging test 2
INFO [07 Jan 2015 10:34:13,056] (LsaTester.java) - This is a logging test 3
DEBUG [07 Jan 2015 10:34:13,056] (LsaTester.java) - This is a logging test 4
ERROR [07 Jan 2015 10:34:13,057] (LsaTester.java) - This is a logging test 1
WARN [07 Jan 2015 10:34:13,057] (LsaTester.java) - This is a logging test 2
INFO [07 Jan 2015 10:34:13,057] (LsaTester.java) - This is a logging test 3
DEBUG [07 Jan 2015 10:34:13,057] (LsaTester.java) - This is a logging test 4
ERROR [07 Jan 2015 10:34:13,057] (LsaTester.java) - This is a logging test 1
WARN [07 Jan 2015 10:34:13,058] (LsaTester.java) - This is a logging test 2
INFO [07 Jan 2015 10:34:13,058] (LsaTester.java) - This is a logging test 3
DEBUG [07 Jan 2015 10:34:13,058] (LsaTester.java) - This is a logging test 4
Placeholders
You can add placeholder like
{}
to the message easily. Using this method the resulting string is only build on execution and might save a few resources. As always,
Object.toString is called if you pass objects, nulls are fine.
LOGGER.debug("I want to tell you about {} and {}", 3.14, Runtime.getRuntime().availableProcessors());
Output:
DEBUG 20-07-31 09:43:05,451 main JavaShell.main I want to tell you about 3.14 and 20
Maven
Maven usess a separate log4j2 configuration showing only warnings and errors. If you want to see more detailed log output in your maven build process, you can add the command line option
-Dlog4j.configurationFile=path/to/log4j2.xml
-- RaphaelMueller - 07 Jan 2015