尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Solon日志模块:告别XML样板代码,用YAML满足日常日志需求!

Solon日志模块:告别XML样板代码,用YAML满足日常日志需求! Java项目日志配置难题待解Solon有办法每个Java项目都需要日志每个Java开发者都有一两个关于日志配置的“战争故事” —— 那个膨胀到200行的XML、互相打架的桥接包、深夜因为日志级别没控制好打满磁盘的报警。而Solon换了一种做法保留行业标准SLF4J但用一段YAML替代了XML配置的混乱让日志配置不再是一个需要单独学习的“副项目”而是应用配置的自然延伸。1. 全栈SLF4J直通Solon原生使用**SLF4J**作为日志门面没加任何私有包装层。代码示例如下import org.slf4j.Logger;import org.slf4j.LoggerFactory;public class OrderService {static final Logger log LoggerFactory.getLogger(OrderService.class);public void createOrder(Order order) {log.info(创建订单: {}, order.getId());}}没有桥接没有适配器没有额外依赖。如果你用过SLF4J你已经在用Solon的日志API了。2. 五个插件一套配置Solon提供了五种日志实现每种都对接同一套配置模型。切换实现只需换一个依赖插件 | 添加器支持 | 适用场景---|---|---solon-logging-simple | console, cloud | 测试/轻量不产生本地日志文件solon-logging-logback | console, file, cloud | 生产推荐Logback 1.3.x, Java 8solon-logging-logback-jakarta | console, file, cloud | Jakarta命名空间Logback 1.5.x, Java 11solon-logging-log4j2 | console, file, cloud | 团队统一使用Log4j2water-solon-cloud-plugin | console, cloud | Water服务治理平台对接加入一个依赖就完成了配置dependencygroupIdorg.noear/groupIdartifactIdsolon-logging-logback/artifactId/dependency不需要logback.xml不需要log4j2.xml —— 除非你需要高级定制。3. 配置一段YAML搞定所有日志配置集中在solon.logging.appender和solon.logging.logger两个字段下solon:app:name: demoappsolon.logging.appender:console:level: TRACEenable: truepattern: %highlight{%-5level %d{yyyy-MM-dd HHss.SSS} #%5X{pid} [-%t][*%X{traceId}]%tags[%logger{20}]:} %n%msg%nfile:name: logs/${solon.app.name}level: INFOenable: trueextension: .logmaxFileSize: 10 MBmaxHistory: 7pattern: %-5level %d{yyyy-MM-dd HHss.SSS} #%5X{pid} [-%t][*%X{traceId}]%tags[%logger{20}]: %n%msg%ncloud:level: INFOenable: true框架内置三个添加器 - **console** -- 标准输出默认启用 - **file** -- 滚动日志文件默认启用 - **cloud** -- 远程日志服务默认关闭。按包控制日志级别solon.logging.logger:root:level: DEBUGcom.zaxxer.hikari:level: WARNcom.demo.order:level: INFO优先级规则很简单 **appender级别 logger级别 root级别**更具体的配置优先。4. 五个级别标准语义TRACE DEBUG INFO WARN ERROR和你一直在用的级别一样。5. MDCSLF4J标准支持Solon直接继承SLF4J的MDC能力没有封装私有API。默认日志pattern中已经包含了%X{pid}进程ID和%X{traceId}分布式链路追踪ID这些由框架自动填充。如果需要自定义上下文用标准SLF4J方式import org.slf4j.MDC;MDC.put(orderId, order.getId());log.info(处理支付);MDC.remove(orderId);没有Solon专属的MDC包装类就是原生SLF4J。6. 自定义添加器内置添加器不够用时继承AppenderBasepackage demo.log;import org.noear.solon.logging.event.AppenderBase;import org.noear.solon.logging.event.LogEvent;public class JsonAppender extends AppenderBase {Overridepublic void append(LogEvent logEvent) {String json toJson(logEvent);send(json);}}在app.yml中注册solon.logging.appender:json:level: INFOclass: demo.log.JsonAppender7. 异步批量日志PersistentAppenderBase对于高吞吐场景Solon提供了PersistentAppenderBase —— 一个将日志事件缓冲后批量刷盘的基类package demo.log;import org.noear.solon.logging.persistent.PersistentAppenderBase;import org.noear.solon.logging.event.LogEvent;import org.noear.solon.Solon;public class DatabaseAppender extends PersistentAppenderBase {LogService logService;public DatabaseAppender() {Solon.context().getBeanAsync(LogService.class, bean - {logService bean;});}Overridepublic void onEvents(List list) {if (logService ! null) {logService.insertList(list);}}}适合将日志写入数据库、Elasticsearch或其他远程存储不阻塞请求线程。批量写入在高负载下能显著降低I/O开销。8. 高级定制XML逃生门如果YAML不满足你的需求在classpath根目录放一个logback-solon.xml或log4j2-solon.xml即可。框架会自动识别且支持环境变体logback-solon-dev.xml、logback-solon-prod.xml。也可以用标准的logback.xml或log4j2.xml —— 但这样会失去按环境切换的能力。9. 云端日志一个插件的事分布式环境下引入water-solon-cloud-plugin并启用cloud添加器solon.logging.appender:cloud:level: INFOenable: true日志自动上报Water服务治理平台无需额外部署日志采集agent。Solon日志模块能否满足你的需求诚实地说Solon的日志模块不会替代完整的可观测性管道Logstash Elasticsearch、Loki Grafana。但对绝大多数项目来说它覆盖了所有日常需求* ✅ SLF4J原生告别桥接依赖* ✅ YAML驱动告别XML样板代码* ✅ 三个内置添加器console / file / cloud* ✅ 自定义添加器支持* ✅ 异步批量持久化* ✅ MDC开箱即用* ✅ 按包控制日志级别* ✅ 环境感知配置切换* ✅ Logback/Log4j2 XML逃生门设计哲学和Solon的其他模块一样 **用最少的配置解决最常见的问题需要定制时绝不挡路。** 那么你是否会考虑使用Solon的日志模块呢
返回列表