Spring Profiles,不同的Log4j2配置

20

在我的application.yml文件中,我有:

logging: 
  config: classpath:log4j2.debug.yml

还有一些其他的不同配置。当我启动应用程序时,我会看到以下信息:

ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging only errors to the console.
如果我把log4j2.xml放在配置文件旁边,它就能正常工作。所以我认为这是我缺少依赖项或者log4j2不支持这样的操作?
参考:Boot Logging Level说像我尝试的这样做应该是可能的?
6个回答

48

在我的项目中,我使用属性文件而不是yaml文件。我想要两个日志文件:一个将所有内容记录到控制台,另一个则记录在文件中。因此,我创建了两个log4j2配置文件:log4j2-dev.xml和log4j2-file.xml。

我使用了两个Spring配置文件:默认配置文件和一个名为“dev”的配置文件。为了切换log4j2配置文件,我创建了一个名为application.properties的文件,其中包含:

spring.profiles.active=
logging.config=classpath:log4j2-file.xml

我还有另一个属性文件,名为application-dev.properties,当Spring检测到"dev"配置文件时会自动激活它。它包含以下内容:

logging.config=classpath:log4j2-dev.xml
当我想要使用log4j2-dev.xml配置文件时,我只需要将"dev"添加为"spring.profiles.active="的值在application.properties中。 您可以查看Feiyu Zhou在此页面上提供的答案。他提出了一种使用Yaml配置文件的解决方案:如何通过application.properties定义log4j2路径? 当然,您也可以删除application.properties的logging.config属性,并将log4j2-file.xml重命名为log4j2.xml。这样Log4j2将默认加载该文件,无需通过Spring配置文件来触发。

这并没有回答问题,它只提供了一种替代的配置设置。-1 - Edwin Diaz

6
作为使用Spring配置文件的替代方案(需要您明确设置哪些配置文件处于活动状态),您可以使用Maven构建配置文件来在log4j2配置文件之间切换。 application.yml
logging:
    config: classpath:${log4j2.config}

pom.xml

<project>
    <properties>
        <log4j2.config>log4j2.xml</log4j2.config>
    </properties>
    <profiles>
        <profile>
            <id>local</id>
            <properties>
                <log4j2.config>log4j2-local.xml</log4j2.config>
            </properties>
        </profile>
    </profiles>
</project>

这样一来,一个默认的log4j配置文件(log4j2.xml)可用于正常的构建。

当项目使用local构建配置文件(例如mvn package -Plocal)时,可以使用第二个配置文件(log4j2-local.xml)进行本地开发/测试。


4
这是适用于Spring Boot 2和log4j2.xml的解决方案,确保您拥有像application-local.properties、application-dev.properties这样针对不同环境和配置文件的文件。
永远不要将log4j2.xml保存在src/main/resources文件夹中,而应该保存在创建在src/main/resources下的特定于配置文件夹中,例如src/main/resources/local、src/main/resources/dev等。然后进行如下配置: 在application-local.properties中添加logging.config: classpath:local/log4j2.xml, 在application-dev.properties中添加logging.config: classpath:dev/log4j2.xml。
同时在每个文件夹中都要保留一个名称相同的log4j2.xml文件,并且再次强调,永远不要将其放在src/main/resources下,因为应用程序会默认选择它,而我们不希望这样。在每个xml文件中使用不同的配置以适应不同的环境,然后使用提供的配置参数运行Spring Boot即可。

env specific properties entry

run application for the env or profile needed

然后,您可以根据以下环境修改日志文件路径...

    <RollingFile name="RollingFileAppender" fileName="c:\\logs\\logs_test\\og4j2-demo.log"  filePattern="c:\\logs\\logs_test\\log4j2-demo-%d{yyyy-MM-dd}-%i.log"> 

4
请参阅Log4j 2配置手册页
Log4j2首先尝试在类路径中查找名为log4j2-test.yaml的文件,然后依次查找JSON和XML文件,最后会查找名为log4j2.yml的文件。您还可以明确指定配置文件位置。

0

您的 application.yml 看起来配置正确。可能问题出在您需要将 jackson-databind 和 jackson-dataformat-yaml 这两个依赖项添加到您的 pom 文件中,以便使用 log4j2.yml。

如果您已经有了 spring-boot-starter-web,那么 jackson-databind 已经被导入,您只需要添加 jackson-dataformat-yaml:

<dependencies>
  <!-- not needed if you have spring-boot-starter-web in the classpath -->
  <dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
  </dependency>

  <dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-yaml</artifactId>
  </dependency>
</dependencies>

0

我使用XML文件配置log4j2。对我有效的方法是添加一个带有@PostConstruct方法的@Component,在该方法中重新配置日志记录:

LoggerContext context = (LoggerContext)LogManager.getContext(false);
context.setConfigLocation(URI.create("path to file"));
context.reconfigure();

文件路径类似于 classpath:log4j2-(插入 Spring 环境配置).xml。为此,我必须排除 spring-boot-starter-logging 并改为包含 spring-boot-starter-log4j2。我花了很长时间尝试让这个 log4j2 配置工作,希望这会帮助其他人。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接