当前位置: 首页 > 知识库问答 >
问题:

Spring Boot编程日志记录配置

丁恩
2023-03-14

如何在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());
}

每个环境我所拥有的是:

  • 伐木。数量root=[INFO,DEBUG,…]

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

归根结底,这实际上是为了实现与Spring JavaConfig对beans一样的日志记录灵活性。XML或其他文件格式太过静态,需要太多的复制,并且没有与应用程序的其余配置充分集成。

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

共有1个答案

笪涛
2023-03-14

我不确定您是否想要或需要禁用日志系统的默认XML配置,但您确实希望在完成后执行您的自定义调用。幸运的是,这很容易,因为它在SpringApplication的初始化器链中尽可能早地完成。放置代码最简单的地方可能是SpringApplication ationLaunalizer(它还必须实现Application ationContextLaunalizer,以便可以将其添加到SpringApplication中)。例如。

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

如果这样做,您将无法向初始化程序进行依赖注入,但它将确保它在生命周期中尽早被调用。如果您的初始化程序实现了环境感知,那么在调用SpringApplication ationInitializer.initialize()之前,您还将被传递一个环境的实例-使用它您可以解析示例中的环境相关部分,例如。

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

一旦你让它工作起来,为了避免对所有的应用程序都做同样的事情,你可以通过添加一个META-INF/spring来使它具有声明性。包含初始值设定项类的工厂

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

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

 类似资料:
  • 我想在我的应用程序中使用SLF4J+logback用于两个目的--日志和审计。 14:41:57.978[main]信息AUDIT_LOGGER-110欢迎使用main 如何确保审核消息在审核记录器下只出现一次?

  • 问题内容: 我正在考虑将Redis用于Web应用程序日志记录目的。我用谷歌搜索,有人将日志转储到Redis队列/列表中,然后将计划的工作人员转储到磁盘中。 http://nosql.mypopescu.com/post/8652869828/another-redis-use-case- centralized-logging 我希望寻求理解,为什么不直接使用Redis持久化到磁盘?如果我分配了一

  • logging 模块自 2.3 版以来一直是 Python 标准库的一部分。在 PEP 282 中有对它的简洁描述。除了 基础日志教程 之外,这些文档是非常难以阅读的。 日志记录一般有两个目的: 诊断日志 记录与应用程序操作相关的日志。例如,当用户遇到程序报错时, 可通过搜索诊断日志以获得上下文信息。 审计日志 为商业分析而记录的日志。从审计日志中,可提取用户的交易信息, 并结合其他用户资料构成用

  • 每当我部署一个外部化配置有错误的生产应用程序时,我都会在Tomcat日志中收到以下消息: 显然,外部化的配置是在log4j被正确初始化之前处理的,因此没有附加程序可以接受来自的消息。 有没有办法预先初始化log4j,以便在标准Grails log4j初始化发生之前捕获这些消息?

  • 问题内容: 如何配置OpenEJB日志记录格式?这就是我现在在日志中看到的内容: 我想禁用消息,并更改其他消息的格式。中的更改无效。 问题答案: 这是我为使事情正常运行所做的工作: 现在工作正常。这是我的: 这是: 现在,由于大卫的支持,我可以在测试期间微调OpenEJB的日志记录:)

  • 我想按照这里的描述设置用于日志记录的Jetty-http://www.eclipse.org/jetty/documentation/current/configuring-jetty-request-logs.html 但上线过程以错误结束: 我的码头网。WEB-INF中的xml具有以下配置: 我做错了什么? 我用下一个命令编译并运行WAR文件: