问题描述
我有一个 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,并且那里有一些基于系统属性的逻辑......