log4j2: Location for setting Log4jContextSelector system property for asynchronous logging

非 Y 不嫁゛ 提交于 2019-12-03 12:46:18

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.

My problem is that no matter where I do this, sometimes it works and logging is very fast, and sometimes it doesn't.

Add that code in a static initializer block in the class that defines your main entry point.

public class MainClass {
    // NOTE: Nothing can appear before this initializer
    // NOTE: This initializer must be in the class that contains your entry point
    static {
        System.setProperty("Log4jContextSelector",
            "org.apache.logging.log4j.core.async.AsyncLoggerContextSelector");
    }

    public static void main(final String[] args) {
        // Do anything you want to here
    }
}

According to the Java specification, static initialization occurs in the order it is declared. Therefore, the System.setProperty call is guaranteed to happen before the Log4j initialization.

So apparently I needed to add a line to the jvm.options file

-DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector

The jvm.options file is located here:

${server.config.dir}/jvm.options

And that directory can be found by using the link:

http://www-01.ibm.com/support/knowledgecenter/SSEQTP_8.5.5/com.ibm.websphere.wlp.doc/ae/rwlp_dirs.html?cp=SSEQTP_8.5.5%2F1-3-11-0-2-0

In my case it is at: C:\eclipse\runtime\usr\servers\serverName

Log4j got initialized before calling the main method. So it's unable to pick your property Log4jContextSelector from the system and by default, it works synchronously.

To verify same: remove disruptor dependency, If your project is still going up then it's not getting async.

If you add property via -DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector then after removing disruptor project will not go up.

If you are using tomcat then add system properties in catalina.properties. And don't forget to use immediateFlush="false".

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!