如何在Java Spring引导中更改log4j2.xml的默认位置?

如何在Java Spring引导中更改log4j2.xml的默认位置?,java,log4j,spring-boot,log4j2,Java,Log4j,Spring Boot,Log4j2,Log4j2通过根类路径中的Log4j2.xml配置文件与Spring Boot很好地协同工作,正如文档所述 但是,当尝试将此文件移动到其他位置时,我无法在启动时将新位置传递给Spring。发件人: 各种记录系统可通过以下方式激活: 类路径上的适当库,并通过 在类路径的根目录中提供合适的配置文件, 或位于Spring环境属性指定的位置 logging.config 我尝试使用Java系统属性设置新位置 java -jar -Dlogging.config="classpath:/config/l

Log4j2通过根类路径中的
Log4j2.xml
配置文件与Spring Boot很好地协同工作,正如文档所述

但是,当尝试将此文件移动到其他位置时,我无法在启动时将新位置传递给Spring。发件人:

各种记录系统可通过以下方式激活: 类路径上的适当库,并通过 在类路径的根目录中提供合适的配置文件, 或位于Spring环境属性指定的位置
logging.config

我尝试使用Java系统属性设置新位置

java -jar -Dlogging.config="classpath:/config/log4j2.xml" target/app.jar
或者使用包含相关属性的外部
应用程序.properties

logging.config=classpath:/config/log4j2.xml
但我经常收到以下错误消息

ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging only errors to the console.
如中所述,无法在应用程序属性中设置
logging.config
属性,因为它们是在日志记录已初始化之后读取的

解决方案是通过以下方式提供外部日志记录配置的路径:

java -Dlogging.config='/path/to/log4j2.xml' -jar app-current.jar
这个问题的答案绝对正确

我需要将配置放在类路径之外,我不想将配置文件作为参数传递。因此,我在类路径资源中设置了一个非常简单的日志配置,并让spring boot应用程序在启动时重新配置日志,如下所示:

@SpringBootApplication
public class Application implements CommandLineRunner {
    public static void main(String[] args) throws Exception {
        SpringApplication.run(Application.class, args);
    }

    @Override
    public void run(String... param) throws UnsupportedEncodingException {
        Configurator.initialize(null, "config/log4j2.xml");
        // ...
    }
}

这种方法有一个明显的缺点:整个应用程序启动过程不会作为外部配置记录。但一旦自定义代码运行,记录器就会按预期工作。虽然您可能不知道,但我发现这是一个折衷方案,我可以接受。

我的项目中也有同样的问题,除了log4j2.xml之外,我还需要类路径中的其他配置文件。 以下是我的两个行之有效的解决方案:

解决方案1:使用org.springframework.boot.loader.JarLauncher启动spring引导应用程序

java -classpath SpringBootProject.jar;./config org.springframework.boot.loader.JarLauncher
解决方案2:在jar的MANIFEST.MF中编写一个“./config”类路径条目

    <build>
    <plugins>
      <plugin>
        <artifactId>maven-jar-plugin</artifactId>
        <configuration>
          <archive>
            <manifestEntries>
               <Class-Path>./config/</Class-Path>
            </manifestEntries>
          </archive>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <version>1.5.3.RELEASE</version>
        <executions>
          <execution>
            <goals>
              <goal>repackage</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

maven jar插件
/配置/
org.springframework.boot
springbootmaven插件
1.5.3.1发布
重新包装

我有一个工作解决方案,可以为日志文件设置自定义路径或更改现有文件路径。如果您已经配置了log4j2.xml文件,请打开它,查看您必须在哪里对配置日志文件路径进行一行更改。

对于属性文件:

java-Dlog4j.configuration=file:/path/to/log4j.properties-jarapp.jar


到命令行在SpringBoot2中工作。不要忘记在路径之前添加文件:

如log4j2文档中所述,您可以在资源文件夹(或类路径中的任何位置)中包含名为
log4j2.component.properties的文件,在该文件中,您可以提供文件位置的名称(或新文件名),如下所示:

log4j.configurationFile=path/to/log4j2.xml

您也可以通过前面提到的
web.xml
context param
字段提供配置文件位置,但我还没有尝试过这个选项


(这也适用于Spring Boot)

请确认类路径中是否有
/config
?如果您使用的是基于maven的项目,请将xml文件放在
src/main/resources
config
文件夹(包)位于类路径中,并且它已经包含
application.yml
,这是正确的,并成功地在应用程序中使用。请您将xml文件放在
src/main/resources
中,然后尝试缩小问题的范围。如果我将xml文件放在正确的位置,即类路径根(
src/main/java
),它就可以正常工作。通过将XML放入
src/main/resources
文件夹,我没有得到我们应该检查的内容。我想要做的是将log4j2.xml文件放在我想要的任何地方。因为当您将它放在
src/main/java
中时,它工作正常,这意味着配置没有问题。如果希望它在不考虑
log4j2.xml
位置的情况下工作,则必须确保文件夹位于类路径中。如果您使用的是eclipse,
右键单击项目->构建路径->配置构建路径
以设置类路径。下面我介绍的另一个解决方案是通过log4j2.component.properties文件,它不需要通过系统属性或命令行参数提供配置文件名。这并没有回答问题。问题是询问log4j配置文件(log4j.xml)的位置,而不是向其写入日志语句的文件
log4j.configurationFile=classpath:log4j2-custom.xml (if the file is on the classpath)