如何指定 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 配置位置?的主要内容,如果未能解决你的问题,请参考以下文章

log4j输出文件位置

log4j2配置文件log4j2.xml配置详解

聊一聊log4j2配置文件log4j2.xml

Log4j rootLogger配置

log4j2配置详解

log4j在java的web项目中怎么用的,如何配置等等。。