22

日志收集的 “DNA”

 4 years ago
source link: https://mp.weixin.qq.com/s/ySJudWmuQfKRFY2snKIs1w
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

e6JBVrU.gif

原创:小姐姐味道(微信公众号ID:xjjdog),欢迎分享,转载请保留出处。

关于日志收集的文章,xjjdog已经写了不少了,比如下面这八篇文章。今天主要介绍一下关于日志的划分。工具虽然有力,落地才能有效。

日志收集是每一家公司都需要的基础组件,尤其是已经步入正轨的公司。但是,日志收集要收集哪些内容呢?我们要对这些信息一视同仁么?

日志种类划分

一般说到日志,想到的都是后端日志。但是后端日志根据不同的需要和日志级别,最终的流向和处理方式也是不一样的。

iURjuaU.png!web

普通业务日志。你要知道,在这个世界中,线上开着DEBUG日志级别跑的程序员,到处都是。那些像撒尿一样的流水账,是没必要收集的。也就是说,业务日志中,大多数都是没用的东西。对待这种数据,我们只要有个地方进行统一存储就可以了。

检索型业务日志。检索的业务日志,是有业务属性的。比如你的系统和第三方支付进行对接所产生的 报文交互 数据。它们比普通业务日志有用,但又没有存放到数据库的必要,我们一般的处理方式就是收集到ES这种大容量的存储中。

并不是说你收集到ES,挂个 kibana 就完事了。这些信息我们还需要检索,也就是字段要有具体的意义。这时候, 普通字符串 就没什么用了,需要转化成 json 一类的规格数据,这样就可以根据某个条件进行搜索统计。

ES和mongo对此支持也都不错。

检索型业务日志是建设的重点,需要对日志输出组件进行二次开发和定制,配合完成。

vmUvMbz.png!web

以下是一个可能的外观接口。

//输出携带参数的日志,参数为偶数,将会对其进行key,value配对。
LogMe.out("title","remark aa", "vendorid", 5, "storecode", "1011", "poscode", "POS1111", "version", "7.0.0.16");

//参数为奇数,放入_all字段,无法根据内容查找(要尽量避免此情况)
LogMe.out("test _all title","remark aa", "vendorid", 5, "storecode", "1011", "poscode", "POS1111", "version");

//手工组装参数(参数非常多时,建议此方式)
Map<String, Object> param = new HashMap<>();
param.put("vendorid", 5);
param.put("madetime", new Date());
param.put("orderno", 21731310830180019L);
LogMe.out("test map","remarkaa", param);

//error堆栈+参数,以上两个方法都可以追加异常栈
LogMe.out("error","remark error", new Exception("error"), "vendorid", "5", "storecode", "1011");

异常日志。异常日志又是一种流向。对待这一类信息,我们希望得到两个效果。第一、异常日志能够及时的被业务人员发现;第二、异常日志能够被统计和事后分析。所以,一个触发式的日志处理链,以及检索型的上下文查询,都是必要的。

APM这个和前端,终端综合起来,可以进行调用链追踪,行为分析等,一般是垮端的整体性分析。市面上有很多这样的产品,包括收费的和开源的。

再向上,就是一些终端的日志。终端包括Android、IOS,以及其他手持设备。它和WEB端是类似的,只是工具链不同。

行为日志。你在使用一些App的时候,都会默认勾选上一个叫做 匿名发送使用数据-帮助我们提高 的选项。最详细的行为数据记录,用户的每一次点击事件,都会产生一条日志,这些日志会传送到服务端进行分析。这种日志的数据一般是非常庞大的,需要专门处理,使用 TSDB 等超大容量的存储进行存放。

终端异常日志终端的异常日志一般是个技术活。除了收集应用正常运行中产生的异常,还需要获得应用异常退出时候的异常信息。

可以看到,每一种日志都有它自己的使用场景,后端使用的技术栈也不尽相同。

干什么用?

后端日志收集之后,大多数是为了辅助开发或者运维进行问题定位,减少分析问题的时间。

