网易开源的云原生日志收集工具 - Loggie
Loggie 是网易和中国工商银行联合发起的一个基于 Golang 的轻量级、高性能、云原生日志采集 Agent和中转处理 Aggregator 开源项目,支持多 Pipeline 和组件热插拔,提供了:
🔨 一栈式日志解决方案:同时支持日志中转、过滤、解析、切分、日志报警等
☁ 云原生的日志形态:快速便捷的容器日志采集方式,原生的 Kubernetes动态配置下发
🔑 生产级的特性:Loggie 吸收了我们长期的大规模运维经验,形成了全方位的可观测性、快速排障、异常预警、自动化运维能力
结合网易数帆长期的业务实践,Loggie形成了如下几大特点:
可扩展、热插拔:配置不同的 Source/Interceptor/Sink,拥有中转、过滤、解析、切分、日志报警等能力,可使用 Golang 快速自研插件
强隔离:多 Pipeline 设计,减少互相干扰,可同时发送多个不同数据源
轻量级、高性能:基于 Golang,极少的资源占用,强大的吞吐性能
可靠性保障:完善的日志可观测性,原生 Prometheus metrics 支持,还有限流等 Interceptor
云原生:配置中心集成 Kubernetes,创建 CRD 实例即可采集容器日志
同时,基于Loggie的流式数据传输设计,我们可以灵活使用 Loggie 的Pipeline。
从使用形态上可划分为:
Agent 形态:每个节点一个或者每个Pod一个,用于采集日志或者其他数据
Aggregator 形态:用于中转、转发和处理,可独立部署成集群
可以应用在:
数据采集:采集容器日志、节点日志,采集Prometheus metrics、Kubernetes Events 等
数据中转:作为中转机去做数据的聚合、转发、分流
数据处理:进行流式数据的切分、转换、处理
日志报警:进行异常日志的检测与报警
......
此外,利用 Loggie 的设计,用户也可以快速开发一个 Source、Sink 或Interceptor 组件,复用Loggie的能力,避免大量重复的开发工作。
下图是 Loggie 和其他日志采集工具的功能对比:
下面我们演示在一个 Kubernetes 集群中,通过创建 LogConfig CRD 快速采集 Pod 的日志。
首先部署 Loggie DaemonSet,可以选择使用 Helm Chart 进行安装。
helm pull https://github.com/loggie-io/installation/releases/download/v1.0.0/loggie-v1.0.0.tgz && tar xvzf loggie-v1.0.0.tgz
helm install loggie ./loggie -nloggie --create-namespace
也可以直接部署:
helm install loggie -n loggie --create-namespace https://github.com/loggie-io/installation/releases/download/v1.0.0/loggie-v1.0.0.tgz
接下来就可以采集日志了,Loggie 定义了 Kubernetes CRD LogConfig,一个 LogConfig 表示采集一类 Pods 的日志采集任务。比如现在我们有一个 nginx 应用需要被采集日志:
kubectl create deploy nginx --image=nginx
先要定义输出源 Sink,使用 Loggie 定义的 Sink CRD 来定义,表明日志发送的后端。为了方便演示,这里我们将日志发送至 Loggie Agent 自身的日志中并打印。
cat << EOF | kubectl apply -f -
apiVersion: loggie.io/v1beta1
kind: Sink
metadata:
name: default
spec:
sink: |
type: dev
printEvents: true
EOF
可以通过 kubectl get sink 查看到已创建的 Sink。接下来就需要定义采集任务了,使用 Loggie 定义的 LogConfig 这个 CRD,表示一个日志采集任务,我们创建一个 LogConfig 示例如下所示:
cat << EOF | kubectl apply -f -
apiVersion: loggie.io/v1beta1
kind: LogConfig
metadata:
name: nginx
namespace: default
spec:
selector:
type: pod
labelSelector:
app: nginx
pipeline:
sources: |
type: file
name: mylog
paths:
stdout
sinkRef: default
EOF
创建完之后,我们可以使用 kubectl get lgc 查看到创建的 CRD 实例。同时,我们还可以通过 kubectl describe lgc nginx 查看 LogConfig 的事件,以获取最新的状态。
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal syncSuccess 52s loggie/kind-control-plane Sync type pod [nginx-6799fc88d8-5cb67] success
上面的 nginx LogConfig 通过其中的 spec.selector 来匹配采集哪些 Pod 的日志,这里我们使用 app: nginx 选择了刚才创建的 nginx Pod。spec.pipeline 则表示 Loggie 的 Pipeline 配置,我们只采集容器标准输出的日志,所以在 paths 中填写 stdout 即可。
现在我们就可以来查看日志了,首先找到所在的nginx pod节点:
kubectl get po -owide -l app=nginx
然后我们找到该节点的 Loggie:
kubectl -nloggie get po -owide |grep ${node}
可以通过:
kubectl -nloggie logs -f ${logge-pod}
然后就可以查看 Loggie 打印出的日志,正常里面展示了采集到的 nginx 标准输出日志。
关于 Loggie 的更多使用可以查看官方文档了解更多 https://loggie-io.github.io/docs/。
仓库地址:https://github.com/loggie-io/loggie