Spring Boot 程序化日志配置

     2023-02-26     150

关键词:

【中文标题】Spring Boot 程序化日志配置【英文标题】:Spring Boot programmatic logging configuration 【发布时间】:2013-12-28 17:30:47 【问题描述】:

如何在 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=[INFO, DEBUG, ..] logging.file=[真 |假]

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

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

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

【问题讨论】:

什么是使用xml不够灵活?如果你使用 Logback,你可以使用 Groovy 来配置 logback。 @M.Deinum 不,你不能; Spring Boot(实际上,我认为是 Spring Autoconfig)踩踏了 Groovy 配置。 我还需要对每个环境进行不同的配置,使用不同的 appender 类型,......所以不,XML 不会削减它。 @chrylis logback.groovy 应该在 Spring Boot 中得到明确支持(至少从 M6 开始,也许在那之前我忘记了)。如果它不起作用我建议你在 github 中提出一个问题并解释一下。 @AxelFontaine 您可以为每个环境提供不同的 XML(或 groovy 或其他)配置,只需更改每个 Spring 配置文件的 logging.config(或仅作为启动时的系统属性)。这还不够灵活吗? 【参考方案1】:

我不确定您是否想要或需要禁用日志系统的默认 XML 配置,但您确实希望在完成之后执行自定义调用。。幸运的是,这很容易,因为它在 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 解析,我认为您将不得不接受ApplicationContext 将在您有机会配置任何内容之前完全刷新。如果这是一个可以接受的折衷方案,我建议在您的上下文中添加一个 LoggingInitializer 并让它实现 CommandLineRunner

【讨论】:

自定义的LoggingSystem 实现也可以完成这项工作,不是吗?但是它不会被自动检测到,所以你应该添加-Dorg.springframework.boot.logging.LoggingSystem=<class name>(或设置系统属性)。 @DaveSyer EnvironmentAware 在这种情况下不起作用。如果您需要 Environment 实例,那么最好从 initialize() 方法内的应用程序上下文实例中获取它。 我发现这种对替代策略的解释非常有帮助。我确实需要参考这个问题,以获取如何执行此处推荐的一些操作的示例:***.com/questions/46636599/…

spring-boot中如何配置tomcat访问日志的位置和名称?

】spring-boot中如何配置tomcat访问日志的位置和名称?【英文标题】:HowdoIconfigurethelocationandnameoftomcataccessloginspring-boot?【发布时间】:2015-04-1312:27:14【问题描述】:我有一个spring-boot应用程序,在application.yml中有以下配置server:contex... 查看详情

部署为 .war 时的 Spring-Boot 日志记录配置

】部署为.war时的Spring-Boot日志记录配置【英文标题】:Spring-BootLoggingconfigurationwhendeployedas.war【发布时间】:2014-10-1821:47:14【问题描述】:我有一个简单的spring-boot应用程序被打包为能够部署到外部Tomcat容器的.war文件。我在类路... 查看详情

Spring Boot 日志记录中的 ClassCastException

】SpringBoot日志记录中的ClassCastException【英文标题】:ClassCastExceptioninSpringBootLogging【发布时间】:2020-02-2719:48:42【问题描述】:我的应用程序启动时遇到问题。应用程序在配置日志级别时失败,出现ClassCastExceptionjava.util.HashMapcanno... 查看详情

spring-boot中logback日志配置

参考技术Aspring-boot为我们提供了非常多的组件,也让其使用起来越来越灵活易用。最近在优化程序日志输出部分,发现spring-boot在1.x中日志的配置还不够完善,所以不得不引用外部logback配置文件来代替原始的配置。方式是在spring... 查看详情

Spring boot 和 JBoss 8 Wildfly 日志配置应用

】Springboot和JBoss8Wildfly日志配置应用【英文标题】:SpringbootandJBoss8Wildflylogconfigurationapplication【发布时间】:2015-01-2500:32:53【问题描述】:我有一个准备成为WAR的SpringBoot应用程序。它可以在Tomcat8(嵌入式或独立)以及JBoss8Wildfly... 查看详情

springboot日志logback配置

...考技术A在前一个项目simple-boot-demo项目中配置日志相关。SpringBoot日志依赖为:spring-boot-starter-logging,不过对于web项目,已经引入了spring-boot-starter-web,默认已经自带了日志的spring-boot-starter-logging,已经默认引入了logback实现,只需... 查看详情

