log4j2: Location for setting Log4jContextSelector system property for asynchronous logging

前端 未结 4 1909
被撕碎了的回忆
被撕碎了的回忆 2021-02-05 17:45

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 h

相关标签:
4条回答
  • 2021-02-05 18:23

    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".

    0 讨论(0)
  • 2021-02-05 18:33

    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.

    0 讨论(0)
  • 2021-02-05 18:36

    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

    0 讨论(0)
  • 2021-02-05 18:45

    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.

    0 讨论(0)
提交回复
热议问题