文档章节

微服务业务日志收集方案

lipengHeke
 lipengHeke
发布于 01/11 17:48
字数 1131
阅读 650
收藏 12

背景

日志内容复杂多样,如何去收集有价值的日志是我们重点关注的。日志的价值其实是取决于业务操作的,不同的业务场景下相同类型的日志的价值会截然不同。 根据以往的业务实践,结合企业级的一些业务需求,我们选定关注以下几类日志。

  • 跟踪日志【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等

总结

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

© 著作权归作者所有

lipengHeke

lipengHeke

粉丝 8
博文 88
码字总数 45982
作品 1
深圳
架构师
私信 提问
Java 微服务框架 - xian frame

xian-asynchronous xian是一个微服务框架,更确切的说是一个微服务套件。它基于Java8编写,不依赖spring,不依赖dubbo,上手和学习难度非常小。如果是以学会使用为目的,只要你会Java语言会g...

happyyangyuan
2018/07/30
1K
0
使用ELK构建微服务的日志平台

1 概述 在微服务架构中,会部署众多的应用,其中有基础应用,比如:网关,服务发现等。同时还有大量的业务应用。所以,如何有效的收集它们的日志,并且方便查询,同时提供友好的可视化展示,...

Java大蜗牛
2018/08/18
167
0
微服务神经元 Neural 发布 3.1.0

微服务神经元 Neural 发布 3.1.0,主要更新了以下功能: 微服务神经元由Nerver正式更名为Neural 新增基于Log4j2的自定义日志中心,用于分别收集各类日志,如启动日志、业务日志、错误日志和性...

李景枫
2016/07/11
1K
8
基于REST微服务的5个最佳实践

微服务现在已经很流行了,如果想让微服务架构开发变得友好,而且可以让开发者管理起来轻松一些,跟踪误差更容易,那么只要遵循本文中讲述的5个最佳实践就可以了。 1.用户代理 在请求头里面命...

liwei2000
2017/11/03
117
0
Spring Cloud Sleuth 链路追踪

随着微服务的数量增长,一个业务接口涉及到多个微服务的交互,在出错的情况下怎么能够快速的定位错误,这是一个难题。 好在Spring Cloud已经为什么实现了一个非常好的方案来对服务进行追踪。...

尹吉欢
2017/12/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周日乱弹 —— 谨以此文怀念逝去的人

Osc乱弹歌单(2020)请戳(这里) 【今日歌曲】 今天没歌曲 手机党少年们想听歌,请使劲儿戳(这里) 今天是周六, 刚想开始写乱弹的时候, 翻到了巴叔新建的话题上, @ 巴拉迪维:宏哥,一路...

小小编辑
30分钟前
9
0
判断php变量是否定义,是否为空,是否为真的一览表

使用 PHP 函数对变量 $x 进行比较 表达式 gettype() empty() is_null() isset() boolean : if($x) $x = ""; string TRUE FALSE TRUE FALSE $x = null; NULL TRUE TRUE FALSE FALSE var $x; N......

Grayk
今天
12
0
服务器监控

1. 服务器监控内容有哪些? 答: 主要有服务监控 和 流量监控 2. 监控重点是? 答: 是 磁盘 和 流量,cpu是浮动的,意义不大 3. 怎样 实现 监控? 答:将 服务器 分为:监控者 和 被监管协议...

杨凯123
昨天
242
0
Apollo开发指南

一、准备工作 二、本地启动 2.1 Apollo Config Service和Apollo Admin Service 2.2 Apollo-Portal 2.3 Java样例客户端启动 2.4 .Net样例客户端启动 三、开发 3.1 Portal 实现用户登录功能 3....

Ciet
昨天
307
0
英文词汇 计算机网络中的专业英语单词及其缩写

学习计算机网络时,会阅读相关的专业文献。对于文献中经常出现的缩写形式的专业名词,做了一些积累。现于此博文中做个简单的分享,希望能对后来人有所帮助,平稳地入门计算机网络。 注:博文...

志成就
昨天
178
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部