Spring Boot 应用程序的默认日志记录文件

】SpringBoot应用程序的默认日志记录文件【英文标题】:Defaultloggingfileforspringbootapplication【发布时间】:2017-01-0215:33:02【问题描述】:我已经在application.yml的springboot应用程序中设置了日志级别,如下所示:logging.level.com.Myapplication... 查看详情

spring-boot配置log4j日志

springboot默认使用logback日志记录工具,修改为log4j:<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>1.0.2.RELEASE&l 查看详情

在 Spring Boot 上禁用应用程序的控制台日志记录

】在SpringBoot上禁用应用程序的控制台日志记录【英文标题】:DisableconsoleloggingforapplicationonSpringBoot【发布时间】:2018-02-2719:15:48【问题描述】:我需要在我的Web应用程序的控制台中禁用应用程序日志。我在logback-spring.xml下面强制... 查看详情

Spring Boot jetty/tomcat 内嵌访问日志配置

】SpringBootjetty/tomcat内嵌访问日志配置【英文标题】:SpringBootjetty/tomcatembeddedaccesslogconfiguration【发布时间】:2014-01-0117:19:25【问题描述】:我配置logback.xml它完美运行但logback-access.xml不起作用。在Maven中pom.xml<dependency><groupId... 查看详情

Spring Boot 在哪里存储其默认的日志记录设置

】SpringBoot在哪里存储其默认的日志记录设置【英文标题】:WheredoesSpringBootstoreitsdefaultloggingsettings【发布时间】:2019-08-1522:43:00【问题描述】:我正在创建一个JavaSpringBoot2.X应用程序。在我的配置(application.yml)中,我添加了以... 查看详情

spring boot .war tomcat 应用程序日志不存在

】springboot.wartomcat应用程序日志不存在【英文标题】:springboot.wartomcatapplicationlogsnotthere【发布时间】:2019-11-2012:29:12【问题描述】:我正在尝试将我的webapp日志写入tomcat中/logs目录中的.log文件,但该文件没有生成,也没有任何日... 查看详情

Spring Boot application.properties 中的日志级别问题

】SpringBootapplication.properties中的日志级别问题【英文标题】:IssueswithLogLevelsinSpringBootapplication.properties【发布时间】:2016-07-1701:06:47【问题描述】:我在SpringBoot应用程序中使用Log4J2,并尝试通过application.properties配置一些基本的日... 查看详情

通过 Spring Boot 应用程序关闭 Tomcat 日志记录

】通过SpringBoot应用程序关闭Tomcat日志记录【英文标题】:TurnoffTomcatloggingviaSpringBootApplication【发布时间】:2016-05-3021:02:00【问题描述】:我在Tomcat8上部署了一个SpringBoot应用程序当应用程序启动时,我看到以下内容18-Feb-201615:28:12... 查看详情

spring-boot 默认日志位置

】spring-boot默认日志位置【英文标题】:spring-bootdefaultloglocation【发布时间】:2015-11-0313:33:58【问题描述】:在spring-boot应用程序中,我可以指定一个自定义日志文件java-jarspring-boot-app.jar--logging.file=/home/ubuntu/spring-boot-app.log但如果... 查看详情

让你的spring-boot应用日志随心所欲--springboot日志深入分析(代码片段)

1.springboot日志概述springboot使用CommonsLogging作为内部的日志系统,并且给JavaUtilLogging,Log4J2以及Logback都提供了默认的配置。如果使用了springboot的Starters,那么默认会使用Logback用于记录日志。2.springboot日志默认配置我们启动一个空... 查看详情

在 Spring Boot 应用程序中在运行时更改日志记录级别

】在SpringBoot应用程序中在运行时更改日志记录级别【英文标题】:Changelogginglevelatruntimeinspringbootapplication【发布时间】:2019-04-0912:45:25【问题描述】:我正在尝试在SpringBoot应用程序的运行时更改日志记录级别(从DEBUG到ERROR或WARN... 查看详情

Spring boot - 如何获取 WARN 的框架日志记录和 DEBUG 的应用程序日志记录

】Springboot-如何获取WARN的框架日志记录和DEBUG的应用程序日志记录【英文标题】:Springboot-HowtogetframeworkloggingforWARNandapplicationloggingtoDEBUG【发布时间】:2019-08-2419:09:00【问题描述】:我正在使用带有Logback的SpringBoot进行日志记录。... 查看详情