JNJRF3z.png!web

我们着重说一下客户端日志收集。

除了偷偷使用你的硬件进行挖矿的无良App,还有类似支付宝这种偷偷拍你的照,录你的音的大厂软件(自行搜索,我姑且认为这是真的)。目的都是为了采集用户数据,搞一些类似大数据杀熟的勾当。像iphone本身等也有类似的功能,比较缺德的是默认是打勾的。

大多用户对自己的行为数据无感知,但当大量的数据聚合起来,厂商会觉得很香,很带感。做技术当然是去实现就好,不用去谴责自己的良心,天塌下来还有公关部那群炮灰顶着呢。

和APM这种用来用来改善调用关系、性能的工具不同,客户端收集的数据更加零散,业务模型也更加多样化。

用户的数据即然这么宝贵,那么都收集些什么呢?又是怎么收集呢?当然不是通过收集调查问卷。用户的每个点击,甚至页面的停留时间,都可能会成为被分析的对象。

由于用户安装了你的软件,其硬件环境的信息也能够获取,包括调用硬件的设备采取的包括用户隐私、截图、音频、视频等数据等。所以收集的数据是多种多样的。

1、硬件信息

这个在Android设备上体现的比较明显。收集这些数据用来分析app与设备、设备版本、语言等之间的关系。可以将工作重点转向市场占用率高的设备和版本上。你可能还会收集设备的CPU、内存、显卡等信息,以便对你的产品进行专项优化。

2、软件环境

收集自有软件的信息软件版本。通过分析用户安装的每个软件版本的数量,你可以决定那些版本可以不在维护,哪些版本发生的bug多等,是你很多决策的依据。

收集其他软件的信息一个比较明显的例子就是cookie。举个例子,我在百度上搜索了下充气娃娃,结果打开京东,给我推荐的就是情趣用品。

3、功能监控

对一些灰度的,或者重要的功能进行监控。比如你新上线了一个idea,到底行不行,还得需要线上数据来验证。通过分析日志,就能判断出哪些产品经理的主意是非常差劲的。

4、LBS

用户位置数据是非常敏感的。LBS曾经成就了陌陌,对于大部分应用来说,位置数据可以分析产品在某个区域、省份、国家的受欢迎程度和差异化。

当你发布了一个新的产品需求,就应该考虑到后期的数据追踪,以便评估你的需求效果。包括在发布期间用户的装机、卸载量。这都是有数据支撑的,而不是拍脑袋决定的。

5、行为数据

前几年还是比较火的推荐功能,现在加上深度学习的加持,分析更为准确。机器会在后台默默的记录你的喜好,并产生相应的输出,投你所好。

End

综上所述,设计一个比较全面的日志系统,还是有一番挑战的。不同类型的业务日志,有着不同的分析处理方式,数据的最终流向也不尽相同。如果你对这个领域想要更多的了解,可以参考文章开头列出的几篇文章。xjjdog后续会尝试从日志规范方面,将这个体系进行整体的归纳。

作者简介: 小姐姐味道 (xjjdog),一个不允许程序员走弯路的公众号。聚焦基础架构和Linux。十年架构,日百亿流量,与你探讨高并发世界,给你不一样的味道。我的个人微信xjjdog0,欢迎添加好友,进一步交流。

热门文章

♮ 必看!java后端,亮剑诛仙(最全知识点)

后端技术索引,中肯火爆。全网转载上百次。

♮ Linux生产环境上,最常用的一套“vim“技巧

多张动图演绎常见操作,让你快速掌握vi捷径

♮ 学完这100多技术,能当架构师么?(非广告)

最简洁有力的Linux命令总结

♮ 一天有24个小时?别开玩笑了!

最浅显易懂的微服务体系文章

♮ 企业内耗成瘾者

不可错过的人生总结,劝退神器

♮ 领导看了会炸毛的溢出理论

你是否也天天下班被@?

♮ 杀机!

沉默是金。你确定么?

EnUneen.gif


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK