是否可以根据我使用的弹簧引导配置文件加载不同的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);
}
}
例如,您一次只有一个活动配置文件。对于多个配置文件,我没有答案。