一、前提条件
1. 在自建 K8s 集群上安装日志采集组件。安装方法请参见 自建 K8s 集群安装 LogListener。如需升级组件,请参见 LogListener 升级指南中的“升级自建 K8s 集群日志采集组件”。
2. 配置好相应的日志上报权限,权限配置请参见 使用自建 K8S 上传数据。
3. 已获取日志主题所在地域(region)。详细 CLS 地域列表请参见 可用地域。
二、K8S 日志采集原理
K8S 集群上部署日志采集主要涉及 Log-Provisioner、Log-Agent、LogListener 三个组件和一个 LogConfig 采集配置。
·LogConfig:日志采集配置,定义了日志在哪里被采集,采集后如何解析,以及解析后投递至哪个 CLS 日志主题中。
·Log-Agent:监听 LogConfig 和节点上容器的变化,动态计算容器中的日志文件在节点宿主机上的实际位置。
·Log-Provisioner:将 LogConfig 中定义日志采集配置信息同步至 CLS。
·LogListener:采集节点宿主机上的相应日志文件内容,解析并上传至 CLS。
三、操作流程
1. 自建 K8S 集群安装 LogListener
2. 定义 LogConfig 对象
3. 创建 LogConfig 对象
4. 查看 LogConfig
四、步骤1: 自建 K8S 集群安装 LogListener
首先,你需要在自建 Kubernetes 集群上安装 LogListener 组件,从而将日志收集到 CLS。详情请参见 自建 K8S 集群安装 LogListener。
五、步骤2:定义 LogConfig 对象
通过 CRD 定义 LogConfig 对象中的日志采集配置。以 Master 节点路径/usr/local/为例,使用 wget 命令下载 LogConfig.yaml CRD 声明文件。
wget https://mirrors.tencent.com/install/cls/k8s/LogConfig.yaml
LogConfig.yaml 声明文件主要分为如下两部分:
·clsDetail:日志采集配置。
·inputDetail:日志源配置。
apiVersion: cls.cloud.tencent.com/v1kind: LogConfig ## 默认值metadata: name: test ## CRD资源名,在集群内唯一spec: clsDetail: ## 投递到CLS的配置 … inputDetail: ## 日志源配置 …
六、clsDetail(CLS 采集配置)字段说明
clsDetail: ### 指定日志集和日志主题 logsetName: test ## CLS 日志集的 name,非必填。若无该 logsetName 的日志集,会自动创建;若有,会在该日志集下创建日志主题 topicName: test ## CLS 日志主题的 name,非必填。若在 logsetName 下没有该name的日志主题,会自动创建。 ## logsetName 和 topicName 指定之后,不指定 logsetId 和 topicId,会尝试自动创建日志主题;否则不会去创建 topic。 logsetId: xxxxxx-xx-xx-xx-xxxxxxxx ## CLS 日志集的 ID,非必填, topicId: xxxxxx-xx-xx-xx-xxxxxxxx ## CLS 日志主题的 ID,非必填。如果不填 topicId,则必须填 logsetName 和 topicName,并且会尝试去自动创建 topic,并将创建后的 topic 的 topicId 填在该字段 ### 自动创建日志主题时,定义日志主题配置。 定义后不可修改,修改不生效 period: 30 ## 非必填,生命周期,单位天,可取值范围1~3600,低频存储取值范围7~3600天;取值为3640时代表永久保存 storageType: hot ## 非必填,日志主题的存储类型,可选值 hot(标准存储),cold(低频存储);默认为 hot。 hotPeriod: 7 ## 非必填,沉降周期,单位天。可取值范围7~3600。仅在 storageType:hot 时生效,hotPeriod 需要大于 period,沉降的周期为 Period-hotPeriod partitionCount: 1 ## 非必填,日志主题分区个数。默认创建1个,最大支持创建10个分区。 autoSplit: "true" ## 非必填,是否开启自动分裂,默认值为 true。值必须以双引号""包裹 maxSplitPartitions: 50 ## 非必填,开启自动分裂后的最大分裂数量。默认值为50 tags: ## 非必填,标签描述列表,通过指定该参数可以同时绑定标签到相应的日志主题。最大支持9个标签键值对,同一个资源只能绑定到同一个标签键下。 – key: xxx ## 标签 key value: xxx ## 标签 value ### 定义采集规则 logType: json_log ## 日志解析格式,json_log 代表 json 格式,delimiter_log 代表分隔符格式,minimalist_log 代表单行全文格式,multiline_log 代表多行全文格式,fullregex_log 代表单行完全正则格式,multiline_fullregex_log 代表多行完全正则格式,user_define_log 代表组合解析。默认为 minimalist_log excludePaths: ## 非必填,采集黑名单路径列表。仅在 inputDetail 为 containerFile 或 hostFile 时生效 – type: File ## 类型,选填 File 或 Path value: /xx/xx/xx/xx.log ## type 对应的值 userDefineRule: xxxxxx ## 非必填,用户自定义采集规则,Json 格式序列化的字符串 ### 提取、过滤规则 extractRule: ## 非必填,提取、过滤规则。如果设置了 ExtractRule,则必须设置 LogType,详情参考 extractRule 对象说明 timeKey: xxx ## 时间字段的 key 名字,time_key 和 time_format 必须成对出现 timeFormat: xxx ## 时间字段的格式,参考 c 语言的 strftime 函数对于时间的格式说明输出参数 delimiter: xxx ## 分隔符类型日志的分隔符,只有 log_type 为 delimiter_log 时有效 logRegex: xxx ## 整条日志匹配规则,只有 log_type 为 fullregex_log 时有效 beginningRegex: xxx ## 行首正则匹配规则,只有 log_type 为 multiline_log 或 fullregex_log 时有效 keys: ## 取的每个字段的 key 名字,为空的 key 代表丢弃这个字段,只有 log_type 为 delimiter_log 时有 – a – b filterKeys: ## 与 filterRegex 要对应,filterKeys 是数组,表示需要过滤的日志的 key – a – b filterRegex: ## 与 filterKeys 要对应,filterRegex 是正则字符串数组,key 对应的过滤规则 regex。 – aRegx – bRegx advancedFilters: ## 高级过滤规则,该字段仅适用于v1.1.15及以上的采集组件版本,低于v1.1.15请使用 filterKeys 与 filterRegex – key: level ## 需要过滤的 Key rule: 0 ## 过滤规则,支持的数值枚举为:0(等于),1(字段存在),2(字段不存在), 3(不等于)。 value: info ## 需要过滤的值 value。其中当 rule 为1或2时,value 无需指定。 unMatchUpload: "false" ## 解析失败日志是否上传,true 表示上传,false 表示不上传。默认不上传 unMatchedKey: "parseFailed" ## 解析失败的日志上传 CLS 的 key 名称 backtracking: "-1" ## “-1”或者“0”,-1表示全量采集,0表示增量采集,其他大于0的数字表示增量采集模式下的回溯数据量。默认全量。 isGBK: "true" ## "true"或者"false",默认"false"非 jbk jsonStandard: "true" ## "true"或者"false",默认"true"标准 json ### 高级采集配置 advancedConfig: ## 非必填 ClsAgentMaxDepth: 1 ## 采集器采集最大目录深度,大于等于0的整数,0表示当前目录。 ClsAgentFileTimeout: 60 ## 文件超时属性,即超过该指定时间的日志文件没有被修改,则采集器不在监控。 该参数需要大于等于0的整数,单位秒。0为不超时,全部采集。 ClsAgentParseFailMerge: true ## 合并解析失败日志,取值范围: true 或 false ### 创建 topic 时可自定义全文索引 ### 仅在自动创建日志主题时支持定义, 不支持修改已存在日志主题的索引 fullTextIndex: ## 非必填,全文索引设置 status: "on" ## 全文索引开关,如果不设置,则会默认打开全文索引;如果设置 on 打开,不设置其他参数,则 caseSensitive 和 tokenizer 都会是默认值;如果设置 off 关闭,则不打开全文索引 tokenizer: "@&()='\\",;:<>[]{}/ \\n\\t\\r" ## 全文索引的分词符,如果全文索引开关打开,则必须设置 tokenizer。可以设置为"@&()='\\",;:<>[]{}/ \\n\\t\\r",为默认设置 caseSensitive: false ## 是否大小写敏感 containZH: false ## 是否包含中文 ### 创建 topic 时可自定义TAG和键值索引设置 indexStatus: "on" ## 非必填,TAG 索引和键值索引设置开关,如果不设置,则默认创建pod_name/namespace/container_name三个TAG索引;off则表示不设置键值索引 autoIndex: "off" ## 非必填, off 则表示不设置自动配置索引,on 标识开启自动配置索引 indexs: ## 非必填。 – indexName: xxx ## 需要配置键值索引或者 TAG 索引的字段;Pod 相关的 namespace/pod_name/pod_ip/pod_uid/container_id/container_name/image_name/cluster_id 八个元数据字段和 pod_label_前缀字段会设置为 TAG 索引,其他字段会设置为键值索引。 indexType: "text" ## 非必填。字段类型,目前支持的类型有:long、text、double。非必填 tokenizer: "@&()='\\",;:<>[]{}/ \\n\\t\\r" ## 非必填。字段的分词符,其中的每个字符代表一个分词符;仅支持英文符号及\\n\\t\\r;long 及 double 类型字段需为空; ## text 类型字段推荐使用 @&?|#()='",;:<>[]{}/ \\n\\t\\r\\ 作为分词符; sqlFlag: true ## 非必填。字段是否开启分析功能。true/false 字段是否开启分析功能,如果是日志主题是低频日志主题,sqlFlag 选项不能被打开。 containZH: false ## 非必填。是否包含中文。
七、日志采集规则配置示例
单行全文格式多行全文格式单行-完全正则格式多行-完全正则格式JSON 格式分隔符格式组合解析单行全文日志是指一行日志内容为一条完整的日志。日志服务在采集的时候,将使用换行符 \\n 来作为一条日志的结束符。为了统一结构化管理,每条日志都会存在一个默认的键值\\\\CONTENT\\\\,但日志数据本身不再进行日志结构化处理,也不会提取日志字段,日志属性的时间项由日志采集的时间决定。假设一条日志原始数据为:Tue Jan 22 12:08:15 CST 2019 Installed: libjpeg-turbo-static-1.2.90-6.el7.x86_64LogConfig 配置参考示例如下:apiVersion: cls.cloud.tencent.com/v1kind: LogConfig metadata: name: test ## 采集配置名称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多行全文日志是指一条完整的日志数据可能跨占多行(例如 Java stacktrace)。在这种情况下,以换行符 \\n 为日志的结束标识符就显得有些不合理,为了能让日志系统明确区分开每条日志,采用首行正则的方式进行匹配,当某行日志匹配上预先设置的正则表达式,就认为是一条日志的开头,而下一个行首出现作为该条日志的结束标识符。多行全文也会设置一个默认的键值\\\\CONTENT\\\\,但日志数据本身不再进行日志结构化处理,也不会提取日志字段,日志属性的时间项由日志采集的时间决定。假设一条多行日志原始数据为:2019-12-15 17:13:06,043 [main] ERROR com.test.logging.FooFactory:java.lang.NullPointerException at com.test.logging.FooFactory.createFoo(FooFactory.java:15) at com.test.logging.FooFactoryTest.test(FooFactoryTest.java:11)LogConfig 配置的参考如下:apiVersion: cls.cloud.tencent.com/v1kind: LogConfig metadata: name: test ## 采集配置名称spec: clsDetail: topicId: xxxxxx-xx-xx-xx-xxxxxxxx # 多行日志 logType: multiline_log extractRule: # 只有以日期时间开头的行才被认为是新一条日志的开头,否则就添加换行符\\n并追加到当前日志的尾部 beginningRegex: \\d{4}-\\d{2}-\\d{2}\\s\\d{2}:\\d{2}:\\d{2},\\d{3}\\s.+采集到日志服务的数据为:__CONTENT__:2019-12-15 17:13:06,043 [main] ERROR com.test.logging.FooFactory:\\njava.lang.NullPointerException\\n at com.test.logging.FooFactory.createFoo(FooFactory.java:15)\\n at com.test.logging.FooFactoryTest.test(FooFactoryTest.java:11)单行完全正则格式通常用来处理结构化的日志,指将一条完整日志按正则方式提取多个 key-value 的日志解析模式。假设一条日志原始数据为:10.135.46.111 – – [22/Jan/2019:19:19:30 +0800] "GET /my/course/1 HTTP/1.1" 127.0.0.1 200 782 9703 "http://127.0.0.1/course/explore?filter%5Btype%5D=all&filter%5Bprice%5D=all&filter%5BcurrentLevelId%5D=all&orderBy=studentNum" "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:64.0) Gecko/20100101 Firefox/64.0" 0.354 0.354LogConfig 配置的参考如下:apiVersion: cls.cloud.tencent.com/v1kind: LogConfig metadata: name: test ## 采集配置名称spec: clsDetail: topicId: xxxxxx-xx-xx-xx-xxxxxxxx # 完全正则格式 logType: fullregex_log extractRule: # 正则表达式,会根据()捕获组提取对应的value logRegex: (\\S+)[^\\[]+(\\[[^:]+:\\d+:\\d+:\\d+\\s\\S+)\\s"(\\w+)\\s(\\S+)\\s([^"]+)"\\s(\\S+)\\s(\\d+)\\s(\\d+)\\s(\\d+)\\s"([^"]+)"\\s"([^"]+)"\\s+(\\S+)\\s(\\S+).* beginningRegex: (\\S+)[^\\[]+(\\[[^:]+:\\d+:\\d+:\\d+\\s\\S+)\\s"(\\w+)\\s(\\S+)\\s([^"]+)"\\s(\\S+)\\s(\\d+)\\s(\\d+)\\s(\\d+)\\s"([^"]+)"\\s"([^"]+)"\\s+(\\S+)\\s(\\S+).* # 提取的key列表,与提取的value的一一对应 keys: ['remote_addr','time_local','request_method','request_url','http_protocol','http_host','status','request_length','body_bytes_sent','http_referer','http_user_agent','request_time','upstream_response_time']采集到日志服务的数据为:body_bytes_sent: 9703http_host: 127.0.0.1http_protocol: HTTP/1.1http_referer: http://127.0.0.1/course/explore?filter%5Btype%5D=all&filter%5Bprice%5D=all&filter%5BcurrentLevelId%5D=all&orderBy=studentNumhttp_user_agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:64.0) Gecko/20100101 Firefox/64.0remote_addr: 10.135.46.111request_length: 782request_method: GETrequest_time: 0.354request_url: /my/course/1status: 200time_local: [22/Jan/2019:19:19:30 +0800]upstream_response_time: 0.354多行-完全正则模式适用于日志文本中一条完整的日志数据跨占多行(例如 Java 程序日志),可按正则表达式提取为多个 key-value 键值的日志解析模式。若不需要提取 key-value,请参阅多行全文格式进行配置。假设一条日志原始数据为:[2018-10-01T10:30:01,000] [INFO] java.lang.Exception: exception happened at TestPrintStackTrace.f(TestPrintStackTrace.java:3) at TestPrintStackTrace.g(TestPrintStackTrace.java:7) at TestPrintStackTrace.main(TestPrintStackTrace.java:16)LogConfig 配置的参考如下:apiVersion: cls.cloud.tencent.com/v1kind: LogConfig metadata: name: test ## 采集配置名称spec: clsDetail: topicId: xxxxxx-xx-xx-xx-xxxxxxxx #多行-完全正则格式 logType: multiline_fullregex_log extractRule: #行首完全正则表达式,只有以日期时间开头的行才被认为是新一条日志的开头,否则就添加换行符\\n并追加到当前日志的尾部 beginningRegex: \\[\\d+-\\d+-\\w+:\\d+:\\d+,\\d+\\]\\s\\[\\w+\\]\\s.* #正则表达式,会根据()捕获组提取对应的value logRegex: \\[(\\d+-\\d+-\\w+:\\d+:\\d+,\\d+)\\]\\s\\[(\\w+)\\]\\s(.*) # 提取的 key 列表,与提取的 value 的一一对应 keys: ['time','level','msg']根据提取的 key,采集到日志服务的数据为:time:2018-10-01T10:30:01,000`level: INFO`msg: ajava.lang.Exception: exception happened at TestPrintStackTrace.f(TestPrintStackTrace.java:3) at TestPrintStackTrace.g(TestPrintStackTrace.java:7) at TestPrintStackTrace.main(TestPrintStackTrace.java:16)JSON 格式日志会自动提取首层的 key 作为对应字段名,首层的 value 作为对应的字段值,以该方式将整条日志进行结构化处理,每条完整的日志以换行符 \\n 为结束标识符。假设一条 JSON 日志原始数据为:{"remote_ip":"10.135.46.111","time_local":"22/Jan/2019:19:19:34 +0800","body_sent":23,"responsetime":0.232,"upstreamtime":"0.232","upstreamhost":"unix:/tmp/php-cgi.sock","http_host":"127.0.0.1","method":"POST","url":"/event/dispatch","request":"POST /event/dispatch HTTP/1.1","xff":"-","referer":"http://127.0.0.1/my/course/4","agent":"Mozilla/5.0 (Windows NT 10.0; WOW64; rv:64.0) Gecko/20100101 Firefox/64.0","response_code":"200"}LogConfig 配置的参考如下:apiVersion: cls.cloud.tencent.com/v1kind: LogConfig metadata: name: test ## 采集配置名称spec: clsDetail: topicId: xxxxxx-xx-xx-xx-xxxxxxxx # JSON格式日志 logType: json_log采集到日志服务的数据为:agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:64.0) Gecko/20100101 Firefox/64.0body_sent: 23http_host: 127.0.0.1method: POSTreferer: http://127.0.0.1/my/course/4remote_ip: 10.135.46.111request: POST /event/dispatch HTTP/1.1response_code: 200responsetime: 0.232time_local: 22/Jan/2019:19:19:34 +0800upstreamhost: unix:/tmp/php-cgi.sockupstreamtime: 0.232url: /event/dispatchxff: -分隔符日志是指一条日志数据可以根据指定的分隔符将整条日志进行结构化处理,每条完整的日志以换行符 \\n 为结束标识符。日志服务在进行分隔符格式日志处理时,你需要为每个分开的字段定义唯一的 key。假设你的一条日志原始数据为:10.20.20.10 ::: [Tue Jan 22 14:49:45 CST 2019 +0800] ::: GET /online/sample HTTP/1.1 ::: 127.0.0.1 ::: 200 ::: 647 ::: 35 ::: http://127.0.0.1/LogConfig 配置的参考如下:apiVersion: cls.cloud.tencent.com/v1kind: LogConfig metadata: name: test ## 采集配置名称spec: clsDetail: topicId: xxxxxx-xx-xx-xx-xxxxxxxx # 分隔符日志 logType: delimiter_log extractRule: # 分隔符 delimiter: ':::' # 提取的key列表,与被分割的字段一一对应 keys: ['IP','time','request','host','status','length','bytes','referer']采集到日志服务的数据为:IP: 10.20.20.10bytes: 35host: 127.0.0.1length: 647referer: http://127.0.0.1/request: GET /online/sample HTTP/1.1status: 200time: [Tue Jan 22 14:49:45 CST 2019 +0800]假设你的一条日志的原始数据为:1571394459,http://127.0.0.1/my/course/4|10.135.46.111|200,status:DEAD,自定义插件内容如下:{ "processors": [ { "type": "processor_split_delimiter", "detail": { "Delimiter": ",", "ExtractKeys": [ "time", "msg1","msg2"] }, "processors": [ { "type": "processor_timeformat", "detail": { "KeepSource": true, "TimeFormat": "%s", "SourceKey": "time" } }, { "type": "processor_split_delimiter", "detail": { "KeepSource": false, "Delimiter": "|", "SourceKey": "msg1", "ExtractKeys": [ "submsg1","submsg2","submsg3"] }, "processors": [] }, { "type": "processor_split_key_value", "detail": { "KeepSource": false, "Delimiter": ":", "SourceKey": "msg2" } } ] } ]}LogConfig 配置的参考如下:apiVersion: cls.cloud.tencent.com/v1kind: LogConfig metadata: name: test ## 采集配置名称spec: clsDetail: topicId: xxxxxx-xx-xx-xx-xxxxxxxx # 分隔符日志 logType: user_define_log userDefineRule:"{ \\"processors\\": [ { \\"type\\": \\"processor_split_delimiter\\", \\"detail\\": { \\"Delimiter\\": \\",\\", \\"ExtractKeys\\": [ \\"time\\", \\"msg1\\",\\"msg2\\"] }, \\"processors\\": [ { \\"type\\": \\"processor_timeformat\\", \\"detail\\": { \\"KeepSource\\": true, \\"TimeFormat\\": \\"%s\\", \\"SourceKey\\": \\"time\\" } }, { \\"type\\": \\"processor_split_delimiter\\", \\"detail\\": { \\"KeepSource\\": false, \\"Delimiter\\": \\"|\\", \\"SourceKey\\": \\"msg1\\", \\"ExtractKeys\\": [ \\"submsg1\\",\\"submsg2\\",\\"submsg3\\"] }, \\"processors\\": [] }, { \\"type\\": \\"processor_split_key_value\\", \\"detail\\": { \\"KeepSource\\": false, \\"Delimiter\\": \\":\\", \\"SourceKey\\": \\"msg2\\" } } ] } ] }"经过日志服务结构化处理后,该条日志将变为如下:time: 1571394459submsg1: http://127.0.0.1/my/course/4submsg2: 10.135.46.111submsg3: 200status: DEAD
八、inputDetail(日志源)字段说明
inputDetail: type: container_stdout ## 指定采集日志的类型,包括 container_stdout(容器标准输出)、container_file(容器文件)、host_file(主机文件) containerStdout: ## 容器标准输出配置,仅在 type:container_stdout 时生效 namespace: default ## 采集容器的 kubernetes 命名空间。支持多个命名空间,如果有多个命名空间使用","分隔,如:default,namespace。如果不指定,代表所有命名空间。注意:与 excludeNamespace 不能同时指定 excludeNamespace: nm1,nm2 ## 排除采集容器的 kubernetes 命名空间。支持多个命名空间,如果有多个命名空间使用","分隔,如:nm1,nm2。如果不指定,代表所有命名空间。注意:与 namespace 不能同时指定 nsLabelSelector: environment in (production),tier in (frontend) ## 根据命名空间 label 筛选符合的 namespace allContainers: false ## 是否采集指定命名空间中的所有容器的标准输出。注意:allContainers=true 时不能同时指定 workload、includeLabels 和 excludeLabels containerOperator: in ## container 选择方式,包含填in,排除填notin container: xxx ## 指定采集或不采集日志的容器名,支持填写多个,逗号隔开。若 containerOperator 为 in,则可填*,代表采集所有容器 includeLabels: ## 采集包含指定 label 的 Pod,与 workload 不能同时指定 key: value1 ## 支持匹配同一个 key 下多个 value 值的 pod,例填写 environment = production,qa 表示当 key 为 environment,value 值为 production 或 qa 时,均会被匹配,注意输入多个 value 值时请使用逗号隔开。如果同时指定了 excludeLabels,则匹配与 excludeLabels 交集的 pod excludeLabels: ## 采集不包含包含指定 label 的 Pod,与 workload、namespace 和 excludeNamespace 不能同时指定 key2: value2 ## 支持匹配同一个 key 下多个 value 值的 pod,例填写 environment = production,qa 表示当 key 为 environment,value 值为 production 或 qa 时,均会被排除,注意输入多个 value 值时请使用逗号隔开。如果同时指定了 includeLabels,则匹配与 includeLabels 交集的 pod metadataLabels: ## 指定具体哪些 pod label 被当做元数据采集,如果不指定,则采集所有 pod label 为元数据 – label1 metadataContainer: ## 指定具体哪些容器环境相关元数据被采集,如果不指定,则采集所有容器环境相关元数据(namespace,pod_name,pod_ip,pod_uid,container_id,container_name,image_name) – namespace customLabels: ## 用户自定义 metadata label: l1 workloads: ## 采集指定命名空间 -> 指定工作负载类型中 -> 指定工作负载 -> 指定容器中的日志 – container: xxx ## 要采集的容器名,如果不指定,代表 workload Pod 中的所有容器 containerOperator: in ## container 选择方式,包含填 in,排除填 notin kind: deployment ## workload 类型,支持 deployment、daemonset、statefulset、job、cronjob name: sample-app ## workload 的名字 namespace: prod ## workload 的命名空间 containerFile: ## 容器内文件配置,仅在 type:container_file 时生效 namespace: default ## 采集容器的 kubernetes 命名空间,必须指定一个命名空间 excludeNamespace: nm1,nm2 ## 排除采集容器的 kubernetes 命名空间。支持多个命名空间,如果有多个命名空间使用","分隔,如:nm1,nm2。 如果不指定,代表所有命名空间。 注意:与 namespace 不能同时指定 nsLabelSelector: environment in (production),tier in (frontend) ## 根据命名空间 label 筛选符合的 namespace containerOperator: in ## container 选择方式,包含填 in,排除填 notin container: xxx ## 指定采集或不采集日志的容器名,支持填写多个,逗号隔开。 若 containerOperator 为 in,则可填*,代表采集所有容器。若制定了 workload 类型和名称,此处可定义指定工作负载中容器的名称 logPath: /var/logs ## 日志文件夹,支持通配符 * 和 ?;* 表示匹配多个任意字符,? 表示匹配单个任意字符 filePattern: app_*.log ## 日志文件名,支持通配符 * 和 ? ,* 表示匹配多个任意字符,? 表示匹配单个任意字符 ## 指定容器内多个日志路径和文件,该参数和 logPath、filePattern 不兼容,只能指定 filePaths 或者(logPath、filePattern) ## 如果从(logPath 和 filePattern) -> filePaths 会触发日志重采;相反从 filePaths->logPath 和 filePattern)也一样 filePaths: – file: /var/logs ## 日志文件夹,支持通配符 * 和 ?;* 表示匹配多个任意字符,? 表示匹配单个任意字符 path: app_*.log ## 日志文件名,支持通配符 * 和 ? ;* 表示匹配多个任意字符,? 表示匹配单个任意字符 – file: /var/logs1 path: app_*.log includeLabels: ## 采集包含指定 label 的 Pod,与 workload 不能同时指定 key: value1 ## 收集规则收集的日志会带上 metadata,并上报到消费端。支持匹配同一个 key 下多个 value 值的 pod,例填写 environment = production,qa 表示当 key 为 environment,value 值为 production 或 qa 时,均会被匹配,注意输入多个 value 值时请使用逗号隔开。如果同时指定了 excludeLabels,则匹配与 excludeLabels 交集的 pod excludeLabels: ## 采集不包含包含指定 label 的 Pod,与 workload 不能同时指定 key2: value2 ## 支持匹配同一个 key 下多个 value 值的 pod,例填写 environment = production,qa 表示当 key 为 environment,value 值为 production 或 qa 时,均会被排除,注意输入多个 value 值时请使用逗号隔开。如果同时指定了 includeLabels,则匹配与 includeLabels 交集的 pod metadataLabels: ## 指定具体哪些 pod label 被当做元数据采集,如果不指定,则采集所有 pod label 为元数据 – namespace metadataContainer: ## 指定具体哪些容器环境相关元数据被采集,如果不指定,则采集所有容器环境相关元数据(namespace,pod_name,pod_ip,pod_uid,container_id,container_name,image_name) customLabels: ## 用户自定义 metadata key: value workload: ## 采集指定命名空间 -> 指定工作负载类型中 -> 指定工作负载中的所有容器。若要指定工作负载中的容器,需在外层 container 中指定 kind: deployment ## workload 类型,支持 deployment、daemonset、statefulset、job、cronjob name: sample-app ## workload 的名字 namespace: prod ## workload 的命名空间 hostFile: ## 节点文件路径,仅在 type:host_file 时生效 filePattern: '*.log' ## 日志文件名,支持通配符 * 和 ? ,* 表示匹配多个任意字符,? 表示匹配单个任意字符 logPath: /tmp/logs ## 日志文件夹,支持通配符 * 和 ? ;* 表示匹配多个任意字符,? 表示匹配单个任意字符 ## 指定容器内多个日志路径和文件,该参数和 logPath、filePattern 不兼容,只能指定 filePaths 或者(logPath、filePattern) ## 如果从(logPath 和 filePattern) -> filePaths 会触发日志重采;相反从 filePaths->logPath 和 filePattern)也一样 filePaths: – file: /var/logs ## 日志文件夹,支持通配符 * 和 ?;* 表示匹配多个任意字符,? 表示匹配单个任意字符 path: app_*.log ## 日志文件名,支持通配符 * 和 ? ;* 表示匹配多个任意字符,? 表示匹配单个任意字符 – file: /var/logs1 path: app_*.log customLabels: ## 用户自定义 metadata label1: v1
九、日志源配置示例
容器标准输出容器文件主机文件示例1:采集 default 命名空间中的所有容器的标准输出。apiVersion: cls.cloud.tencent.com/v1kind: LogConfig metadata: name: test ## 采集配置名称spec: inputDetail: type: container_stdout containerStdout: namespace: default allContainers: true …示例2:采集 production 命名空间中属于 ingress-gateway deployment 的 pod 中的所有容器的标准输出。apiVersion: cls.cloud.tencent.com/v1kind: LogConfigspec: inputDetail: type: container_stdout containerStdout: allContainers: false workloads: – namespace: production name: ingress-gateway kind: deployment …示例3:采集 production 命名空间中 pod 标签中包含 “k8s-app=nginx” 的 pod 中的所有容器的标准输出。apiVersion: cls.cloud.tencent.com/v1kind: LogConfigspec: inputDetail: type: container_stdout containerStdout: namespace: production allContainers: false includeLabels: k8s-app: nginx …示例4:采集 production 命名空间中属于 ingress-gateway 工作负载的 pod 中,名称为 ingress 的容器的标准输出。apiVersion: cls.cloud.tencent.com/v1kind: LogConfigspec: inputDetail: type: container_stdout containerStdout: allContainers: false containerOperator: in container: ingress workloads: – namespace: production name: ingress-gateway kind: deployment …示例1:采集 production 命名空间中属于 ingress-gateway deployment 的 pod 中的 nginx 容器中 /data/nginx/log/ 路径下名为 access.log 的文件apiVersion: cls.cloud.tencent.com/v1kind: LogConfig metadata: name: test ## 采集配置名称spec: inputDetail: type: container_file containerFile: namespace: production workload: name: ingress-gateway kind: deployment container: nginx filePaths: – file: access.log path: /data/nginx/log …示例2:采集 production 命名空间中 pod 标签包含 “k8s-app=ingress-gateway” 的 pod 中的 nginx 容器中 /data/nginx/log/ 路径下名为 access.log 的文件apiVersion: cls.cloud.tencent.com/v1kind: LogConfigspec: inputDetail: type: container_file containerFile: namespace: production includeLabels: k8s-app: ingress-gateway container: nginx filePaths: – file: access.log path: /data/nginx/log …示例:采集主机 /data/ 路径下所有 .log 文件apiVersion: cls.cloud.tencent.com/v1kind: LogConfig metadata: name: test ## 采集配置名称spec: inputDetail: type: host_file hostFile: logPath: /data filePattern: *.log …
十、步骤3:创建 LogConfig 对象
步骤2 定义了 LogConfig.yaml 声明文件,我们可以基于 LogConfig.yaml 声明文件,使用 kubectl 命令创建 LogConfig 对象。
kubectl create -f /usr/local/LogConfig.yaml
十一、步骤4:查看 LogConfig
kubectl get logconfig
十二、后续操作
至此, 即完成了集群日志采集的所有部署。你可以前往 CLS 控制台 > 检索分析 查看采集上来的日志。