出于性能考虑,我试图在当前运行在自由配置文件服务器中的REST方法中设置异步日志记录。
为此,我设置了以下属性:
System.setProperty("Log4jContextSelector", "org.apache.logging.log4j.core.async.AsyncLoggerContextSelector");我的问题是,无论我在哪里这样做,有时它的工作和日志是非常快的,有时它没有。
我尝试过(a)类的构造函数,该类包含筛选器doFilter方法中的所有REST方法(b),这些方法在REST方法本身的REST方法(c)之前调用,过滤器init方法(d)在REST方法本身中调用。
这些地点中没有一个是一贯工作的。
有谁能解释一下这种行为,如果可能的话,提出解决问题的方法吗?
编辑:在调用log4j之前,似乎正在初始化setProperty。因此,我需要做的是通过自由配置文件设置属性。
发布于 2015-11-01 21:21:19
有一种无文档化的方法可以为项目设置此值,而不必在启动期间手动传递系统属性值。
将名为log4j2.component.properties的文件添加到类路径中。这可以在大多数maven或gradle项目中通过将其保存在src/main/resources中来完成。
这个文件就是简单的java.util.Properties文件。通过向文件中添加以下行来设置上下文选择器的值。
Log4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelectorLog4j将尝试先读取系统属性。如果系统属性为null,则默认情况下它将返回到存储在此文件中的值。
执行此设置的代码位于Log4jContextFactory.java:91。

发布于 2016-08-09 21:39:33
我的问题是,无论我在哪里这样做,有时它的工作和日志是非常快的,有时它没有。
在定义主入口点的类中的静态初始化器块中添加该代码。
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初始化之前发生。
发布于 2014-11-27 14:06:20
所以很显然我需要在jvm.options文件中添加一行
-DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelectorjvm.options文件位于以下位置:
${server.config.dir}/jvm.options通过使用以下链接可以找到该目录:
8.5.5%2F1-3-11-0-2-0
在我的例子中,它位于:C:\eclipse\运行时\usr\servers\serverName
https://stackoverflow.com/questions/27154558
复制相似问题