Я пытаюсь создать функцию ведения журнала, используя logback-spring.xml в моем приложении Springboot, но не могу прочитать значения свойств (например, log.dest.path) в logback-spring.xmlfile.
Подход, который я пробовал:
Я динамически загружаю файл свойств (YAML) для различных сред (dev, stage, prod) на основе профилей через @ PropertySource .Профилирование работает нормально, и загружается правильный файл YAML (например, - application.dev.yml)
logback-spring.xml:
<configuration debug="true">
<property name="PROFILE" value="-${spring.profiles.active}" />
<timestamp key="timestamp" datePattern="yyyy-MM-dd" />
<springProperty scope="context" name="destination"
source="log.dest.path" />
<springProperty name="fileName" scope="context"
source="spring.application.name" />
<springProfile name="dev">
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>${destination}/log${PROFILE}/${fileName}_${PROFILE}-${timestamp}.log</file>
<encoder>
<pattern>%date %level [%thread] %logger{10} [%file : %line] %msg%n</pattern>
</encoder>
</appender>
</springProfile>
<springProfile name="production">
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>${destination}/log${PROFILE}/${fileName}_${PROFILE}-${timestamp}.log</file>
<encoder>
<pattern>%date %level [%thread] %logger{10} [%file : %line] %msg%n</pattern>
</encoder>
</appender>
</springProfile>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%msg%n</pattern>
</encoder>
</appender>
<logger name="com.test" additivity="true">
<appender-ref ref="FILE" />
</logger>
<root level="debug">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
</root>
</configuration>
Файл конфигурации:
@Configuration
public class Config {
@Configuration
@Profile({ "dev", "default" })
@PropertySource(factory = YamlPropertySourceFactory.class, value = { "classpath:application.dev.yml" })
static class DevConfig {
}
@Configuration
@Profile("stage")
@PropertySource(factory = YamlPropertySourceFactory.class, value = { "file:////D://file//config.yml" })
static class StageConfig {
}
}
Я использовал подход @PropertySource для загрузки файлов proeprty, поскольку файлы свойств размещаются снаружи в одной из сред.
Когда приложение запускаетФайл журнала не создается по указанному пути, указанному в файле свойств, вместо этого в корневом каталоге проекта создается папка с destination_IS_UNDEFINED .
Но свойства среды отображаются ниже.код:
@SpringBootApplication
public class ProfileProject extends SpringBootServletInitializer {
public static void main(String[] args) {
ConfigurableApplicationContext configurableApplicationContext = new SpringApplicationBuilder(
ProfileProject.class).sources(ProfileProject.class).run(args);
ConfigurableEnvironment environment = configurableApplicationContext.getEnvironment();
System.out.println("Env variables Log Dest path ----> : " + environment.getProperty("log.dest.path"));
}
}
application.dev.yml: - образец
server:
port: 7999
app:
name: DEVELOPMENT
spring:
application:
name: ProfileDEV
log:
dest:
path: D:\development
logging:
config: classpath:logback-spring.xml
Подход Работал:
Естьвсе свойства уровня профиля для соответствующего файла yaml (например, -application. {env} .yml) и имеют файл application.properties, в который помещаются свойства, необходимые для logback-spring.xml.
Примечание: -
SpringBoot-ведение журнала, не ждет, пока @ProperySource завершит настройку.В результате файл свойств, загруженный с помощью этого подхода, не будет считываться logback-spring.xml, но будет читать application.properties.