Kubernetes中Logtail日志采集CRD配置详解

本文涉及的产品
对象存储 OSS,标准 - 本地冗余存储 20GB 3个月
对象存储 OSS,内容安全 1000 次 1年
对象存储OSS,敏感数据保护2.0 200GB 1年
简介: 日志采集配置默认支持控制台配置方式,同时针对Kubernetes微服务开发模式,我们还提供CRD的配置方式,您可以直接使用kubectl对配置进行管理。

日志采集配置默认支持控制台配置方式,同时针对Kubernetes微服务开发模式,我们还提供CRD的配置方式,您可以直接使用kubectl对配置进行管理。

我们推荐使用CRD方式进行采集配置管理,该方式与Kubernetes部署、发布流程的集成更加完善。

实现原理

dcbf28a3-6a60-4b22-9de6-670cca52db91.png



执行安装命令时会自动安装alibaba-log-controller的Helm包。Helm包中主要执行了以下操作:

1创建aliyunlogconfigs CRD(CustomResourceDefinition)。
2部署alibaba-log-controller的Deployment。
3部署Logtail的DaemonSet。

具体配置的内部工作流程如下:

1用户使用kubectl或其他工具应用aliyunlogconfigs CRD配置。
2alibaba-log-controller监听到配置更新。
3alibaba-log-controller根据CRD内容以及服务端状态,自动向日志服务提交logstore创建、配置创建以及应用机器组的请求。
4以DaemonSet模式运行的Logtail会定期请求配置服务器,获取新的或已更新的配置并进行热加载。
5Logtail根据配置信息采集各个容器(POD)上的标准输出或文件。
6最终Logtail将处理、聚合好的数据发送到日志服务。

使用方式

配置方式

注意: 如果您之前使用的DaemonSet方式部署的日志服务Logtail,将无法使用CRD的方式进行配置管理。升级方式参见Kubernets日志采集部署中DaemonSet部署方式迁移步骤。

您只需要定义AliyunLogConfig的CRD即可实现配置的创建,删除对应的CRD资源即可删除对应配置。CRD配置格式如下:

apiVersion: log.alibabacloud.com/v1alpha1      ## 默认值,无需改变
kind: AliyunLogConfig                          ## 默认值,无需改变
metadata:
  name: simple-stdout-example                  ## 资源名,必须在集群内唯一
spec:
  logstore: k8s-stdout                         ## logstore名,不存在时自动创建
  shardCount: 2                                ## [可选] logstore分区数,默认为2,支持1-10
  lifeCycle: 90                                ## [可选] 该logstore存储时间,默认为90,支持1-36500,3650天为永久存储
  logtailConfig:                               ## 详细配置
    inputType: plugin                          ## 采集的输入类型,一般为file或plugin
    configName: simple-stdout-example          ## 采集配置名,需要和资源名(metadata.name)一致
    inputDetail:                               ## 详细配置信息,具体请参考示例
    ...


配置完成并apply后,alibaba-log-controller会自动创建

查看配置

您可以通过Kubernetes CRD或控制台查看配置。

控制台查看配置参见查看Logtail配置列表

注意: 使用CRD管理方式,若您在控制台更改配置,下一次执行CRD更新配置时,会覆盖控制台的更改内容。
使用kubectl get aliyunlogconfigs查看当前所有配置

[root@iZbp1dsbiaZ ~]# kubectl get aliyunlogconfigs
NAME                   AGE
regex-file-example     10s
regex-stdout-example   4h
simple-file-example    5s


使用kubectl get aliyunlogconfigs ${config_name} -o yaml查看详细配置和状态。

配置中status字段显示配置执行的结果,若配置应用成功,status字段中的statusCode为200。若statusCode非200,则说明配置应用失败。

