Axe*_*ine 13 java logging spring-boot
如何在Spring启动应用程序中以编程方式配置日志记录?
使用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());
}
Run Code Online (Sandbox Code Playgroud)
我所拥有的每个环境都是:
没有重复的XML,Groovy和其他格式我真的不想处理.
在一天结束时,这实际上是为了实现与Spring JavaConfig对bean一样的日志记录灵活性.XML或其他文件格式过于静态,需要过多的重复,并且与应用程序的其余配置集成得不够好.
为什么日志记录的配置不同于任何其他bean或服务?这没有道理.
Dav*_*yer 18
我不确定您是否需要或需要禁用日志记录系统的默认XML配置,但您确实希望在完成后执行自定义调用.幸运的是,这很简单,因为它在初始化链中尽早完成SpringApplication.放置代码的最简单的地方可能是SpringApplicationInitializer(它必须实现ApplicationContextInitializer,因此可以添加到SpringApplication).例如
SpringApplication application = new SpringApplication(MySources.class);
application.addInitializers(new LoggingInitializer());
application.run(args);
Run Code Online (Sandbox Code Playgroud)
如果以这种方式执行,您将无法在初始化程序中执行依赖项注入,但它将确保在生命周期中尽早调用它.如果您的初始化程序实现了,EnvironmentAware那么您也将Environment在调用之前传递一个实例SpringApplicationInitializer.initialize()- 使用它可以解析样本中依赖于环境的部分,例如
String loggingLevelRoot = environment.getProperty("logging.level.root");
Run Code Online (Sandbox Code Playgroud)
一旦你有了它的工作,为了避免为所有应用程序做同样的事情,你可以通过添加一个META-INF/spring.factories包含你的初始化程序类来声明它:
org.springframework.context.ApplicationContextInitializer=\
my.pkg.for.LoggingInitializer
Run Code Online (Sandbox Code Playgroud)
如果你真的需要依赖注入和@Value解析,我认为你必须接受ApplicationContext在你有机会配置任何东西之前已经完全刷新了.如果这是一个可接受的折衷方案,我建议您只需LoggingInitializer在上下文中添加一个并实现它CommandLineRunner.