在 Spring Boot 应用程序中用 slf4j 替换 java 平台系统记录器

问题描述

我有一个 Spring Boot 应用程序构建为多模块 gradle 项目(旧式,不是花哨的拼图)

我想要实现的 - 是用我的应用程序中使用的 sl4j 和 logback 替换 java 平台记录器(例如,Ssllogger/System.getLogger),并在运行时由 spring-boot-admin 服务器管理。我需要将所有记录器写入文件而不是控制台 - 否则我不会在 logz.io 中看到日志。 我不控制我的应用程序的部署方式,但我控制了 fat jar 的构建方式(因此,带有终端命令“java - ...”的手册不是很有帮助:()

我开始遵循 https://www.baeldung.com/java-9-logging-api 指南,但卡住了。

为简单起见,我的结构是 ->

build.gradle
    /application-module
        build.gradle (combines 3 other modules)
        /src /...
    /rest-module
        build.gradle
        /src /...
    /service-module
        build.gradle
        /src /... 
    /persistency-module
        build.gradle
        /src /... 

所以,我想再添加一个模块

/log-module
    /src -> with actual classes 
         module-info.java
         Slf4jLogger implements System.Logger 
         Slf4jLoggerFinder extends System.LoggerFinder

并将其包含到我的应用程序模块中

但是在尝试构建所有内容时,我收到“错误:找不到模块:org.slf4j”,并且应用程序未构建。

那么,我做错了什么?我需要哪些额外的插件/配置?它甚至能让我实现我的目标吗?

解决方法

好的,我设法找到了解决方案。这是一个组合

https://www.baeldung.com/java-9-logging-api

https://www.baeldung.com/java-spi

所以,我什至不需要拼图模块——只需要 JDK 的服务提供者机制

所以,实际上你需要3个文件[这些是pastebin样本的id;但它们与java-9-logging-api文章中的几乎相同]

  • AkXY3zgu -> 适配器类
  • YFUkZwat -> 记录器提供者
  • CD6NNibj -> meta-inf 文件 - 这是最棘手的部分(文件名:))

文件名 -> META_INF/services/java.lang.System$LoggerFinder

com.my-projects.commons.logs.Slf4jLoggerFinder

现在常规的应用程序启动系统记录器将被 slf4j-adapter 替换。 但是,检查系统记录器是如何创建的 -> 例如,我主要需要 SSLLogger,并且那里有一些基于系统属性的逻辑......