[root@iZbp1dsbiaZ ~]# kubectl get aliyunlogconfigs simple-file-example -o yaml
apiVersion: log.alibabacloud.com/v1alpha1
kind: AliyunLogConfig
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"log.alibabacloud.com/v1alpha1","kind":"AliyunLogConfig","metadata":{"annotations":{},"name":"simple-file-example","namespace":"default"},"spec":{"logstore":"k8s-file","logtailConfig":{"configName":"simple-file-example","inputDetail":{"dockerFile":true,"dockerIncludeEnv":{"ALIYUN_LOGTAIL_USER_DEFINED_ID":""},"filePattern":"simple.LOG","logPath":"/usr/local/ilogtail","logType":"common_reg_log"},"inputType":"file"}}}
  clusterName: ""
  creationTimestamp: 2018-05-17T08:44:46Z
  generation: 0
  name: simple-file-example
  namespace: default
  resourceVersion: "21790443"
  selfLink: /apis/log.alibabacloud.com/v1alpha1/namespaces/default/aliyunlogconfigs/simple-file-example
  uid: 8d3a09c4-59ae-11e8-851d-00163f008685
spec:
  lifeCycle: null
  logstore: k8s-file
  logtailConfig:
    configName: simple-file-example
    inputDetail:
      dockerFile: true
      dockerIncludeEnv:
        ALIYUN_LOGTAIL_USER_DEFINED_ID: ""
      filePattern: simple.LOG
      logPath: /usr/local/ilogtail
      logType: common_reg_log
    inputType: file
  machineGroups: null
  project: ""
  shardCount: null
status:
  status: OK
  statusCode: 200


配置示例

容器标准输出

容器标准输出中,需要将inputType设置为plugin,并将具体信息填写到inputDetail下的plugin字段,详细配置字段极其含义请参考: 容器标准输出

极简采集方式

采集除了环境变量中配置COLLECT_STDOUT_FLAG=false之外所有容器的标准输出(stdout和stderr)。

apiVersion: log.alibabacloud.com/v1alpha1
kind: AliyunLogConfig
metadata:
  # your config name, must be unique in you k8s cluster
  name: simple-stdout-example
spec:
  # logstore name to upload log
  logstore: k8s-stdout
  # logtail config detail
  logtailConfig:
    # docker stdout's input type is 'plugin'
    inputType: plugin
    # logtail config name, should be same with [metadata.name]
    configName: simple-stdout-example
    inputDetail:
      plugin:
        inputs:
          -
            # input type
            type: service_docker_stdout
            detail:
              # collect stdout and stderr
              Stdout: true
              Stderr: true
              # collect all container's stdout except containers with "COLLECT_STDOUT_FLAG:false" in docker env config
              ExcludeEnv:
                COLLECT_STDOUT_FLAG: "false"


自定义处理采集方式

采集grafana的access log,并将access log解析成结构化数据。

grafana的容器配置中包含环境变量为:GF_INSTALL_PLUGINS=grafana-piechart-....,通过配置IncludeEnv为GF_INSTALL_PLUGINS: ''指定Logtail只采集该容器的标准输出。

1e95c4c0-4f7d-4c92-943a-e3badb6c81fa.png



grafana的access log格式如下:

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=


在这里我们使用正则表达式解析access log,具体配置如下:

apiVersion: log.alibabacloud.com/v1alpha1
kind: AliyunLogConfig
metadata:
  # your config name, must be unique in you k8s cluster
  name: regex-stdout-example
spec:
  # logstore name to upload log
  logstore: k8s-stdout-regex
  # logtail config detail
  logtailConfig:
    # docker stdout's input type is 'plugin'
    inputType: plugin
    # logtail config name, should be same with [metadata.name]
    configName: regex-stdout-example
    inputDetail:
      plugin:
        inputs:
          -
            # input type
            type: service_docker_stdout
            detail:
              # 只采集stdout,不采集stderr
              Stdout: true
              Stderr: false
              # 只采集容器环境变量中配置key为"GF_INSTALL_PLUGINS"的stdout 
              InluceEnv:
                GF_INSTALL_PLUGINS: ''
        processors:
          -
            # 使用正则表达式处理
            type: processor_regex
            detail:
        # docker 采集的数据默认key为"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*).*'
              # 提取出的key
        Keys: ['time', 'level', 'message', 'logger', 'userId', 'orgId', 'uname', 'method', 'path', 'status', 'remote_addr', 'time_ms', 'size', 'referer']
              # 保留原始字段
              KeepSource: true
              NoKeyError: true
              NoMatchError: true


