I am attempting to set up asynchronous logging (for performance reasons) within REST web methods that currently run in a liberty profile server.
In order to do this, I have set up the following property:
System.setProperty("Log4jContextSelector", "org.apache.logging.log4j.core.async.AsyncLoggerContextSelector");
My problem is that no matter where I do this, sometimes it works and logging is very fast, and sometimes it doesn't.
I have tried (a) in the constructor for the class containing all the REST web methods (b) in the filter doFilter method that gets called prior to the REST method (c) in the filter init method (d) in the REST method itself
None of these locations work consistently.
Can anyone offer an explanation for this behaviour, and if possible a suggested way of fixing the problem.
EDIT: It appears that log4j is being initialised prior to calling setProperty. So what I need to do is set up the property via liberty profile instead.
There is an undocumented method of setting this value for your project without having to manually pass in the system property value during start up.
Add a file named log4j2.component.properties
to your classpath. This can be done in most maven or gradle projects by saving it in src/main/resources
.
This is file is simply java.util.Properties
file. Set the value for the context selector by adding the following line to the file.
Log4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector
Log4j will attempt to read the system property first. If the system property is null, then it will fall back to the values stored in this file by default.
The code that performs this setup is located at Log4jContextFactory.java:91.