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

通过指定路径在运行时加载 log4j2.xml 或属性配置文件

邓俊材
2023-03-14

我试图从运行时提供的特定位置加载log4j2.xml或属性文件。这是从log4j 1.x到log4j 2.x版本迁移的一部分。我看到log4j2中的日志配置加载序列有很多变化。所以现在在搜索之后,我有下面的方法-

1 -

 Configurator.reconfigure(new URI("URI of your file"));

2 -

// import org.apache.logging.log4j.core.LoggerContext;
LoggerContext context = (org.apache.logging.log4j.core.LoggerContext) LogManager.getContext(false);
File file = new File("path/to/a/different/log4j2.xml");

// this will force a reconfiguration
context.setConfigLocation(file.toURI());

但他们说LoggerContext类不是公共API的一部分,现在仍然如此吗?

3-

InputStream inputStream = new FileInputStream("C:/path/to/log4j2.xml");
ConfigurationSource source = new ConfigurationSource(inputStream);
Configurator.initialize(null, source);

4-或者简单地说

Configurator.initialize(null, "/path/to/log4j2.xml");

我很困惑,如果所有这些都是可行的,或者将在不同的场景中使用,并有不同的结果。

我试图替换的功能还有DOMConfigurator和PropertyConfigurator。我知道log4j2会自动在类路径中查找配置,但如果我有多个不同环境等或场景的配置文件,或者配置文件在类路径之外,在系统的其他地方,我正在尝试使用上述函数来完成。请在我困在这里时提供帮助,谢谢。

共有1个答案

商棋
2023-03-14

如果没有LoggerContext调用者关联,则所有这些方法都具有相同的效果:它们创建LoggerContext并使用提供的配置源对其进行配置。

如果存在与调用方关联的LoggerContext,则这4种方法开始不同。如果之前调用了任何LogManagerget*方法(例如在静态初始值设定项中),就会发生这种情况。如果发生这种情况,前两个方法将替换该上下文的配置,而后两个方法没有操作。

Log4j 1.x中的PropertyConfiguratorDOMConfigurator的工作方式不同:除非使用Log4j.reset=true键,否则它们修改了先前的配置。尽管这两个类已移植到最新的log4j-1.2-api,但“重置”语义并未实现,它们的行为类似于Configurator.reconfigure限制为单一配置格式。

备注:< code > configurator . reconfigure 尝试猜测配置格式以选择适当的< code > configuration factory 。因为Log4j 2.x和Log4j 1.x都具有属性和XML格式,所以所有属性和XML文件都将被解释为本地Log4j 2配置文件。查看此问题以获得解决方法。

 类似资料:
  • 我试图使用嵌入Java应用程序中的Log4j2的XML配置文件,但该文件不起作用。 代码: 错误: 线程“main”java中出现异常。lang.ClassCastException:org。阿帕奇。登录中。log4j。果心配置。无法将XMLConfiguration转换为组织。阿帕奇。登录中。log4j。果心配置。中的配置工厂。枪战。发射前。服务器主要的main(main.java:62)

  • 应用程序的标准文件包括一个配置时属性 然后在追加器中引用。到目前为止效果很好。 我需要得到这个属性的值,这个值在编译时是未知的,甚至不能保证在运行时被定义。 如果定义了“log-path”属性,我需要从某个工具中获取该属性。否则,null是一个很好的返回值。 我怎样才能完成这项任务?

  • 我刚刚使用一个xml配置文件将log4j转换为log4j2。一切正常,只是我似乎无法使用属性文件设置日志文件的路径。 这是一个Spring MVC应用程序,我有一个文件,位于文件夹中,以及log4j2.xml,i18n消息和其他属性文件。它有一个简单的条目:。我看过其他帖子,只是不知道如何正确配置log4j2。这是我所拥有的: 错误是: 替换实际路径有效,例如。, <代码> 我被捆绑语法的正确域部

  • 我已经将log4j从1.2.17升级到了2.16.0。因此我不得不重写我的log4j。并将其重命名为log4j2.xml。我已经做了必要的改变。然而,我的新配置似乎没有加载。我试图通过两个web配置log4j。xml: 和。两种方法都失败了,我在mylog.log文件中没有任何日志。但是当在本地运行应用程序时,控制台会显示日志。 这是我的log4j2.xml: 我尝试使用以下工具调试log4j配置

  • 我想使用新的log4j2-Java日志框架。一切正常,但我从一小时后就尝试加载一个自定义配置文件来配置日志记录(如日志级别)。 这是我的log4j2.xml: 我尝试了以下方法,但没有任何效果: 移动log4j2.xml文件,使其位于默认包中。 将log4j2.xml文件移动到项目中的任意位置 将log4j2.xml文件命名为log4j.xml 在项目中创建一个文件夹,将log4j2.xml文件放

  • 我拥有一个spring应用程序,希望在应用程序启动期间动态添加骆驼路由。endpoint在属性文件中配置,并在运行时加载。使用Java DSL,我使用for循环创建所有路由, 无法创建路由file_routeDirect:在:at:>>>onException[[class org.apache.camel.component.file.GenericFileOperationFailedExce

  • 在我的spring boot 2应用程序中,我有一个应用程序。yml as, 我的配置类是, 代码在本地计算机中运行良好,所有值都按预期加载。但cloud env Consor将yml文件序列化为环境变量,因此我的配置表示为, 这是一个字符串。我不知道Consor以何种格式表示/序列化值。现在我的DefaultRateLimitsConfig无法加载,因为它会出错, 如何以更干净的方式在两个环境中

  • 问题内容: 我的Java应用程序有问题,特别是从计算机中的某个位置加载图像时。 在这篇文章之后,我使用和来在计算机上加载图像。首先,我将图片()放入源代码中,并且可以正常工作。但是,如果我将图像放到另一个地方(比如说),Java IDE会向我显示一个 这是代码: 问题答案: &不适用于文件路径,但适用于相对于代码库的路径。如果代码库为,则可以找到资源的相对路径为。 通过加载文件之间..differ