日志
日志级别
https://github.com/golang/glog,是 google 提供的一个不维护的日志库,glog 有其他语言的一些版本,对我当时使用 log 库有很大的影响。它包含如下日志级别:
- Info
- Warning
- Error
- Fatal(会中断程序执行)
还有类似 log4go,loggo,zap 等其他第三方日志库,他们还提供了设置日志级别的可见行,一般提供日志级别:
- Trace
- Debug
Info - Warning
- Error
- Critical
Fatal
记录消息后,直接调用 os.Exit(1),这意味着:
- 在其他 goroutine defer 语句不会被执行;
- 各种 buffers 不会被 flush,包括日志的;
- 临时文件或者目录不会被移除;
- 不要使用 fatal 记录日志,而是向调用者返回错误。如果错误一直持续到 main.main。main.main 那就是在退出之前做处理任何清理操作的正确位置。
日志选型
一个完整的集中式日志系统,需要包含以下几个主要特点:
- 收集-能够采集多种来源的日志数据;
- 传输-能够稳定的把日志数据传输到中央系统;
- 存储-如何存储日志数据;
- 分析-可以支持 UI 分析;
- 警告-能够提供错误报告,监控机制;
开源界鼎鼎大名 ELK stack,分别表示:Elasticsearch , Logstash, Kibana , 它们都是开源软件。
新增了一个 FileBeat,它是一个轻量级的日志收集处理工具(Agent),Filebeat 占用资源少,适合于在各个服务器上搜集日志后传输给 Logstash,官方也推荐此工具。
1. Logstash + Elasticsearch
此架构由 Logstash 分布于各个节点上搜集相关日志、数据,并经过分析、过滤后发送给远端服务器上的 Elasticsearch 进行存储。
Elasticsearch 将数据以分片的形式压缩存储并提供多种 API 供用户查询,操作。用户亦可以更直观的通过配置 Kibana Web方便的对日志查询,并根据数据生成报表。
因为 logstash 属于 server 角色,必然出现流量集中式的热点问题,因此我们不建议使用这种部署方式,同时因为 还需要做大量 match 操作(格式化日志),消耗的 CPU 也很多,不利于 scale out。
2.Logstash Agent + Kafka + Logstash + Elasticsearch + Kibana
此种架构引入了消息队列机制,位于各个节点上的 Logstash Agent 先将数据/日志传递给 Kafka,并将队列中消息或数据间接传递给 Logstash,Logstash 过滤、分析后将数据传递给Elasticsearch 存储。最后由 Kibana 将日志和数据呈现给用户。因为引入了 Kafka,所以即使远端 Logstash server 因故障停止运行,数据将会先被存储下来,从而避免数据丢失。
更进一步的:
将收集端 logstash 替换为 beats,更灵活,消耗资源更少,扩展性更强。
阿里云日志
在集群内直接采集容器 stdout
日志系统:设计目标
接入方式收敛;
日志格式规范;
日志解析对日志系统透明;
系统高吞吐、低延迟;
系统高可用、容量可扩展、高可运维性;
日志系统:格式规范
JSON作为日志的输出格式:
time: 日志产生时间,ISO8601格式;
level: 日志等级,ERROR、WARN、 INFO、DEBUG;
app_id: 应用id,用于标示日志来源;
instance_id: 实例 id,用于区分同一应用不同实例,即 hostname;
日志系统 - 设计与实现
日志从产生到可检索,经历几个阶段:
生产 & 采集
传输 & 切分
存储 & 检索
日志系统:采集
logstash:
监听tcp/udp
适用于通过网络上报日志的方式
filebeat:
直接采集本地生成的日志文件
适用于日志无法定制化输出的应用
logagent:
物理机部署,监听unixsocket
日志系统提供各种语言SDK
直接读取本地日志文件
日志系统 - 切分
从kafka消费日志,解析日志,写入elasticsearch
bili-index: 自研,golang开发,逻辑简单,性能 高, 可定制化方便。
• 日志规范产生的日志(log agent收集)
logstash: es官方组件,基于jruby开发,功能强大, 资源消耗高,性能低。
• 处理未按照日志规范产生的日志(filebeat、logstash 收集),需配置各种日志解析规则。
日志系统 - 存储和检索
elasticsearch多集群架构:
- 日志分级、高可用
单数据集群内:
- master node + data node(hot/stale) + client node
- 每日固定时间进行热->冷迁移
- Index 提前一天创建,基于 template 进行mapping 管理
- 检索基于 kibana
日志系统 - 容器日志采集
容器内应用日志采集:
基于 overlay2,直接从物理机上查找对应日志文件