如何指定 Log4J 2.x 配置位置?
Posted
技术标签:
【中文标题】如何指定 Log4J 2.x 配置位置?【英文标题】:How to specify Log4J 2.x config location? 【发布时间】:2013-05-18 23:14:03 【问题描述】:有没有办法手动指定 Log4J 2.x log4j2.xml
文件位置(如 Log4J 1.x 中的 DOMConfigurator
),而不会弄乱类路径和系统属性?
【问题讨论】:
您可以为此目的使用 log4j2.component.properties。简短说明here 【参考方案1】:您可以在org.apache.logging.log4j.core.config.Configurator
中使用静态方法#initialize(String contextName, ClassLoader loader, String configLocation)
(参见源代码here)。
(您可以为类加载器传递 null。)
请注意,此类不是公共 API 的一部分,因此您的代码可能会因任何次要版本而中断。
为了完整起见,您还可以使用此系统属性指定配置文件的位置:
-Dlog4j.configurationFile=path/to/log4j2.xml
【讨论】:
这不是一个简单的方法,因为配置器(和其他)可以扩展(logging.apache.org/log4j/2.0/manual/extending.html) 在我的项目中我在哪里调用Configurator.initialize()
?我问它是因为我在静态块中执行此操作,并且 Log4j 正在记录它在我的代码运行之前没有找到该文件。【参考方案2】:
使用 LoggerContext 允许setConfigLocation。
File f = new File(this.logConfigFile);
URI fc = f.toURI();
System.out.println("Loading logging config file: " + fc);
Logger l = (Logger) LogManager.getLogger(LogManager.ROOT_LOGGER_NAME);
l.getContext().setConfigLocation(fc);
或者
LoggerContext.getContext().setConfigLocation(java.net.URI);
【讨论】:
【参考方案3】:你也可以像下面这样初始化
ConfigurationSource source = new ConfigurationSource(new FileInputStream(log4j file Path));
XmlConfiguration xmlConfig = new XmlConfiguration(source);
Logger logger = (Logger) LogManager.getLogger();
logger.getContext().start(xmlConfig);
在每个类中,您可以获得如下记录器实例
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
private final Logger logger = LogManager.getLogger(ABC.class);
【讨论】:
org.apache.logging.log4j.Logger 没有 getContext() 方法。【参考方案4】:在 Windows 中,请注意您需要使用带有 log4j.configurationFile
属性的 URI
-Dlog4j.configurationFile=file://C:\path\to\log4j2.xml
【讨论】:
我相信系统属性接受普通文件路径(相对或绝对)以及 URI。 它不起作用。我得到 ERROR StatusLogger No log4j2 configuration file found。使用默认配置:仅将错误记录到控制台。将系统属性 'org.apache.logging.log4j.simplelog.StatusLogger.level' 设置为 TRACE 以显示 Log4j2 内部初始化日志记录。 我使用了“C:\\Users\\P....\\H............\\workspace\\P...... .....\\log4j2.properties”作为系统属性“log4j.configurationFile”的值,它工作正常。 Java 需要双反斜杠(在内部它们被转换为单反斜杠)。这些点实际上是路径中的正确字母。【参考方案5】:如果您使用的是 log4j2 并且属性在 log4j2.properties 文件中定义,请使用它。
-Dlog4j2.configurationFile=file:/home/atul/log4j2.properties
【讨论】:
是-Dlog4j2.conf..
还是-Dlog4j.conf..
就像其他评论所说的那样?
如果您使用的是 log4j2,那么我的回答会对您有所帮助。
似乎两种方式都可以为 log4j2 工作。【参考方案6】:
对于 log4j 版本 2.12.1,您可以找到如何重新配置 log4j2 here。
下面是一个例子
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.LoggerContext;
File file = new File("C:\\Path for Windows OS\\yourConfig.xml");
LoggerContext context = (LoggerContext) LogManager.getContext(false);
context.setConfigLocation(file.toURI());
Logger log = LogManager.getLogger(YourClass.class);
在我看来,配置 log4j2 的方式正在随着新版本的变化而变化,所以你应该意识到这一点。
【讨论】:
【参考方案7】:步骤:1 - 准备好带有附加程序详细信息的 log4J.xml 文件(主要在资源文件夹下)
步骤:2 - 应将以下代码添加到配置类(在以前的 log4J 中,我们有 PropertyConfigurator,现在我们需要使用 LoggerContext)
String log4JFilePath = "file path of your log4J.xml file";
LoggerContext loggerContext = (LoggerContext)LoggerManager.getContext(false);
File file = new File(log4JFilePath);
loggerContext.setConfigLocation(file.toURI());
步骤:3 - 添加以下行以在任何类中使用记录器
private static final Logger logger = LogManager.getLogger(yourClassName.class);
logger.info("log here");
【讨论】:
【参考方案8】:import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.config.Configurator;
public class Foo
public static void main(String[] args)
Configurator.initialize(null, "src/main/config/log4j2.xml"); //path specify
Logger logger = LogManager.getLogger(APITestToolMain.class);
logger.info("working");
资源:https://www.baeldung.com/spring-boot-change-log4j2-location
【讨论】:
以上是关于如何指定 Log4J 2.x 配置位置?的主要内容,如果未能解决你的问题,请参考以下文章