13

如何在 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=[信息,调试,..]
  • 日志记录文件=[真 | 错误的]

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

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

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

4

1 回答 1

19

我不确定您是否想要或需要禁用日志系统的默认 XML 配置,但您确实希望在完成执行自定义调用。幸运的是,这很容易,因为它在SpringApplication. 放置代码最简单的地方可能是 a SpringApplicationInitializer(它也必须实现ApplicationContextInitializer,以便可以添加到SpringApplication)。例如

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

如果这样做,您将无法将依赖项注入到初始化程序中,但它将确保在生命周期中尽早调用它。如果您的初始化程序实现EnvironmentAware,那么您还将Environment在调用之前传递一个实例SpringApplicationInitializer.initialize()- 使用它您可以解析示例中依赖于环境的部分,例如

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

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

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

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

于 2013-12-11T14:17:08.197 回答