在容器中以DaemonSet模式安装Logtail后,可通过CRD方式创建Logtail采集配置采集容器日志。
前提条件
功能特点
- 只需配置容器内的日志文件路径,无需关心该路径到宿主机的映射。
- 支持通过容器Label白名单指定待采集的容器。
- 支持通过容器Label黑名单排除不要采集的容器。
- 支持通过环境变量白名单指定待采集的容器。
- 支持通过环境变量黑名单排除不要采集的容器。
- 支持采集多行日志(例如Java Stack日志)。
- 支持上报容器日志时自动关联Meta信息(例如容器名、镜像、Pod、Namespace、环境变量等)。
- 当容器运行于Kubernetes时,Logtail还具有以下功能。
- 支持通过Kubernetes Namespace名称、Pod名称、容器名称指定待采集的容器。
- 支持通过Kubernetes Label白名单指定待采集的容器。
- 支持通过Kubernetes Label黑名单排除不要采集的容器。
- 支持上报容器日志时自动关联Kubernetes Label信息。
实现原理

- 使用
kubectl
或其他工具应用AliyunLogConfig CRD。 - alibaba-log-controller监听到CRD配置更新。
- alibaba-log-controller根据CRD配置中的内容以及日志服务中Logtail采集配置的状态,自动向日志服务提交创建Logstore、创建Logtail采集配置以及应用机器组的请求。
- Logtail定期请求Logtail采集配置所在服务器,获取新的或已更新的Logtail采集配置并进行热加载。
- Logtail根据Logtail采集配置采集各个容器上的标准输出或文本日志。
- Logtail将采集到的容器日志发送给日志服务。
使用限制
- 文本日志采集限制
- 采集停止策略:当容器被停止后,Logtail监听到容器
die
的事件后会停止该容器日志的采集。如果此时采集出现延迟,则可能丢失停止前的部分日志。 - 不支持采集软链接:目前Logtail无法访问业务容器的软链接,请按真实路径配置采集目录。
- 如果业务容器的数据目录是通过数据卷(Volume)挂载的,则不支持采集它的父目录,需设置采集目录为完整的数据目录。
例如/var/log/service目录是数据卷挂载的路径,则设置采集目录为/var/log将采集不到该目录下的日志,需设置采集目录为/var/log/service。
- Kubernetes默认将宿主机根目录挂载到Logtail容器的
/logtail_host
目录。如果您要采集宿主机文本日志,则配置日志文件路径时,需加上/logtail_host
前缀。例如需要采集宿主机上
/home/logs/app_log/
目录下的日志,则设置日志路径为/logtail_host/home/logs/app_log/
。 - Docker存储驱动限制:目前只支持overlay、overlay2,其他存储驱动需将日志所在目录通过数据卷挂载为临时目录。
如果日志目录是以PVC方式挂载到NAS,则不支持使用Daemonset方式采集日志,建议使用Sidecar方式采集。
- 采集停止策略:当容器被停止后,Logtail监听到容器
- 标准输出采集限制
Docker容器引擎限制:目前标准输出采集仅支持JSON类型的日志驱动。
- 通用限制
Logtail支持Docker和Containerd两种容器引擎的数据采集,访问路径说明如下:
- Docker:Logtail通过/run/docker.sock访问Docker,请确保该路径存在且具备访问权限。
- Containerd:Logtail通过/run/containerd/containerd.sock访问Containerd,请确保该路径存在且具备访问权限。
创建Logtail采集配置
您只需要定义AliyunLogConfig CRD即可创建Logtail采集配置。创建完成后,系统自动应用该Logtail采集配置。如果您要删除Logtail采集配置只需删除对应的CRD资源即可。
查看Logtail采集配置
查看当前Kubernetes集群中所有的Logtail采集配置
kubectl get aliyunlogconfigs
命令进行查看,返回结果下图所示。
查看Logtail采集配置的详细信息和状态
您可以执行kubectl get aliyunlogconfigs config_name -o yaml
命令进行查看。其中,config_name为Logtail采集配置的名称,请根据实际情况替换。 返回结果如下图所示。
- 如果statusCode字段的值为200,表示应用Logtail采集配置成功。
- 如果statusCode字段的值为非200,表示应用Logtail采集配置失败。

