Spring Profiles,不同的Log4j2配置

时间:2016-02-22 17:17:56

标签: spring spring-boot log4j2

在我的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 个答案:

答案 0 :(得分:15)

就我而言,我使用的是属性文件而不是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配置时,我只需在application.properties中添加“dev”作为“spring.profiles.active =”的值。

您可以在此页面查看Feiyu Zhou的回答。他使用Yaml配置文件提出了一个解决方案:How to define log4j2 path by application.properties?

当然,您可以随时删除application.properties的属性logging.config,并在log4j2.xml中重命名log4j2-file.xml。它将默认由Log4j2加载,而不需要由Spring配置文件触发

答案 1 :(得分:2)

另请参阅Log4j 2 Configuration manual page

Log4j2将首先尝试在类路径中查找名为log4j2-test.yaml的文件,然后在JSON和XML中查找相同的文件,最后将在类路径中查找名为log4j2.yml的文件。

您还可以显式指定配置文件位置。

答案 2 :(得分:2)

作为使用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)就可用于本地开发/测试。

答案 3 :(得分:1)

以下是适用于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等... 然后像这样输入 logging.config:application-local.properties中的classpath:local / log4j2.xml 和 logging.config:application-dev.properties中的classpath:dev / log4j2.xml

还将log4j2.xml保留在每个具有相同文件名log4j2.xml的文件夹中,并且再也不要将其保留在src / main / resources下,因为应用程序默认会选择我们不想要的文件。如果这些特定于您的环境的xml不同,则每种配置都有不同的配置,并且应该可以使用。.还请使用提供的profile参数运行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 :(得分: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>

答案 5 :(得分:0)

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

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

其中文件的路径类似于classpath:log4j2-(insert spring profile here).xml。为此,我必须排除spring-boot-starter-logging并包括spring-boot-starter-log4j2。我花了很长时间尝试使此log4j2配置正常工作,所以也许这会对其他人有所帮助。