采集原理
通过 DaemonSet 模式在每个 node 上运行 logtail client,客户端启动后加入指定 machine-group,通过 docker.sock 与 ecs 上的 docker daemon 通讯,通过检索 container 环境变量来查找符合采集规则的 container,以及定位内部文件和容器 stdout 日志,在通过监听内核 inotify 事件来进行日志文件变化监听。
Pod 日志接入模式(环境变量注入)
通过在pod中注入环境变量aliyun_logs_{key} 来接入aliyun SLS日志系统,如未指定project 则使用在DaemonSet 模式默认部署的 logtail 默认配置。
logtail-ds configMap
采集插件安装不再赘述
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| apiVersion: v1 data: cpu-core-limit: "2" log-ali-uid: "163139xxxxxxxx497" log-config-path: /etc/ilogtail/conf/cn-hangzhou/ilogtail_config.json log-endpoint: cn-hangzhou-intranet.log.aliyuncs.com log-machine-group: k8s-group-cbe7f0d404866409exxxxxxcefeda log-project: k8s-log-c79a7ce35db39488xxxxxx9432e53e6 max-bytes-per-sec: "209715200" mem-limit: "512" send-requests-concurrency: "20" kind: ConfigMap metadata: name: alibaba-log-configuration namespace: kube-system
|
环境变量
| 支持的环境变量 |
|
|
| aliyun_logs_{key} |
必选项。{key}只能包含小写字母、数字和-。若不存在aliyun_logs_{key}_logstore,则默认创建并采集到名为{key}的logstore。当值为stdout表示采集容器的标准输出;其他值为容器内的日志路径。 |
默认采集方式为极简模式, {key}需保持在K8s集群内唯一。 |
| aliyun_logs_{key}_tags |
可选。值为{tag-key}={tag-value}类型,用于对日志进行标识。 |
- |
| aliyun_logs_{key}_project |
可选。值为指定的日志服务Project。当不存在该环境变量时为您安装时所选的Project。 |
Project需与您的Logtail工作所在Region一致。 |
| aliyun_logs_{key}_logstore |
可选。值为指定的日志服务Logstore。当不存在该环境变量时Logstore和{key}一致。 |
- |
| aliyun_logs_{key}_shard |
可选。值为创建Logstore时的shard数,有效值为1~10。当不存在该环境变量时值为2。 |
- |
| aliyun_logs_{key}_ttl |
可选。值为指定的日志保存时间,有效值为1~3650。当取值为3650时,指定日志的保存时间为永久保存。当不存在该环境变量时,默认指定日志的保存时间为90天。 |
- |
| aliyun_logs_{key}_machinegroup |
可选。值为应用的机器组。当不存在该环境变量时与安装Logtail的默认机器组一致。 |
- |
Example
Step1
创建测试容器,并注入环境变量
1 2 3 4 5 6 7 8 9 10 11 12
| template: metadata: creationTimestamp: null labels: app.kubernetes.io/instance: xiemx-training app.kubernetes.io/name: xiemx-training spec: containers: - env: - name: aliyun_logs_xiemx-training-stdout-log value: stdout image: nginx:1.16.0
|
Step 2
此时阿里云SLS日志服务中即会创建logStore,默认 logtail 为极简模式,日志未进行解析。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| { "inputs": [ { "detail": { "IncludeEnv": { "aliyun_logs_xiemx-training-stdout-log": "stdout" }, "Stderr": true, "Stdout": true }, "type": "service_docker_stdout" } ] }
|
Step 3
进行日志拆分极细,aliyun支持多种解析插件,当前使用自定义的正则来演示,logtail 配置如下。
插件可参考:https://help.aliyun.com/document_detail/64957.html?spm=a2c4g.11186623.6.640.60a31de3orfOsD
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| { "inputs": [ { "detail": { "IncludeEnv": { "aliyun_logs_xiemx-training-stdout-log": "stdout" }, "Stderr": true, "Stdout": true }, "type": "service_docker_stdout" } ], "processors": [ { "detail": { "KeepSource": true, "NoMatchError": true, "Keys": [ "remote_addr", "time", "http_method", "request_uri", "status_code", "body_bytes_sent", "http_referer", "user_agent", "http_x_forwarded_for" ], "SourceKey": "content", "Regex": "(\\S+) \\S+ \\S+ \\[(\\S+) \\S+\\] \"([A-Z]+) (.*)\" (\\d+) (\\S+) \"(\\S+)\" \"(.*)\" \"(.*)\"", "NoKeyError": true }, "type": "processor_regex" } ] }
|
需要注意:当使用 regex 进行分组时,请务必不要使用 (()()) 类似嵌套表达式会导致日志解析结果和 Key 对应关系错乱,日志数据混乱。如下例子:
Step 4
此时如果正则解析无问题的情况下即可查看拆分后的日志,如没有查看到拆分的日志,可点击诊断按钮查看客户端错误进行debug。