当前位置: 首页 > 知识库问答 >
问题:

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

劳麒
2023-03-14

我正在尝试在当前在自由配置文件服务器中运行的REST Web方法中设置异步日志记录(出于性能原因)。

为了做到这一点,我设置了以下属性:

System.setProperty("Log4jContextSelector", "org.apache.logging.log4j.core.async.AsyncLoggerContextSelector");

我的问题是,无论我在哪里这样做,有时它会工作并且日志记录非常快,有时则不会。

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

这些位置中没有一个能够始终如一地工作。

有人能为这种行为提供解释吗?如果可能的话,还有一种解决问题的建议方法。

编辑:在调用setProperty之前,log4j似乎正在初始化。所以我需要做的是通过自由配置文件设置属性。

共有3个答案

东郭自强
2023-03-14

显然,我需要在jvm中添加一行代码。选项文件

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

jvm.options文件位于此处:

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

可以使用以下链接找到该目录:

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

仉英朗
2023-03-14

我的问题是,无论我在哪里这样做,有时它会工作并且日志记录非常快,有时则不会。

在定义主切入点的类中的静态初始化块中添加该代码。

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规范,静态初始化按照声明的顺序进行。因此,系统。setProperty调用保证在Log4j初始化之前发生。

公羊渝
2023-03-14

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

添加名为log4j2的文件。组成部分属性。这可以在大多数maven或gradle项目中完成,方法是将其保存在src/main/resources中。

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

Log4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector

Log4j将首先尝试读取系统属性。如果系统属性为null,则默认情况下,它将返回到此文件中存储的值。

执行此设置的代码位于Log4jContextFactory。爪哇:91。

 类似资料:
  • 根据Log4j 2手册: LoggerConfig(包括根LoggerConfig)可以配置属性,这些属性将添加到从ThreadContextMap复制的属性中。这些属性可以从应用程序、筛选器、布局等中引用,就像它们是线程上下文映射的一部分一样。 但是,我找不到怎么做。我尝试了以下方法: 使用此配置,ThreadContextMap将不会有任何“关注”键,并且状态记录器将输出: 尝试将属性属性属性

  • 我想让一些记录器异步在log4j2.properties文件。在xml格式中,您可以添加为 我在log4j2中试过了。作为记录器的属性=com foo Bar 但这种语法似乎是错误的。 正确的配置方法是什么?

  • 如何在JMeter 4.0中禁用日志记录。在执行任何JMeter脚本时,都需要根据定义的日志级别生成日志。 log4j2 中的配置应该是什么.xml,以便它不会生成任何日志?

  • 您好,我最近在spring项目中将日志记录从log4j迁移到了log4j2。 一切正常,但我想知道如何设置属性

  • 我正在以JAR的形式运行Spring Boot应用程序。 下面是示例log4j2.xml配置文件 Spring boot应用程序正在创建${sys:logs.location}文件夹,而不是正确地从jvm参数解析系统属性。 我正在使用log4j2-spring.xml配置log4j2。 我已经查看了StackOverflow Q。此答案读取properties Bundle。但我想读取sys属性

  • 假设我们构建了一个JavaSDK,不同的项目可以通过将其添加为类路径中的jar或添加为mavenpom.xml或gradle文件中的依赖项来使用它。当其他项目使用该库时,SDK中的日志在运行时不可见。我尝试使用SL4J,当其他项目使用它时,没有一个日志在运行时可见。我应该用log4j2吗?如果是,我应该在我的SDK中提供log4j配置 /properties文件吗?是否会在运行时从消费者库中提取属