Logtail采集配置示例(标准输出)
采集容器标准输出时,需将inputType设置为plugin
,并将具体信息填写到inputDetail
下的plugin
字段。具体的参数及其说明请参见通过DaemonSet-控制台方式采集容器标准输出。
示例1:通过极简模式采集容器标准输出
通过极简模式采集除环境变量为COLLECT_STDOUT_FLAG=false
之外的所有容器的标准输出(stdout和stderr)。其中,您可以登录容器所在的宿主机查看容器的环境变量。具体操作,请参见获取容器环境变量。CRD配置示例如下所示。
apiVersion: log.alibabacloud.com/v1alpha1
kind: AliyunLogConfig
metadata:
# 设置资源名,在当前Kubernetes集群内唯一。
name: simple-stdout-example
spec:
# 设置Logstore名称。如果您所指定的Logstore不存在,日志服务会自动创建。
logstore: k8s-stdout
# 设置Logtail采集配置。
logtailConfig:
# 设置采集的数据源类型。采集标准输出时,需设置为plugin。
inputType: plugin
# 设置Logtail采集配置的名称,必须与资源名(metadata.name)相同。
configName: simple-stdout-example
inputDetail:
plugin:
inputs:
-
# input type
type: service_docker_stdout
detail:
# 指定采集stdout和stderr。
Stdout: true
Stderr: true
# 设置环境变量黑名单,采集除环境变量为COLLECT_STDOUT_FLAG=false之外的所有容器的标准输出。
ExcludeEnv:
COLLECT_STDOUT_FLAG: "false"
示例2:通过极简模式采集容器标准输出,并使用正则模式处理容器标准输出
您可以登录容器所在的宿主机查看容器的环境变量。具体操作,请参见获取容器环境变量。
GF_INSTALL_PLUGINS=grafana-piechart-....
,您可以登录容器所在的宿主机进行查看。具体操作,请参见获取容器环境变量。
- CRD配置
apiVersion: log.alibabacloud.com/v1alpha1 kind: AliyunLogConfig metadata: # 设置资源名,在当前Kubernetes集群内唯一。 name: regex-stdout-example spec: # 设置Logstore名称。如果您所指定的Logstore不存在,日志服务会自动创建。 logstore: k8s-stdout-regex # 设置Logtail采集配置。 logtailConfig: # 设置采集的数据源类型。采集标准输出时,需设置为plugin。 inputType: plugin # 设置Logtail采集配置的名称,必须与资源名(metadata.name)相同。 configName: regex-stdout-example inputDetail: plugin: inputs: - # input type type: service_docker_stdout detail: # 指定只采集标准输出stdout,不采集标准错误stderr。 Stdout: true Stderr: false # 设置环境变量白名单,只采集容器环境变量中EnvKey为GF_INSTALL_PLUGINS的容器的标准输出。 IncludeEnv: GF_INSTALL_PLUGINS: '' processors: - # 指定正则模式解析所采集到的标准输出。 type: processor_regex detail: # 设置原始字段名。采集到的容器标准输出默认保存在content字段中。 SourceKey: content # 设置正则表达式,用于提取日志内容。 Regex: 't=(\d+-\d+-\w+:\d+:\d+\+\d+) lvl=(\w+) msg="([^"]+)" logger=(\w+) userId=(\w+) orgId=(\w+) uname=(\S*) method=(\w+) path=(\S+) status=(\d+) remote_addr=(\S+) time_ms=(\d+) size=(\d+) referer=(\S*).*' # 设置提取的字段列表。 Keys: ['time', 'level', 'message', 'logger', 'userId', 'orgId', 'uname', 'method', 'path', 'status', 'remote_addr', 'time_ms', 'size', 'referer'] # 保留原始字段。 KeepSource: true # 出现无匹配的原始字段时会报错。 NoKeyError: true # 正则表达式与原始字段的值不匹配时会报错。 NoMatchError: true
- 原始日志
t=2018-03-09T07:14:03+0000 lvl=info msg="Request Completed" logger=context userId=0 orgId=0 uname= method=GET path=/ status=302 remote_addr=172.16.64.154 time_ms=0 size=29 referer=
- 解析后的日志
Logtail采集配置示例(文本日志)
采集容器文本日志时,需将inputType
设置为file
,并将具体信息填写到inputDetail
内,具体字段及说明请参见通过DaemonSet-控制台方式采集容器文本日志。
示例1:通过极简模式采集容器文本日志
通过极简模式采集环境变量中包含EnvKey为ALIYUN_LOGTAIL_USER_DEFINED_ID
的容器的文本日志,日志文件路径为/data/logs/app_1/simple.LOG。
apiVersion: log.alibabacloud.com/v1alpha1
kind: AliyunLogConfig
metadata:
# 设置资源名,在当前Kubernetes集群内唯一。
name: simple-file-example
spec:
# 设置Logstore名称。如果您所指定的Logstore不存在,日志服务会自动创建。
logstore: k8s-file
# 设置Logtail采集配置。
logtailConfig:
# 设置采集的数据源类型。采集文本日志时,需设置为file。
inputType: file
# 设置Logtail采集配置的名称,必须与资源名(metadata.name)相同。
configName: simple-file-example
inputDetail:
# 指定通过极简模式采集文本日志。
logType: common_reg_log
# 设置日志文件所在路径。
logPath: /data/logs/app_1
# 设置日志文件的名称。支持通配符星号(*)和半角问号(?),例如log_*.log。
filePattern: simple.LOG
# 采集容器的文本日志时,需设置dockerFile为true。
dockerFile: true
# 设置环境变量白名单。只采集环境变量中包含EnvKey为ALIYUN_LOGTAIL_USER_DEFINED_ID
的容器的文本日志。
dockerIncludeEnv:
ALIYUN_LOGTAIL_USER_DEFINED_ID: ""
示例2:通过完整正则模式采集容器文本日志
某Java程序日志为多行日志,日志中包含错误堆栈信息。您可以通过完整正则模式进行采集,并在Logtail采集配置中指定置行首正则表达式。
- 日志样例
[2018-05-11T20:10:16,000] [INFO] [SessionTracker] [SessionTrackerImpl.java:148] Expiring sessions java.sql.SQLException: Incorrect string value: '\xF0\x9F\x8E\x8F",...' for column 'data' at row 1 at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:84) at org.springframework.jdbc.support.AbstractFallbackSQLException
- CRD配置
apiVersion: log.alibabacloud.com/v1alpha1 kind: AliyunLogConfig metadata: # 设置资源名,在当前Kubernetes集群内唯一。 name: regex-file-example spec: # 设置Logstore名称。如果您所指定的Logstore不存在,日志服务会自动创建。 logstore: k8s-file logtailConfig: # 设置采集的数据源类型。采集文本日志时,需设置为file。 inputType: file # 设置Logtail采集配置的名称,必须与资源名(metadata.name)相同。 configName: regex-file-example inputDetail: # 指定通过完整正则模式采集文本日志。 logType: common_reg_log # 设置日志文件的路径。 logPath: /app/logs # 设置日志文件的名称。支持通配符星号(*)和半角问号(?),例如log_*.log。 filePattern: error.LOG # 设置用于匹配日志行首的行首正则表达式。 logBeginRegex: '\[\d+-\d+-\w+:\d+:\d+,\d+]\s\[\w+]\s.*' # 设置正则表达式,用于提取日志内容。 regex: '\[([^]]+)]\s\[(\w+)]\s\[(\w+)]\s\[([^:]+):(\d+)]\s(.*)' # 设置提取的字段列表。 key : ["time", "level", "method", "file", "line", "message"] # 使用完整正则模式采集日志时,默认从日志的time字段中提取时间。如果无需提取时间,可不设置该字段。如果您设置了timeFormat字段,则需配置adjustTimezone字段和logTimezone字段。 timeFormat: '%Y-%m-%dT%H:%M:%S' # 由于Logtail默认工作在零时区,因此需通过如下配置,强制设置时区。 adjustTimezone: true # 设置时区偏移量。日志时间为东八区,如果是其他时区,请调整该值。 logTimezone: "GMT+08:00" # 解析失败时,上传原始日志。 discardUnmatch: false # 采集容器的文本日志时,需设置dockerFile为true。 dockerFile: true # 设置环境变量白名单。只采集环境变量中包含EnvKey为ALIYUN_LOGTAIL_USER_DEFINED_ID的容器的文本日志。 dockerIncludeEnv: ALIYUN_LOGTAIL_USER_DEFINED_ID: ""
- 采集到的日志样例
示例3:通过分隔符模式采集容器文本日志
如果您要采集的容器文本日志中有明确的分隔符,您可以使用通过分隔符模式采集容器文本日志。分隔符日志以换行符为边界,每一行都是一条日志。分隔符日志使用分隔符将一条日志分割成多个字段。
apiVersion: log.alibabacloud.com/v1alpha1
kind: AliyunLogConfig
metadata:
# 设置资源名,在当前Kubernetes集群内唯一。
name: delimiter-file-example
spec:
# 设置Logstore名称。如果您所指定的Logstore不存在,日志服务会自动创建。
logstore: k8s-file
logtailConfig:
# 设置采集的数据源类型。采集文本日志时,需设置为file。
inputType: file
configName: delimiter-file-example
# 设置Logtail采集配置的名称,必须与资源名(metadata.name)相同。
inputDetail:
# 指定通过分隔符模式采集日志。
logType: delimiter_log
# 设置日志文件的路径。
logPath: /usr/local/ilogtail
# 设置日志文件的名称。支持通配符星号(*)和半角问号(?),例如log_*.log。
filePattern: delimiter_log.LOG
# 设置分隔符。
separator: '|&|'
# 设置提取的字段列表。
key : ['time', 'level', 'method', 'file', 'line', 'message']
# 设置时间字段。
timeKey: 'time'
# 使用分隔符模式采集日志时,默认从日志的time字段中提取时间。如果无需提取时间,可不设置该字段。如果您设置了timeFormat字段,则需配置adjustTimezone字段和logTimezone字段。
timeFormat: '%Y-%m-%dT%H:%M:%S'
# 由于Logtail默认工作在零时区,因此需通过如下配置,强制设置时区。
adjustTimezone: true
# 设置时区偏移量。日志时间为东八区,如果是其他时区,请调整该值。
logTimezone: "GMT+08:00"
# 解析失败时,上传原始日志。
discardUnmatch: false
# 采集容器的文本日志时,需设置dockerFile为true。
dockerFile: true
# 设置环境变量白名单。只采集环境变量中包含EnvKey为ALIYUN_LOGTAIL_USER_DEFINED_ID的容器的文本日志。
dockerIncludeEnv:
ALIYUN_LOGTAIL_USER_DEFINED_ID: ''
示例4:通过JSON模式采集容器文本日志
如果您要采集的容器文本日志为Object类型的JSON日志,则您可以使用JSON模式进行采集。
- 原始日志
{"url": "POST /PutData?Category=YunOsAccountOpLog&AccessKeyId=U0Ujpek********&Date=Fri%2C%2028%20Jun%202013%2006%3A53%3A30%20GMT&Topic=raw&Signature=pD12XYLmGxKQ%2Bmkd6x7hAgQ7b1c%3D HTTP/1.1", "ip": "10.200.98.220", "user-agent": "aliyun-sdk-java", "request": {"status": "200", "latency": "18204"}, "time": "05/Jan/2020:13:30:28"}
- CRD配置
apiVersion: log.alibabacloud.com/v1alpha1 kind: AliyunLogConfig metadata: # 设置资源名,在当前Kubernetes集群内唯一。 name: json-file-example spec: # 设置Logstore名称。如果您所指定的Logstore不存在,日志服务会自动创建。 logstore: k8s-file logtailConfig: # 设置采集的数据源类型。采集文本日志时,需设置为file。 inputType: file # 设置Logtail采集配置的名称,必须与资源名(metadata.name)相同。 configName: json-file-example inputDetail: # 指定通过JSON模式采集日志。 logType: json_log # 设置日志文件的路径。 logPath: /usr/local/ilogtail # 设置日志文件的名称。支持通配符星号(*)和半角问号(?),例如log_*.log。 filePattern: json_log.LOG # 设置时间字段,如果无指定需求,则设置为timeKey: ''。 timeKey: 'time' # 设置时间格式。如果无指定需求,则设置为timeFormat: ''。 timeFormat: '%Y-%m-%dT%H:%M:%S' # 采集容器的文本日志时,需设置dockerFile为true。 dockerFile: true # 设置环境变量白名单。只采集环境变量中包含EnvKey为ALIYUN_LOGTAIL_USER_DEFINED_ID的容器的文本日志。 dockerIncludeEnv: ALIYUN_LOGTAIL_USER_DEFINED_ID: ""