gpt4 book ai didi

java - Spring Boot 程序化日志记录配置

转载 作者:搜寻专家 更新时间:2023-10-30 19:57:16 24 4
gpt4 key购买 nike

如何在 spring boot 应用程序中以编程方式配置日志记录?

使用 xml 或属性文件不够灵活,无法满足我的需求。

更新:我想实现这样的目标:

@Value("${logging.level.root}")
private String loggingLevelRoot;

@Value("${logging.level.myApp}")
private String loggingLevelMyApp;

@Value("${logging.file}")
private boolean fileAppenderEnabled;

....

setLevel(Logger.ROOT_LOGGER_NAME, Level.toLevel(loggingLevelRoot)));
setLevel("com.myapp", Level.toLevel(loggingLevelMyApp)));
setLevel("org.springframework", Level.WARN);
setLevel("org.apache.coyote", Level.INFO);
setLevel("org.apache.catalina", Level.INFO);
setLevel("org.apache.catalina.startup.DigesterFactory", Level.ERROR);
setLevel("org.apache.catalina.util.LifecycleMBeanBase", Level.ERROR);

Logger logger = (Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
logger.addAppender(createConsoleAppender());
if (fileAppenderEnabled) {
logger.addAppender(createFileAppender());
}

我在每个环境中拥有的是:

  • logging.level.root=[信息,调试,..]
  • logging.level.myApp=[信息,调试,..]
  • logging.file=[真 |假]

没有重复的 XML、Groovy 和其他我真的不想处理的格式。

归根结底,这实际上是为了实现与 Spring JavaConfig 为 bean 所做的相同的日志记录灵 active 。 XML 或其他文件格式过于静态,需要太多重复,并且与应用程序的其余配置集成得不够好。

为什么日志记录的配置应该与任何其他 bean 或服务不同?这没有意义。

最佳答案

我不确定您想要或需要禁用日志系统的默认 XML 配置,但您确实希望在完成后执行您的自定义调用。幸运的是,这很容易,因为它已在 SpringApplication 的初始化程序链中尽早完成。放置代码最简单的地方可能是 SpringApplicationInitializer(它还必须实现 ApplicationContextInitializer,以便可以将其添加到 SpringApplication)。例如

SpringApplication application = new SpringApplication(MySources.class);
application.addInitializers(new LoggingInitializer());
application.run(args);

如果你那样做,你将无法对初始化器进行依赖注入(inject),但它会确保它在生命周期中尽早被调用。如果您的初始化程序实现了 EnvironmentAware,那么在调用 SpringApplicationInitializer.initialize() 之前,您还将获得一个 Environment 的实例 - 使用它您可以解决样本中与环境相关的部分,例如

String loggingLevelRoot = environment.getProperty("logging.level.root");

一旦你让它工作,为了避免必须对所有应用程序做同样的事情,你可以通过添加一个包含你的初始化类的 META-INF/spring.factories 来声明它:

org.springframework.context.ApplicationContextInitializer=\
my.pkg.for.LoggingInitializer

如果你真的需要依赖注入(inject)和@Value解析,我认为你将不得不接受ApplicationContext在你有机会配置之前已经完全刷新任何事物。如果这是一个可以接受的折衷方案,我建议只向您的上下文添加一个 LoggingInitializer 并让它实现 CommandLineRunner

关于java - Spring Boot 程序化日志记录配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20507341/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com