用户不仅可以 使用控制台配置日志采集,还可通过自定义资源定义(CustomResourceDefinitions,CRD)的方式配置日志采集。CRD 支持采集容器标准输出、容器文件和主机文件,支持多种日志采集格式。支持投递到 CLS 和 CKafka 等不同消费端。
已在容器服务控制台的 功能管理 中开启日志采集,详情参见 开启日志采集。
您只需要定义 LogConfig CRD 即可创建采集配置,log-agent 根据 LogConfig CRD 的变化修改相应的日志服务 CLS 日志主题,并设置绑定的机器组。CRD 的格式如下:
apiVersion: cls.cloud.tencent.com/v1
kind: LogConfig ## 默认值
metadata:
name: test ## CRD资源名,在集群内唯一
spec:
clsDetail:
# 注意:topic指定后不允许修改
# 自动创建日志主题,需要同时指定日志集和主题的name
logsetName: test ## CLS日志集的name,若无该name的日志集,会自动创建,若有,会在该日志集下创建日志主题
topicName: test ## CLS日志主题的name,若无该name的日志主题,会自动创建
# 选择已有日志主题
topicId: xxxxxx-xx-xx-xx-xxxxxxxx ## CLS日志主题的ID,日志主题需要在CLS中提前创建,且没有被其它采集配置占用
logType: minimalist_log ## 日志采集格式,json_log代表 json 格式,delimiter_log代表分隔符格式,minimalist_log代表单行全文格式,multiline_log代表多行全文格式,fullregex_log代表完全正则格式
extractRule: ## 提取、过滤规则
...
inputDetail:
type: container_stdout ## 采集日志的类型,包括container_stdout(容器标准输出)、container_file(容器文件)、host_file(主机文件)
containerStdout: ## 容器标准输出
namespace: default ## 采集容器的kubernetes命名空间,如果不指定,代表所有命名空间
allContainers: false ## 是否采集指定命名空间中的所有容器的标准输出
container: xxx ## 采集日志的容器名,为空时,代表采集所有符合容器的日志名
includeLabels: ## 采集包含指定label的Pod
k8s-app: xxx ## 只采pod标签中配置"k8s-app=xxx"的pod产生的日志,与workloads、allContainers=true不能同时指定
workloads: ## 要采集的容器的Pod所属的kubernetes workload
- namespace: prod ## workload的命名空间
name: sample-app ## workload的名字
kind: deployment ## workload类型,支持deployment、daemonset、statefulset、job、cronjob
container: xxx ## 要采集的容器名,如果不指定,代表workload Pod中的所有容器
containerFile: ## 容器内文件
namespace: default ## 采集容器的kubernetes命名空间,必须指定一个命名空间
container: xxx ## 采集日志的容器名,为 * 时,代表采集所有符合容器的日志名
includeLabels: ## 采集包含指定label的Pod
k8s-app: xxx ## 只采pod标签中配置"k8s-app=xxx"的pod产生的日志,与workload不能同时指定
workload: ## 要采集的容器的Pod所属的kubernetes workload
name: sample-app ## workload的名字
kind: deployment ## workload类型,支持deployment、daemonset、statefulset、job、cronjob
logPath: /opt/logs ## 日志文件夹,不支持通配符
filePattern: app_*.log ## 日志文件名,支持通配符 * 和 ? ,* 表示匹配多个任意字符,? 表示匹配单个任意字符
hostFile: ## 主机文件
logPath: /opt/logs ## 日志文件夹,支持通配符
filePattern: app_*.log ## 日志文件名,支持通配符 * 和 ? ,* 表示匹配多个任意字符,? 表示匹配单个任意字符
customLablels:
k1: v1
注意如果选择采集类型为“容器文件路径”时,对应的“容器文件路径”不能为软链接,否则会导致软链接的实际路径在采集器的容器内不存在,采集日志失败。
单行全文日志是指一行日志内容为一条完整的日志。日志服务在采集的时候,将使用换行符 \n
来作为一条日志日志的结束符。为了统一结构化管理,每条日志都会存在一个默认的键值 __CONTENT__
,但日志数据本身不再进行日志结构化处理,也不会提取日志字段,日志属性的时间项由日志采集的时间决定。详情请参见 单行全文格式。
假设一条日志原始数据为:
Tue Jan 22 12:08:15 CST 2019 Installed: libjpeg-turbo-static-1.2.90-6.el7.x86_64
apiVersion: cls.cloud.tencent.com/v1
kind: LogConfig
spec:
clsDetail:
topicId: xxxxxx-xx-xx-xx-xxxxxxxx
# 单行日志
logType: minimalist_log
__CONTENT__:Tue Jan 22 12:08:15 CST 2019 Installed: libjpeg-turbo-static-1.2.90-6.el7.x86_64
当前支持通过配置 CRD 采集 TKE 上的 Pod 日志至自建 Kafka 或者 CKafka,需要按如下配置自行定义日志源及日志消费端,CRD 配置完成后,日志采集器会按规则进行日志采集。
CRD 具体配置如下:
apiVersion: cls.cloud.tencent.com/v1
kind: LogConfig ## 默认值
metadata:
name: test ## CRD资源名,在集群内唯一
spec:
kafkaDetail:
kafkaType: ## 必填,kafka 类型,“ckafka” 表示ckafka,“” 表示自建 kafka
type: string
instanceId: ## ckafka实例ID
type: string
brokers: xxxxxx ## 必填,broker地址,一般是域名:端口,多个地址以“,”分隔
topic: xxxxxx ## 必填,topic名称
messageKey: ## 选填,指定pod字段作为key上传到指定分区
valueFrom:
fieldRef:
fieldPath: metadata.name
timestampKey: ## 时间戳的key,默认是@timestamp
timestampFormat: ## 时间戳的格式,默认是double
inputDetail:
type: container_stdout ## 采集日志的类型,包括container_stdout(容器标准输出)、container_file(容器文件)
containerStdout: ## 容器标准输出
namespace: default ## 采集容器的kubernetes命名空间,如果不指定,代表所有命名空间
allContainers: false ## 是否采集指定命名空间中的所有容器的标准输出
container: xxx ## 采集日志的容器名,此处可不填
includeLabels: ## 采集包含指定label的Pod
k8s-app: xxx ## 只采pod标签中配置"k8s-app=xxx"的pod产生的日志,与workloads、allContainers=true不能同时指定
workloads: ## 要采集的容器的Pod所属的kubernetes workload
- namespace: prod ## workload的命名空间
name: sample-app ## workload的名字
kind: deployment ## workload类型,支持deployment、daemonset、statefulset、job、cronjob
container: xxx ## 要采集的容器名,如果填空,代表workload Pod中的所有容器
containerFile: ## 容器内文件
namespace: default ## 采集容器的kubernetes命名空间,必须指定一个命名空间
container: xxx ## 采集日志的容器名,此处可填*
includeLabels: ## 采集包含指定label的Pod
k8s-app: xxx ## 只采pod标签中配置"k8s-app=xxx"的pod产生的日志,与workload不能同时指定
workload: ## 要采集的容器的Pod所属的kubernetes workload
name: sample-app ## workload的名字
kind: deployment ## workload类型,支持deployment、daemonset、statefulset、job、cronjob
logPath: /opt/logs ## 日志文件夹,不支持通配符
filePattern: app_*.log ## 日志文件名,支持通配符 * 和 ? ,* 表示匹配多个任意字符,? 表示匹配单个任意字符
...
apiVersion: cls.cloud.tencent.com/v1
kind: LogConfig
spec:
inputDetail:
type: container_stdout
containerStdout:
namespace: default
allContainers: true
...
apiVersion: cls.cloud.tencent.com/v1
kind: LogConfig
spec:
inputDetail:
type: container_stdout
containerStdout:
allContainers: false
workloads:
- namespace: production
name: ingress-gateway
kind: deployment
...
apiVersion: cls.cloud.tencent.com/v1
kind: LogConfig
spec:
inputDetail:
type: container_stdout
containerStdout:
namespace: production
allContainers: false
includeLabels:
k8s-app: nginx
...
/data/nginx/log/
路径下名为 access.log
的文件apiVersion: cls.cloud.tencent.com/v1
kind: LogConfig
spec:
topicId: xxxxxx-xx-xx-xx-xxxxxxxx
inputDetail:
type: container_file
containerFile:
namespace: production
workload:
name: ingress-gateway
type: deployment
container: nginx
logPath: /data/nginx/log
filePattern: access.log
...
/data/nginx/log/
路径下名为 access.log
的文件apiVersion: cls.cloud.tencent.com/v1
kind: LogConfig
spec:
inputDetail:
type: container_file
containerFile:
namespace: production
includeLabels:
k8s-app: ingress-gateway
container: nginx
logPath: /data/nginx/log
filePattern: access.log
...
/data/
路径下所有 .log
文件apiVersion: cls.cloud.tencent.com/v1
kind: LogConfig
spec:
inputDetail:
type: host_file
hostFile:
logPath: /data
filePattern: *.log
...
容器标准输出(container_stdout)以及容器文件(container_file),除原始的日志内容外,还需携带容器场景的元数据(例如产生日志的容器 ID)一起上报至日志服务。方便用户查看日志时追溯来源或根据容器标识、特征(例如容器名及 labels)进行检索。
元数据如下表:
字段名 | 含义 |
---|---|
cluster_id | 日志所属的集群 ID。 |
container_name | 日志所属的容器名称。 |
container_id | 日志所属的容器 ID。 |
image_name | 日志所属容器的镜像名称 IP。 |
namespace | 日志所属 Pod 的 namespace。 |
pod_uid | 日志所属 Pod 的 UID。 |
pod_name | 日志所属 Pod 的名字。 |
pod_ip | 日志所属 Pod 的 IP。 |
pod_lable_{label name} | 日志所属 Pod 的 label(例如一个 Pod 带有两个 label:app=nginx,env=prod, 则在上传的日志会附带两个 metedata:pod_label_app:nginx,pod_label_env:prod)。 |
本页内容是否解决了您的问题?