配置应用后,采集到日志服务的数据如下:

a0f79bbb-f87d-4735-92fd-4ab8e5d31fc6.png



容器文件

极简文件

采集环境变量配置中含有key为ALIYUN_LOGTAIL_USER_DEFINED_ID的容器内日志文件,文件所处的路径为/data/logs/app_1,文件名为simple.LOG。

apiVersion: log.alibabacloud.com/v1alpha1
kind: AliyunLogConfig
metadata:
  # your config name, must be unique in you k8s cluster
  name: simple-file-example
spec:
  # logstore name to upload log
  logstore: k8s-file
  # logtail config detail
  logtailConfig:
    # log file's input type is 'file'
    inputType: file
    # logtail config name, should be same with [metadata.name]
    configName: simple-file-example
    inputDetail:
      # 极简模式日志,logType设置为"common_reg_log"
      logType: common_reg_log
      # 日志文件夹
      logPath: /data/logs/app_1
      # 文件名, 支持通配符,例如log_*.log
      filePattern: simple.LOG
      # 采集容器内的文件,dockerFile flag设置为true
      dockerFile: true
      # only collect container with "ALIYUN_LOGTAIL_USER_DEFINED_ID" in docker env config
      dockerIncludeEnv:
        ALIYUN_LOGTAIL_USER_DEFINED_ID: ""


完全正则模式文件

对于某Java程序日志样例为:

