微服务业务日志收集方案,写得非常好!

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
MSE Nacos/ZooKeeper 企业版试用,1600元额度,限量50份
任务调度 XXL-JOB 版免费试用,400 元额度,开发版规格
简介: 背景日志内容复杂多样,如何去收集有价值的日志是我们重点关注的。日志的价值其实是取决于业务操作的,不同的业务场景下相同类型的日志的价值会截然不同。根据以往的业务实践,结合企业级的一些业务需求,我们选定关注以下几类日志。

背景

日志内容复杂多样,如何去收集有价值的日志是我们重点关注的。日志的价值其实是取决于业务操作的,不同的业务场景下相同类型的日志的价值会截然不同。


根据以往的业务实践,结合企业级的一些业务需求,我们选定关注以下几类日志。


跟踪日志【trace.log】 Server引擎的调试日志,用于系统维护人员定位系统运行问题使用。


系统日志【system.log】 大粒度的引擎运行的入口、出口的日志,用于调用栈分析,可以进行性能分析使用。


部署日志【deploy.log】 记录系统启动、停止、构件包部署、集群通知等信息的日志。


引擎日志【engine.log】 细粒度的引擎运行日志,可以打印上下文数据,用于定位业务问题。


构件包日志【contribution.log】 构件包记录的业务日志(使用基础构件库的日志输出API写日志)


这里我们专门针对系统日志收集讨论几种收集方案,关注微信公众号Java技术栈,在后台回复:微服务,可以获取我整理的 N 篇 微服务系列教程,都是干货。


方案一:通过日志组件来收集

这里是指通过logback、log4j等日志组件来输出文件,然后再通过文件输出到logstash、kibana等日志组件中,通过这些日志组件来进行可视化统计与分析,这里需要统一关键日志输出格式方便日后统计搜索。


优点


操作简单,收集方便


减少业务依赖


粒度细


缺点


依赖于logstash、kibana


只能满足简单的日志操作,详细点或者个性化需求操作起来比较复杂


方案二:使用aop来拦截controller

拦截controller层,通过controller中的方法名是否包含insert、update、delete等关键字来记录业务日志。


优点


操作简单,收集方便

缺点


只能记录简单日志


不同的人命名习惯不一样,日志可能不准确


方案三:使用注解来,进行稍微精准的业务日志记录

这个方案粒度可大可小,代码侵入性也比较小,可操作性比较强,如果需要获取参数信息或者返回值信息,可以通过注解配置获取到,可以集合fastjson中的jpath来获取参数值下面有几个伪代码供参考

@Slf4j
@Aspect
public class SysLogAspect {
 @Around("@annotation(sysLog)")
 @SneakyThrows
 public Object around(ProceedingJoinPoint point, SysLog sysLog) {
  // 根据系统上下文获取相关数据
  Operation logVo = SysLogUtils.getOperationModel();
  Object obj=null;
  try{
   // 操作方式
   logVo.setOperationName(sysLog.value());
   // 操作时间
   logVo.setOperationTime(new Date());
   logVo.setObjectType(sysLog.objectType().name());
   logVo.setAppName(StringUtils.defaultString(sysLog.appName(),"TSP"));
   // 发送异步日志事件
   obj = point.proceed();
   if(StringUtils.isNotBlank(sysLog.objectIdKey())&&StringUtils.isNotBlank(sysLog.objectNameKey())){
    Map<String,Object> params=Maps.newHashMap();
    params.put("args",point.getArgs());
    params.put("response",obj);
    logVo.setObjectId(getKeyValue(sysLog.objectIdKey(),params));
    logVo.setObjectName(getKeyValue(sysLog.objectNameKey(),params));
   }
  }catch (BusinessException e){
   logVo.setException(e.getMessage());
   throw new Exception(e);
  }catch (RuntimeException e){
   logVo.setException(e.getMessage());
   throw new Exception(e);
  }catch (Exception e){
   logVo.setException(e.getMessage());
   throw new Exception(e);
  }finally {
   ApplicationContextUtils.publishEvent(new OperationEvent(logVo));
  }
  return obj;
 }
 private String getKeyValue(String key,Map<String,Object> params){
  try{
   Object mm= JSONPath.eval(params,key);
   if(mm!=null){
    return mm.toString();
   }
  }catch (Exception e){
   log.error("JSONPath.eval:",e);
  }
  return null;
 }
}
@SysLog(value = "xxxxxx",objectType = LogObjectType.OFFLINE_THRONG,
    objectIdKey = "$['args'][0][0]['id']",objectNameKey = "$['response'][0][0]['throngName']")

优点


操作简单


较灵活,粒度可大可小


缺点


有代码侵入


个性化需求不满足


方案四:针对复杂场景或者审计需求手动记录,侵入性强

如果有些业务共用了方法,需要更小的粒度,或者需要记录业务数据变更记录,这时就只能选择侵入式较强的方式来记录日志了,直接在业务代码中记录日志,日志系统新贵 Loki,这个推荐看下。

logClient.logObject(LogObjectType.XXX,id,UserContext.getUserName(),"编辑xxx","xxx变更为xxxxx");

