首页 文章

Spring Boot程序化日志记录配置

提问于
浏览
12

如何在spring启动应用程序中配置日志 programmatically

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

Update: 我想实现这样的目标:

@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 = [INFO,DEBUG,..]

  • logging.level.myApp = [INFO,DEBUG,..]

  • logging.file = [true |假]

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

在一天结束时,这实际上是为了实现与Spring JavaConfig对bean一样的日志记录灵活性 . XML或其他文件格式过于静态,需要过多的重复,并且与应用程序的其余配置集成得不够好 .

Why should logging be configured differently than any other bean or service? 这没有任何意义 .

1 回答

  • 15

    我不确定您是否需要或需要禁用日志记录系统的默认XML配置,但您确实希望在完成后执行自定义调用 . 幸运的是's pretty easy as it'在初始化链中尽早完成 SpringApplication . 放置代码的最简单的地方可能是 SpringApplicationInitializer (它必须实现 ApplicationContextInitializer ,因此它可以添加到 SpringApplication ) . 例如 .

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

    如果以这种方式执行,您将无法在初始化程序中执行依赖项注入,但它将确保在生命周期中尽早调用它 . 如果初始化程序实现 EnvironmentAware ,那么在调用 SpringApplicationInitializer.initialize() 之前,您还将传递 Environment 的实例 - 使用它可以解析样本中与环境相关的部分,例如:

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

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

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

    如果你真的需要依赖注入和 @Value resolution我认为你必须接受 ApplicationContext 会在你有机会配置之前完全刷新 . 如果这是一个可接受的折衷方案,我建议您只在您的上下文中添加 LoggingInitializer 并让它实现 CommandLineRunner .

相关问题