【问题标题】:Spring Boot and Log4jSpring Boot 和 Log4j
【发布时间】:2015-11-25 10:59:33
【问题描述】:

是否可以根据我使用的 Spring Boot 配置文件加载不同的 log4j 配置。

假设我在 application.properties

log.level=DEBUG
log.path=/opt/tomcat/logs/blabla.log
log.appender=CONSOLE

application-live.properties 我对所有 3 个都有不同的值

log.level=WARN
log.path=/crazy/tomcat/logs/blabla.log
log.appender=FILE

log4j.xml 我有 CONSOLE appender、FILE appender 和多个记录器的定义

<appender name="FILE" class="org.apache.log4j.RollingFileAppender">
        <param name="File" value="${log.path}" />
        <param name="maxFileSize" value="8MB"/>
        <param name="maxBackupIndex" value="50"/>
        <param name="Append" value="true"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d{MM-dd HH:mm:ss} [${project.artifactId}-${project.version}] %p [SearchID - %X{searchID}] %c{1}.%M(%L) %m%n" />
        </layout>
    </appender>
<appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
        <param name="Target" value="System.out" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d{MM-dd HH:mm:ss} [${project.artifactId}-${project.version}] %p [SearchID - %X{searchID}] %c{1}.%M(%L) %m%n" />
        </layout>
    </appender>

<logger name="com.mchange" >
        <level value="${log.level}" />
        <appender-ref ref="${log.appender}" />
    </logger>

    <logger name="java.sql" >
        <level value="${log.level}" />
        <appender-ref ref="${log.appender}" />
    </logger>

    <logger name="org.springframework">
        <level value="${log.level}" />
        <appender-ref ref="${log.appender}"/>
    </logger>
<root>
        <level value="${log.level}"/>
        <appender-ref ref="${log.appender}"/>
    </root>

所以我必须在 log4j.xml 的不同位置注入所有 3 个值 此配置现在不起作用,因为当我使用 -Dlog4j.debug 检查发生了什么时,我看到属性的所有值都丢失了,就像它们不是从 加载的一样加载 log4j 配置时的 application.properties。有没有办法做到这一点。我已经阅读了所有 spring-boot 文档,因为我可以看到没有示例同时使用应用程序属性和我需要的 log4j 等显式日志配置。我还需要补充一点,我不能使用 logback 代替 log4j。

【问题讨论】:

  • 你应该考虑切换到 logback 或 log4j2

标签: spring-boot log4j java-8


【解决方案1】:

您可以根据环境使用src/main/environment 中的单独文件夹进行不同的配置。

那么如果你使用gradle这样构建,

./gradlew build -Penv=prod

然后,要捕获环境,请将以下内容添加到您的 build.gradle

 project.ext {
 environment = "dev"
 }

 loadConfiguration()

 def loadConfiguration() {
    project.environment = hasProperty('env') ? env : 'dev'
 }

然后在构建时使用以下命令复制配置。 (将其移动到名为 copy.gradle 的单独文件中,并在构建文件的顶部使用 apply from: 'copy.gradle'),

task copyConfiguration << {
println "Target environment: $environment"
  copy {
    from "src/main/environment/$project.environment"
    into "src/main/resources"
    include "*/"
  }
}

对于maven,这似乎比gradle 容易,

<profiles>
<profile>
    <id>dev</id>
    <activation>
        <activeByDefault>true</activeByDefault>
    </activation>
    <build>
        <resources>
            <resource>
                <directory>src/main/resources/dev</directory>
            </resource>
        </resources>
    </build>
</profile>
<profile>
    <id>prod</id>
    <build>
        <resources>
            <resource>
                <directory>src/main/resources/prod</directory>
            </resource>
        </resources>
    </build>
</profile>
</profiles>

并像 mvn install -Pdev 一样构建,我从 here 获取它,并阅读 here 了解更多信息。

【讨论】:

  • 我应该补充说我使用 MAVEN 进行构建。
  • 你可以用 maven 做同样的事情,但我现在没有任何代码
  • 谢谢@Maleenc 我明白你的回答知道,在我们切换到spring-boot之前,我们曾经有这些maven配置文件。尽管我确实找到了类似的东西,但我部署了 WAR 并在命令行中添加了 -Dlogging.config=classpath:log4j-local.xml ,这样我可以选择在部署时使用哪个 log4j 配置,但我需要在它适用于 Level、Path、Appender 等属性...我猜是这样的
  • 如果您能评价或接受我的回答,我将不胜感激。
【解决方案2】:

我已经设法用多个 log4j.xml 文件实现了所需的实现,每个配置文件都有一个(log4j-dev.xml、log4j-loca.xml 等) 并使用我根据here 给出的答案实现的自定义 LoggingApplicationListener。 我从 Spring 的 LoggingApplicationListener 复制了大部分代码,修改了链接中答案中的方法的更改,并重构了方法

private void initializeSystem(ConfigurableEnvironment environment, LoggingSystem system) {
        LogFile logFile = LogFile.get(environment);
        String activeProfile = environment.getActiveProfiles()[0];
        String logConfig = "classpath:log4j-" + activeProfile + ".xml";
        if(StringUtils.hasLength(logConfig)) {
            try {
                ResourceUtils.getURL(logConfig).openStream().close();
                system.initialize(logConfig, logFile);
            } catch (Exception var6) {
                this.logger.warn("Logging environment value \'" + logConfig + "\' cannot be opened and will be ignored " + "(using default location instead)");
                system.initialize((String)null, logFile);
            }
        } else {
            system.initialize((String)null, logFile);
        }

    }

例如,您一次只有一个有效的个人资料。对于多个配置文件,我没有答案。

【讨论】:

    猜你喜欢
    • 2023-04-05
    • 2015-06-24
    • 2017-01-17
    • 1970-01-01
    • 2015-11-28
    • 2020-02-21
    • 2016-04-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多