如何在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());
}
我在每个环境中所拥有的是:
没有重复的XML,Groovy和其他我真的不想处理的格式。
归根结底,这实际上是要获得与Spring JavaConfig对bean相同的日志记录灵活性。XML或其他文件格式太静态了,需要太多的重复,并且与应用程序的其余配置集成得不够好。
为什么日志记录的配置与其他任何Bean或服务都不同?这没有道理。
我不确定您是否要禁用日志记录系统的默认XML配置,但是您确实想在完成后执行自定义调用。幸运的是,这很容易,因为它尽可能早地在的初始化程序链中完成SpringApplication
。放置代码最简单的地方可能是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
您在您的上下文中添加a并使其实现CommandLineRunner
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句