Spring Boot and Log4j



是否可以根据我使用的弹簧引导配置文件加载不同的log4j配置。

假设我在应用程序中有。属性

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

应用程序实时属性中,我对所有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。

您可以根据环境使用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一样构建,我从这里开始,并在这里阅读以获取更多信息。

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

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);
        }
    }

例如,您一次只有一个活动配置文件。对于多个配置文件,我没有答案。

最新更新