方案五:记录sql日志

则可以使用mybatis拦截器来进行,如果没有使用mybatis,则可以做一个通用的preparestatement以及statement代理。


当然现在已经有很对监控组件可以满足这个需求,比如说jeager、javamelody、druid等。


总结

一般情况下我们会采用多种方式来记录业务日志,这个都是根据具体需求来进行评估用哪几种方式可以更好的达到产品需求。


相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
相关文章
|
17天前
|
Prometheus 监控 Java
日志收集和Spring 微服务监控的最佳实践
在微服务架构中,日志记录与监控对系统稳定性、问题排查和性能优化至关重要。本文介绍了在 Spring 微服务中实现高效日志记录与监控的最佳实践,涵盖日志级别选择、结构化日志、集中记录、服务ID跟踪、上下文信息添加、日志轮转,以及使用 Spring Boot Actuator、Micrometer、Prometheus、Grafana、ELK 堆栈等工具进行监控与可视化。通过这些方法,可提升系统的可观测性与运维效率。
日志收集和Spring 微服务监控的最佳实践
|
6月前
|
存储 Java 文件存储
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录—— logback.xml 配置文件解析
本文解析了 `logback.xml` 配置文件的详细内容,包括日志输出格式、存储路径、控制台输出及日志级别等关键配置。通过定义 `LOG_PATTERN` 和 `FILE_PATH`,设置日志格式与存储路径;利用 `&lt;appender&gt;` 节点配置控制台和文件输出,支持日志滚动策略(如文件大小限制和保存时长);最后通过 `&lt;logger&gt;` 和 `&lt;root&gt;` 定义日志级别与输出方式。此配置适用于精细化管理日志输出,满足不同场景需求。
1589 1
|
6月前
|
Java 微服务 Spring
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录——使用Logger在项目中打印日志
本文介绍了如何在项目中使用Logger打印日志。通过SLF4J和Logback,可设置不同日志级别(如DEBUG、INFO、WARN、ERROR)并支持占位符输出动态信息。示例代码展示了日志在控制器中的应用,说明了日志配置对问题排查的重要性。附课程源码下载链接供实践参考。
740 0
|
6月前
|
SQL Java 数据库连接
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录—— application.yml 中对日志的配置
在 Spring Boot 项目中,`application.yml` 文件用于配置日志。通过 `logging.config` 指定日志配置文件(如 `logback.xml`),实现日志详细设置。`logging.level` 可定义包的日志输出级别,例如将 `com.itcodai.course03.dao` 包设为 `trace` 级别,便于开发时查看 SQL 操作。日志级别从高到低为 ERROR、WARN、INFO、DEBUG,生产环境建议调整为较高级别以减少日志量。本课程采用 yml 格式,因其层次清晰,但需注意格式要求。
622 0
|
6月前
|
Java API 开发者
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录——slf4j 介绍
在软件开发中,`System.out.println()`常被用于打印信息,但大量使用会增加资源消耗。实际项目推荐使用slf4j结合logback输出日志,效率更高。Slf4j(Simple Logging Facade for Java)是一个日志门面,允许开发者通过统一方式记录日志,无需关心具体日志系统。它支持灵活切换日志实现(如log4j或logback),且具备简洁占位符和日志级别判断等优势。阿里巴巴《Java开发手册》强制要求使用slf4j,以保证日志处理方式的统一性和维护性。使用时只需通过`LoggerFactory`创建日志实例即可。
453 0
|
2月前
|
运维 监控 安全
2025 年 Splunk 的 5 大替代方案:企业日志管理工具新选择
Splunk 虽强大,但高昂成本和复杂性促使企业寻找替代方案。本文推荐 2025 年五大日志管理与安全分析工具:Log360、Elastic Security、Datadog、Graylog 和 Sumo Logic,涵盖开源、云原生与高性能方向,适配不同企业需求,助你提升安全与运维效率。
173 0
|
9月前
|
存储 运维 数据可视化
如何为微服务实现分布式日志记录
如何为微服务实现分布式日志记录
566 1
|
10月前
|
消息中间件 存储 监控
微服务日志监控的挑战及应对方案
【10月更文挑战第23天】微服务化带来模块独立与快速扩展,但也使得日志监控复杂。日志作用包括业务记录、异常追踪和性能定位。
|
10月前
|
设计模式 Java API
微服务架构演变与架构设计深度解析
【11月更文挑战第14天】在当今的IT行业中,微服务架构已经成为构建大型、复杂系统的重要范式。本文将从微服务架构的背景、业务场景、功能点、底层原理、实战、设计模式等多个方面进行深度解析,并结合京东电商的案例,探讨微服务架构在实际应用中的实施与效果。
534 6
|
10月前
|
设计模式 Java API
微服务架构演变与架构设计深度解析
【11月更文挑战第14天】在当今的IT行业中,微服务架构已经成为构建大型、复杂系统的重要范式。本文将从微服务架构的背景、业务场景、功能点、底层原理、实战、设计模式等多个方面进行深度解析,并结合京东电商的案例,探讨微服务架构在实际应用中的实施与效果。
246 1