微服务业务日志收集方案
背景
日志内容复杂多样,如何去收集有价值的日志是我们重点关注的。日志的价值其实是取决于业务操作的,不同的业务场景下相同类型的日志的价值会截然不同。 根据以往的业务实践,结合企业级的一些业务需求,我们选定关注以下几类日志。
• 跟踪日志【trace.log】 Server引擎的调试日志,用于系统维护人员定位系统运行问题使用。 • 系统日志【system.log】 大粒度的引擎运行的入口、出口的日志,用于调用栈分析,可以进行性能分析使用。 • 部署日志【deploy.log】 记录系统启动、停止、构件包部署、集群通知等信息的日志。 • 引擎日志【engine.log】 细粒度的引擎运行日志,可以打印上下文数据,用于定位业务问题。 • 构件包日志【contribution.log】 构件包记录的业务日志(使用基础构件库的日志输出API写日志)
这里我们专门针对系统日志收集讨论几种收集方案
方案一:通过日志组件来收集
这里是指通过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']")
优点
- 操作简单
- 较灵活,粒度可大可小
缺点
- 有代码侵入
- 个性化需求不满足
方案四:针对复杂场景或者审计需求手动记录,侵入性强
如果有些业务公用了方法,需要更小的粒度,或者需要记录业务数据变更记录,这时就只能选择侵入式较强的方式来记录日志了,直接再业务代码中记录日志
logClient.logObject(LogObjectType.XXX,id,UserContext.getUserName(),"编辑xxx","xxx变更为xxxxx");
方案五:记录sql日志
则可以使用mybatis拦截器来进行,如果没有使用mybatis,则可以做一个通用的preparestatement以及statement代理。
当然现在已经有很对监控组件可以满足这个需求,比如说jeager、javamelody、druid等
一般情况下我们会采用多种方式来记录业务日志,这个都是根据具体需求来进行评估用哪几种方式可以更好的达到产品需求。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
刚哥带你参加国际顶级技术会议 - Kubecon西雅图2018 - Kubernetes设计原则
软件业有如时尚业,新产品,新技术,新概念层出不穷,作为码农,如果不了解业内最新的技术动向,往往会陷入闭门造车的困境。睁眼看世界对于我们的产品开发和设计都是非常有意的一件事情。但是如今,各种会议层出不穷,会议质量良莠不齐,或者很多我想参加的会议发生在离我十万八千里的美洲,欧洲,非洲,南极洲,作为码农的我们既没钱,又没时间去参加这些会议。不要担心,刚哥这里会找一些顶级会议的内容,分享给大家,能让大家坐在家里,也依然能够领略这些顶级会议的精彩内容。 今天我要带给大家的是2018年底,在西雅图举办的Kubecon的一场分享,来自谷歌K8s团队的工程师Saad Ali分享的《Kubernetes设计原则》。这场会议虽然已经过去一年了,但是我觉得本会议的内容非常值得学习,我们大都知道K8s是如何工作的,但是本文带我们了解k8s背后的设计原则,以及为什么要这样设计。以下是该分享的摘要: Kubernetes设计原则:了解原因 Kubecon西雅图2018 对于跨云和本地环境在分布式系统上管理和部署工作负载,Kubernetes很快变得不可或缺。 虽然现在大多数人都熟悉如何使用Kubernetes,但...
- 下一篇
你不得不了解Helm 3中的5个关键新特性
Helm是Kubernetes的一个软件包管理器。两个月前,它发布了第三个主要版本,Helm 3。在这一新版本中,有许多重大变化。本文将介绍我认为最关键的5个方面。 1、 移除了Tiller Helm最终移除了其服务器端组件,Tiller。现在,它完全没有代理。Tiller之前是一个运行在Kubernetes上的小型应用程序,它用于监听Helm命令并处理设置Kubernetes资源的实际工作。 这是Helm3中最重大的更改。为什么Tiller的移除备受关注呢?首先,Helm应该是一种在Kubernetes配置上的模板机制。那么,为什么需要在服务器上运行某些代理呢? Tiller本身也存在一些问题,因为它需要集群管理员的ClusterRole才能创建。因此,假设你要在Google Cloud Platform中启动的Kubernetes集群上运行Helm应用程序。首先,你需要启动一个新的GKE集群,然后使用helm init初始化Helm,然后…发现它失败了。这种情况之所以会发生是因为,在默认状态下,你没有给你的kubectl上下文分配管理员权限。现在你了解到了这一点,开始搜索为分配管理...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS7设置SWAP分区,小内存服务器的救世主
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Docker安装Oracle12C,快速搭建Oracle学习环境