通过环境变量方式采集日志

ECI支持通过容器的环境变量传入日志相关的自定义配置。本文介绍如何通过环境变量来配置日志采集,实现通过阿里云日志服务SLS自动采集容器日志。

背景信息

阿里云日志服务SLS(Log Service)是针对日志数据的一站式服务,您无需开发就能快捷完成日志数据采集、消费、投递以及查询分析等功能。更多信息,请参见日志服务简介

前提条件

已开通日志服务。登录日志服务控制台时,如果没有开通日志服务,将收到相关提示,您可以根据页面提示开通。

注意事项

  • 仅在创建ECI实例时才能通过环境变量自定义配置日志采集,更新实例时传入的日志相关环境变量不会生效。

  • 对于自定义配置的日志Project和Logtail配置,如果后续不再使用,请及时删除相关Project和Logtail配置,避免产生不必要的费用。

配置说明

日志相关环境变量名称的格式前缀为aliyun_logs_{key},可配置的环境变量如下:

重要

{key}表示日志服务中Logtail采集配置的名称,只能包含小写字母、数字和短划线(-)。您可以自定义配置{key},但必须保证在K8s集群内唯一。

配置对象

是否必选

环境变量名称

说明

Logtail配置

aliyun_logs_{key}

创建Logtail配置。取值说明如下:

  • 采集标准输出,取值如下:

    • stdout:采集正常输出和错误信息。

    • stderr-only:只采集错误信息,不采集正常输出。

    • stdout-only:只采集正常输出,不采集错误信息。

  • 采集文本文件时,取值为容器内的文件目录。

项目

aliyun_logs_{key}_project

指定日志服务Project。

如果不设置该环境变量,则使用默认的Project。默认的Project的名称格式为k8s-log-<cluster-id>。

日志库

aliyun_logs_{key}_logstore

指定日志服务Logstore。

如果不设置该环境变量,则Logstore和{key}一致。

机器组

aliyun_logs_{key}_machinegroup

指定机器组。

如果不设置该环境变量,则使用默认的机器组。

分区

aliyun_logs_{key}_shard

设置日志分区数。

  • 取值范围为1~10。

  • 如果不设置该环境变量,则默认分区数为2。

日志保留时间

aliyun_logs_{key}_ttl

设置日志保留时间,单位为天。

  • 取值范围为1~3650。取值为3650时,表示永久保留日志。

  • 如果不设置该环境变量,则日志默认保留90天。

标签

aliyun_logs_{key}_tags

绑定标签。取值格式为tag-key=tag-value,用于对日志进行标识。

配置示例

  1. 连接集群。

  2. 创建应用。

    在容器的环境变量中可以传入日志相关配置。以Deployment为例,YAML内容示例如下,示例中容器启动后会执行相关命令,不断打印标准输出和日志文件。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: sls
      name: eci-sls-demo
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: sls
      template:
        metadata:
          labels:
            app: sls
            alibabacloud.com/eci: "true" 
        spec:
          containers:
          - image: registry-vpc.cn-beijing.aliyuncs.com/eci_open/alpine:3.5
            imagePullPolicy: Always
            args:
            - -c
            - mkdir -p /log;while true; do echo hello world; date; echo hello sls >> /log/alpine.log; sleep 1;done
            command:
            - /bin/sh
            name: alpine
            env:
            #配置Project,如果使用默认的Project,则可以不填
            - name: aliyun_logs_test-stdout_project
              value: k8s-log-c21492
            - name: aliyun_logs_test-file_project
              value: k8s-log-c21492
            #配置机器组,如果使用默认的机器组,则可以不填
            - name: aliyun_logs_test-stdout_machinegroup
              value: k8s-group-app-alpine
            - name: aliyun_logs_test-file_machinegroup
              value: k8s-group-app-alpine
            #将标准输出采集到名为test-stdout的Logstore,采集路径为标准输出stdout
            - name: aliyun_logs_test-stdout
              value: stdout
            #将/log/*.log目录下的日志采集到名为test-file的Logstore,采集对象为/log目录下的所有.log文件
            - name: aliyun_logs_test-file
              value: /log/*.log
            #设置日志保留时间,只对名为test-stdout的Logstore生效
            - name: aliyun_logs_test-stdout_ttl
              value: "7"
            #设置日志分区数,只对名为test-stdout的Logstore生效
            - name: aliyun_logs_test-stdout_shard
              value: "2"
            #挂载EmptyDir Volume。除标准输出外,其它自定义目录的日志采集必须挂载EmptyDir Volume
            volumeMounts:
            - name: volume-sls
              mountPath: /log
          volumes:
          - name: volume-sls
            emptyDir: {}

    将以上YAML保存为test-sls-env.yaml,执行以下命令创建应用。

    kubectl create -f test-sls-env.yaml
  3. 确认应用状态。

    kubectl get pod

    预期返回:

    NAME                             READY   STATUS    RESTARTS   AGE
    eci-sls-demo-b97bbd7d6-z9twz     1/1     Running   0          2m45s
  4. 查看日志。

    1. 登录日志服务控制台

    2. 单击目标Project名称。

    3. 找到目标日志库,单击日志库名称查看日志。

      • 标准输出

        日志env0

      • 文件日志

        日志env1