系列文章:
在上一篇文章中,我们介绍了日志数据对游戏的重要性,这一篇我们来讨论下如何高效地实施全方位无死角的日志采集。
游戏日志数据有很多的来源,例如:
以上这些也只是部分而已,在阿里集团和支撑业务中,涉及到采集的日志如下:
主机日志
移动端埋点日志
数据库日志
硬件设备
日志采集的作用就是把这些分布在全球各地域,多个渠道和终端,异构网络的数据统一,以适应后期各种角色(研发、运维、客服、运营、产品、总监等)对数据处理的各种需求。
随着VR游戏的流行,一部分业务会使用嵌入式设备,例如传感器、摄像头、交互大屏等。这类设备一般会有如下特点:
根据不同设备类型以及资源限制,我们推荐使用以下方式进行日志采集:
在移动互联网时代,手游已经成为游戏中最热点的类目,对于手游APP的日志采集场景,我们希望将APP的日志直接上传到日志服务中,而不需要通过APP服务端中转,这样用户就能专注在自己的业务逻辑开发。
普通模式下,日志写入日志服务需要开启主账号的访问秘钥,用于鉴权以及防篡改。移动APP如果通过此模式接入日志服务,需要将您的AK信息保存在移动端,存在AK泄漏的数据安全风险。一旦发生AK泄漏,需要升级移动APP,并替换AK,代价太大。另一种移动端日志接入日志服务的方式为通过用户服务器中转,但是该种模式下,如果移动APP数量较大,用户的应用服务器需要承载所有的移动端数据,对服务器的规模有较高的要求。
为了避免以上问题,日志服务为您提供能更安全、更便捷的移动APP日志数据采集方案,即通过RAM搭建一个基于移动服务的移动应用数据直传服务。相较于直接使用AK访问日志服务,用户不需要在APP端保存AK,不存在AK泄露的风险。使用临时Token访问,更加安全,Token有生命周期,并且可以针对Token定制更加复杂的权限控制,比如限制IP段的访问权限等。成本低,用户不需要准备很多服务器,移动应用直联云平台,只有控制流走用户自己的应用服务器。
手游日志直传服务搭建可参考:搭建移动端日志直传服务。该方案可搭配以下SDK进行接入:
页面用户行为收集可以分为两类:
实施方法:
Web Tracking只需一个http get请求即可将数据传输至日志服务Logstore端,适应各种无需任何验证的静态网页、广告投放、宣传资料和移动端数据采集。相比其他日志采集方案,特点如下:
服务器日志一般通过Agent进行采集,相对应用直发,Agent采集具备以下优势:只要应用可以将日志输出(以文件形式保存到磁盘、syslog等)或者支持通用的接口拉取,Agent即可将日志采集到。大部分场景下松耦合、可扩展性、可维护性相比Agent额外开销更具优势。
日志采集Agent选型一般需要关注功能、性能、稳定性、运维代价4个方面:
目前阿里云日志服务logtail采集Agent已承载阿里云全站、所有云产品服务、全球各Region部署、阿里巴巴集团(淘宝、天猫、菜鸟等)上重要服务的数据采集。每天采集接近百万服务器上数PB的实时数据,对接数千个应用与消费者。之所以使用Logtail作为采集Agent也是经过上述四个方面的综合考虑。由于采集Agent数量众多,这里我们选择目前最主流的3款Agent进行对比:
Logtail | Logstash | Fluentd | Beats系列 | ||
---|---|---|---|---|---|
功能 | 文本文件采集 | 支持 | 支持 | 支持 | 支持 |
syslog | 支持 | 支持 | 支持 | 不支持 | |
处理方式 | 正则、anchor、分隔符、json任意组合 | 插件扩展 | 插件扩展 | 只支持multiline | |
过滤 | 正则 | 插件扩展 | 插件扩展 | 不支持 | |
压缩 | lz4 | 插件扩展 | 插件扩展 | 支持 | |
功能扩展 | 支持插件 | 支持插件 | 支持插件 | 支持(修改源码) | |
性能 | 采集性能 | 极简单核160M/s、正则20M/s | 单核2M/s左右 | 单核3-5M/s | 极简单核15M/s |
资源消耗 | 平均CPU 2%、内存 40M | 10倍以上性能消耗 | 10倍以上性能消耗 | 内存消耗较低 | |
稳定性 | 多租户隔离 | 自实现的隔离 | 线程级隔离 | 线程级隔离 | goroutine隔离 |
硬性资源限制 | 支持 | 支持 | 支持 | 不支持 | |
资源动态调整 | 支持 | 不支持 | 不支持 | 不支持 | |
数据保存 | 支持 | 插件支持 | 插件支持 | 不支持 | |
进程守护 | 支持 | 辅助软件支持 | 辅助软件支持 | 辅助软件支持 | |
采集点位保存 | 所有均支持 | 只支持文件 | 插件支持 | 只支持文件 | |
运维代价 | 本地监控 | 支持 | 支持 | 支持 | |
服务端监控 | 支持 | Beta版本支持简单功能 | 辅助监控软件扩展 | 不支持 | |
集群自动缩扩容 | 自定义标识机器组 | 不支持 | 不支持 | 不支持 | |
运行时配置变更 | 支持 | 支持 | 支持 | 支持 | |
服务端配置管理 | 支持 | Beta版本支持简单功能 | 辅助软件扩展 | 不支持 | |
自动升级 | 支持 | 辅助软件扩展 | 辅助软件扩展 | 不支持 |
相对主流的采集Agent,Logtail在采集功能上有一定的不足,对于输入源、处理方式等支持没有开源软件的多,但从目前的功能来看,可以满足95%以上的日志采集需求。但日志采集并不是能够采集到就可以。相对开源软件,Logtail的优势是有集团百万服务器、上万应用的练兵环境,很多问题纯粹从Agent和开源社区的角度并不会考虑到。因此经历了数年的迭代优化,在性能、稳定性、运维代价上,Logtail相对更加成熟,在性价比上具有绝对的优势。
因此建议使用Logtail进行数据采集,针对不同格式的日志配置方法如下:
在K8S中,日志采集并没有很好的解决方案,主要原因如下:
基于阿里巴巴多年来容器服务日志采集的经验积累,并结合阿里云Kubernetes广大用户的反馈与诉求,日志服务推出了Kubernetes日志采集方案,支持容器文件 、容器stdout 、宿主机文件 的全方位采集。相比其他容器日志采集方案优势如下:
日志服务提供多种语言的SDK,支持各种语言程序直发日志服务:
针对高性能应用场景,我们推荐使用Producer Library(Java Producer Library 、 C Producer Library)。Producer Library 会简化您程序开发的步骤,帮助您批量聚合写请求,通过异步的方式发往LogHub服务端。在整个过程中,您可以配置批量聚合的参数、服务端异常处理的逻辑等。该方式具备以下特点:
若您的Java程序使用Log4J库进行日志输出,可直接使用日志服务Log4j Appender 进行日志采集。该方式具备以下特点:
此外若您的程序日志已经打到本地,可直接通过Logtail 进行采集。
Logtail binlog 支持以MySQL slave的形式基于Binlog进行同步,支持Insert、Update、Delete以及DDL采集。相比传统数据库采集方式,Logtail binlog方式具备以下优势:
Logtail JDBC 支持以SQL形式定期采集数据库中的数据,根据SQL可实现各种自定义采集方式。可根据自增ID或时间等标志进行增量数据同步,也可根据业务需求进行自定义筛选同步。Logtail JDBC功能如下:
Logtail HTTP输入 可根据您的配置定期请求指定URL,将请求返回body值作为输入源上传到日志服务。通过该方式可采集各类以OpenApi方式提供接口的应用,例如Nginx status、kafka status、flink等。Logtail HTTP功能如下:
在程序日志输出时,为了保证后续处理,有一些通用的原则:
对于简单的系统,可以将所有的日志输出到同一个日志文件中,并通过不同的关键字进行区分。而对于复杂的系统,将不同需求的日志输出到不同的日志文件中是必要的,通过对不同类型的文件采用不同的日志格式(例如对于计费日志可以直接输出为Json格式),可以方便接入其他的子系统。
对于应用而言,可以分3个日志文件
/worker/app.log <-- 程序逻辑相关
/worker/access.log <-- 用户请求和访问相关
/worker/error.log <-- 错误日志
DEBUG日志和INFO日志的一个重要的区别是:INFO日志用于记录常规的系统运行状态,请求的基本的输入和输出等,对定位一般的问题已经足够了。而DEBUG日志则详细的记录了一个请求的处理过程,甚至是每一个函数的输入和输出结果,遇到一些隐藏比较深的问题时,必须要依赖DEBUG日志。
然而,由于DEBUG级别的日志数量比INFO级别的数量多很多(通常差一个数量级),如果长期在线上服务器开启DEBUG级别的日志输出,日志量太大。再比如,有时候仅仅是由于某一个用户的访问模式比较特殊导致了问题,如果将整个服务(特别是一个服务部署了很多台节点时)都临时调整为DEBUG级别日志输出,也非常不方便。
下面介绍集中动态日志控制技术:
根据请求控制
在业务处理层的Proxy中,实现如下逻辑:当接收到的HTTP请求的QueryString中包含"Level=Debug"参数时,就将所有的DEBUG级别的日志也输出:
在负载均衡层的Openresty中,实现如下接口:管理员可以配置将哪个用户的哪个桶的哪个对象的哪种操作(注:这是对象存储中的几个概念)输出为DEBUG日志,Openresty会对每个请求进行过滤,当发现请求和配置的DEBUG日志输出条件相匹配时,则在请求的QueryString中新增"Level=Debug"参数。
通过这种方式,管理员可以随时配置哪些请求需要输出为DEBUG级别的日志,可以大大提高线上定位问题的效率。
主动监控配置文件
进程通过Inotify等技术监控日志配置文件,例如Log4J.property,当配置文件有更新时(例如LogLevel发生变动),即可感知。
该方案可以在进程不重启的情况下完成配置更改与生效。
> 如果用户使用 spring,可以使用 org.springframework.web.util.Log4jConfigListener[http://www.cnblogs.com/Irving/archive/2013/02/28/2936810.html](http://www.cnblogs.com/Irving/archive/2013/02/28/2936810.html)
> 否则,使用 Log4j DOMConfigurator类的configureAndWatch方法[http://489291468.iteye.com/blog/1895471](http://489291468.iteye.com/blog/1895471)
动态配置服务器
例如所有服务器都实时与配置管理服务器(ConfigServer)互通,当配置有改动时会实时生效。