[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


日志中由于包含错误堆栈信息,可能一条日志会被分解成多行,因此需要设置行首正则表达式;为了提取出各个字段,这里我们使用正则表达式进行提取,具体配置如下:

apiVersion: log.alibabacloud.com/v1alpha1
kind: AliyunLogConfig
metadata:
  # your config name, must be unique in you k8s cluster
  name: regex-file-example
spec:
  # logstore name to upload log
  logstore: k8s-file
  logtailConfig:
    # log file's input type is 'file'
    inputType: file
    # logtail config name, should be same with [metadata.name]
    configName: regex-file-example
    inputDetail:
      # 对于正则类型的日志,将logType设置为common_reg_log
      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列表
      key : ["time", "level", "method", "file", "line", "message"]
      # 正则模式日志,时间解析默认从日志中的`time`提取,如果无需提取时间,可不设置该字段
      timeFormat: '%Y-%m-%dT%H:%M:%S'
      # 采集容器内的文件,dockerFile flag设置为true
      dockerFile: true
      # only collect container with "ALIYUN_LOGTAIL_USER_DEFINED_ID" in docker env config
      dockerIncludeEnv:
        ALIYUN_LOGTAIL_USER_DEFINED_ID: ""


配置应用后,采集到日志服务的数据如下:

5669739e-7737-418a-a7df-8e8692bca05f.png



分隔符模式文件

Logtail同时支持分隔符模式的日志解析,示例如下:

apiVersion: log.alibabacloud.com/v1alpha1
kind: AliyunLogConfig
metadata:
  # your config name, must be unique in you k8s cluster
  name: delimiter-file-example
spec:
  # logstore name to upload log
  logstore: k8s-file
  logtailConfig:
    # log file's input type is 'file'
    inputType: file
    configName: delimiter-file-example
    # logtail config name, should be same with [metadata.name]
    inputDetail:
      # 对于分隔符类型的日志,logType设置为delimiter_log
      logType: delimiter_log
      # 日志文件夹
      logPath: /usr/local/ilogtail
      # 文件名, 支持通配符,例如log_*.log
      filePattern: delimiter_log.LOG
      # 使用多字符分隔符
      separator: '|&|'
      # 提取的key列表
      key : ['time', 'level', 'method', 'file', 'line', 'message']
      # 用作解析时间的key,如无需求可不填
      timeKey: 'time'
      # 时间解析方式,如无需求可不填
      timeFormat: '%Y-%m-%dT%H:%M:%S'
      # 采集容器内的文件,dockerFile flag设置为true
      dockerFile: true
      # only collect container with "ALIYUN_LOGTAIL_USER_DEFINED_ID" in docker env config
      dockerIncludeEnv:
        ALIYUN_LOGTAIL_USER_DEFINED_ID: ''


JSON模式文件

若文件中每行数据为一个JSON object,可以使用JSON方式进行解析,示例如下:

apiVersion: log.alibabacloud.com/v1alpha1
kind: AliyunLogConfig
metadata:
  # your config name, must be unique in you k8s cluster
  name: json-file-example
spec:
  # logstore name to upload log
  logstore: k8s-file
  logtailConfig:
    # log file's input type is 'file'
    inputType: file
    # logtail config name, should be same with [metadata.name]
    configName: json-file-example
    inputDetail:
      # 对于分隔符类型的日志,logType设置为json_log
      logType: json_log
      # 日志文件夹
      logPath: /usr/local/ilogtail
      # 文件名, 支持通配符,例如log_*.log
      filePattern: json_log.LOG
      # 用作解析时间的key,如无需求可不填
      timeKey: 'time'
      # 时间解析方式,如无需求可不填
      timeFormat: '%Y-%m-%dT%H:%M:%S'
      # 采集容器内的文件,dockerFile flag设置为true
      dockerFile: true
      # only collect container with "ALIYUN_LOGTAIL_USER_DEFINED_ID" in docker env config
      dockerIncludeEnv:
        ALIYUN_LOGTAIL_USER_DEFINED_ID: ""
相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
24天前
|
监控 安全 程序员
Python日志模块配置:从print到logging的优雅升级指南
从 `print` 到 `logging` 是 Python 开发的必经之路。`print` 调试简单却难维护,日志混乱、无法分级、缺乏上下文;而 `logging` 支持级别控制、多输出、结构化记录,助力项目可维护性升级。本文详解痛点、优势、迁移方案与最佳实践,助你构建专业日志系统,让程序“有记忆”。
144 0
|
2月前
|
缓存 Java 应用服务中间件
Spring Boot配置优化:Tomcat+数据库+缓存+日志,全场景教程
本文详解Spring Boot十大核心配置优化技巧,涵盖Tomcat连接池、数据库连接池、Jackson时区、日志管理、缓存策略、异步线程池等关键配置,结合代码示例与通俗解释,助你轻松掌握高并发场景下的性能调优方法,适用于实际项目落地。
407 4
|
4月前
|
人工智能 缓存 Kubernetes
ACK GIE配置建议
Gateway with Inference Extension是基于Kubernetes社区Gateway API及其扩展规范实现的增强型组件,支持四层/七层路由服务,并面向生成式AI推理场景提供负载均衡优化、服务管理简化等能力,适用于AI推理服务的高可用部署与性能优化。在不同的场景使用ACK Gateway with Inference Extension时,可能需要根据业务需求和高可用需要对网关和推理扩展进行不同的配置调整。本文主要介绍在实际业务场景中针对ACK GIE的配置建议,以获得更好的使用效果。
220 23
|
安全 BI 网络安全
EventLog Analyzer 如何满足等保合规要求?密码有效期、产品日志保留、配置备份三大核心问题全面解答
EventLog Analyzer(ELA)助力企业满足网络安全等级保护要求,支持配置自动/手动备份、日志180天留存及密码策略管理,提升合规性与安全运营效率。
|
8月前
|
SQL Java 数据库连接
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录—— application.yml 中对日志的配置
在 Spring Boot 项目中,`application.yml` 文件用于配置日志。通过 `logging.config` 指定日志配置文件(如 `logback.xml`),实现日志详细设置。`logging.level` 可定义包的日志输出级别,例如将 `com.itcodai.course03.dao` 包设为 `trace` 级别,便于开发时查看 SQL 操作。日志级别从高到低为 ERROR、WARN、INFO、DEBUG,生产环境建议调整为较高级别以减少日志量。本课程采用 yml 格式,因其层次清晰,但需注意格式要求。
708 0
|
4月前
|
JSON 安全 Go
Go语言项目工程化 —— 日志、配置、错误处理规范
本章详解Go语言项目工程化核心规范,涵盖日志、配置与错误处理三大关键领域。在日志方面,强调其在问题排查、性能优化和安全审计中的作用,推荐使用高性能结构化日志库zap,并介绍日志级别与结构化输出的最佳实践。配置管理部分讨论了配置分离的必要性,对比多种配置格式如JSON、YAML及环境变量,并提供viper库实现多环境配置的示例。错误处理部分阐述Go语言显式返回error的设计哲学,讲解标准处理方式、自定义错误类型、错误封装与堆栈追踪技巧,并提出按调用层级进行错误处理的建议。最后,总结各模块的工程化最佳实践,助力构建可维护、可观测且健壮的Go应用。
|
5月前
|
存储 NoSQL MongoDB
Docker中安装MongoDB并配置数据、日志、配置文件持久化。
现在,你有了一个运行在Docker中的MongoDB,它拥有自己的小空间,对高楼大厦的崩塌视而不见(会话丢失和数据不持久化的问题)。这个MongoDB的数据、日志、配置文件都会妥妥地保存在你为它精心准备的地方,天旋地转,它也不会失去一丁点儿宝贵的记忆(即使在容器重启后)。
525 4
|
7月前
|
存储 监控 API
【Azure App Service】分享使用Python Code获取App Service的服务器日志记录管理配置信息
本文介绍了如何通过Python代码获取App Service中“Web服务器日志记录”的配置状态。借助`azure-mgmt-web` SDK,可通过初始化`WebSiteManagementClient`对象、调用`get_configuration`方法来查看`http_logging_enabled`的值,从而判断日志记录是否启用及存储方式(关闭、存储或文件系统)。示例代码详细展示了实现步骤,并附有执行结果与官方文档参考链接,帮助开发者快速定位和解决问题。
193 23
|
8月前
|
Prometheus Kubernetes 监控
Kubernetes监控:Prometheus与AlertManager结合,配置邮件告警。
完成这些步骤之后,您就拥有了一个可以用邮件通知你的Kubernetes监控解决方案了。当然,所有的这些配置都需要相互照应,还要对你的Kubernetes集群状况有深入的了解。希望这份指南能帮助你创建出适合自己场景的监控系统,让你在首次发现问题时就能做出响应。
398 22
|
8月前
|
监控 Shell Linux
Android调试终极指南:ADB安装+多设备连接+ANR日志抓取全流程解析,覆盖环境变量配置/多设备调试/ANR日志分析全流程,附Win/Mac/Linux三平台解决方案
ADB(Android Debug Bridge)是安卓开发中的重要工具,用于连接电脑与安卓设备,实现文件传输、应用管理、日志抓取等功能。本文介绍了 ADB 的基本概念、安装配置及常用命令。包括:1) 基本命令如 `adb version` 和 `adb devices`;2) 权限操作如 `adb root` 和 `adb shell`;3) APK 操作如安装、卸载应用;4) 文件传输如 `adb push` 和 `adb pull`;5) 日志记录如 `adb logcat`;6) 系统信息获取如屏幕截图和录屏。通过这些功能,用户可高效调试和管理安卓设备。

相关产品

  • 日志服务
  • 推荐镜像

    更多