Java log4j2:设置异步日志记录的Log4jContextSelector系统属性的位置

Java log4j2:设置异步日志记录的Log4jContextSelector系统属性的位置,java,log4j2,websphere-liberty,Java,Log4j2,Websphere Liberty,我正在尝试在REST web方法中设置异步日志记录(出于性能原因),该方法当前在liberty概要文件服务器中运行 为此,我设置了以下属性: System.setProperty("Log4jContextSelector", "org.apache.logging.log4j.core.async.AsyncLoggerContextSelector"); 我的问题是,无论我在哪里这样做,有时它都能工作,而且日志记录速度非常快,有时则不然 我尝试了(a)在包含所有REST web方法的类的构

我正在尝试在REST web方法中设置异步日志记录(出于性能原因),该方法当前在liberty概要文件服务器中运行

为此,我设置了以下属性:

System.setProperty("Log4jContextSelector", "org.apache.logging.log4j.core.async.AsyncLoggerContextSelector");
我的问题是,无论我在哪里这样做,有时它都能工作,而且日志记录速度非常快,有时则不然

我尝试了(a)在包含所有REST web方法的类的构造函数中 (b) 在filter doFilter方法中,该方法在REST方法之前被调用 (c) 在filter init方法中 (d) 在REST方法本身中

这些地点没有一个能始终如一地工作

任何人都可以为这种行为提供解释,如果可能的话,提供解决问题的建议方法


编辑:在调用setProperty之前,似乎正在初始化log4j。因此,我需要做的是通过liberty profile设置属性。

因此,显然我需要在jvm.options文件中添加一行

-DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector
jvm.options文件位于此处:

${server.config.dir}/jvm.options
可通过以下链接找到该目录:


在我的例子中,它位于:C:\eclipse\runtime\usr\servers\serverName

有一种未记录的方法,可以为项目设置此值,而无需在启动期间手动传递系统属性值

将名为
log4j2.component.properties
的文件添加到类路径中。这可以在大多数maven或gradle项目中通过将其保存在
src/main/resources
中来实现

这是一个简单的
java.util.Properties
文件。通过向文件中添加以下行来设置上下文选择器的值

Log4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector
Log4j将首先尝试读取系统属性。如果系统属性为null,则默认情况下它将返回到此文件中存储的值

执行此设置的代码位于

我的问题是,无论我在哪里这样做,有时它都能工作,而且日志记录速度非常快,有时则不然

在定义主入口点的类中的静态初始值设定项块中添加该代码

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
    }
}

根据Java规范,静态初始化按照声明的顺序进行。因此,
System.setProperty
调用保证在Log4j初始化之前发生。

Log4j在调用main方法之前被初始化。因此,它无法从系统中选择属性Log4jContextSelector,默认情况下,它是同步工作的

验证相同:删除中断器依赖项,如果您的项目仍在进行中,那么它就不是异步的

如果您通过-DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector添加属性,则在删除中断程序后,项目将不会启动


如果您使用的是tomcat,那么在catalina.properties中添加系统属性。别忘了使用immediateFlush=“false”。

@fnt不,我没有证据,没有进行比较,所以我会更改我的评论。这里我只是和标准日志比较一下。你们可以在Liberty中评估这个选项,因为它比标准日志有更好的性能。也许这对你来说已经足够好了。读得好。Log4J2似乎使用属性名
Log4J2.contextSelector
以及
Log4JContextSelector
支持此功能,并且文档似乎将这两个属性混合在一起。如果将其添加到Tomcat服务器配置的VM参数中,它会起作用吗?我可以做些什么来验证是否考虑了此属性是否将帐户添加为文件?旁注:现在可以在
org.apache.logging.log4j.util.PropertiesUtil.log4j_PROPERTIES_FILE_NAME
中看到文件名。这非常有用。谢谢,你知道如何回复log4j文档吗?如果我有这方面的信息,可能会节省我几个小时的搜索时间。