采集Docker容器的标准输出

在服务器上部署Docker后可以采集日志,Docker的日志分为两种类型:标准输出和文件日志。文件日志是指容器内生成的日志被写入服务器的指定文件目录中,而标准输出则指容器的实时输出流。本文介绍使用Logtail采集容器的标准输出到Logstore的操作步骤。

概览

本文以云服务器为例,在Linux系统的ECS实例中安装Docker后,针对您在该环境中部署的业务容器所产生的标准输出(stdout)及标准错误(stderr)日志,您可以使用Logtail进行采集。采集的日志数据将被传输至Logstore中,便于查询和分析。

image

前提条件

  • 已创建Project和Logstore。更多信息,请参见管理Project管理Logstore

  • ECS实例处于运行中的状态并已安装Docker

  • 目标容器持续产生日志。
    重要 Logtail只采集增量日志。如果下发Logtail配置后,日志文件无更新,则Logtail不会采集该文件中的日志。更多信息,请参见读取日志

1. 部署Logtail容器

1.1 拉取Logtail镜像

  1. 登录ECS管理控制台,找到目标ECS实例,单击远程连接,连接成功后,使用docker -v查看版本信息。如下图回显信息所示,表示Docker已安装成功。

    image

  2. 拉取Logtail镜像,地域信息请参见地域对照表,根据实际情况替换cn-hangzhou。如果您的服务器处于阿里云VPC网络中,需将registry修改为registry-vpc

    docker pull registry.cn-hangzhou.aliyuncs.com/log-service/logtail

1.2 启动Logtail容器

替换命令模板中的3个参数:${your_region_name}${your_aliyun_user_id}${your_machine_group_user_defined_id},然后执行命令。

docker run -d \
    -v /:/logtail_host:ro \
    -v /var/run/docker.sock:/var/run/docker.sock \
    --env ALIYUN_LOGTAIL_CONFIG=/etc/ilogtail/conf/${your_region_name}/ilogtail_config.json \
    --env ALIYUN_LOGTAIL_USER_ID=${your_aliyun_user_id} \
    --env ALIYUN_LOGTAIL_USER_DEFINED_ID=${your_machine_group_user_defined_id} \
    registry.${your_region_name}.aliyuncs.com/log-service/logtail

命令执行成功会生成一个容器ID,例如我设置机器组的用户自定义标识为docker-log-demo,容器启动如下。

image

参数说明如下:

参数

参数说明

--privileged

--privileged参数是必要的,否则删除其他容器时可能出现错误container text file busy,更多信息请参见Bug 1468249Bug 1441737issue 34538。对于Centos 7.4及以上版本(不包括Centos 8.0),可以去掉--privileged参数,然后执行以下命令设置fs.may_detach_mounts=1

echo fs.may_detach_mounts=1 | sudo tee /etc/sysctl.d/may_detach_mounts.conf
sudo sysctl -p /etc/sysctl.d/may_detach_mounts.conf
sysctl fs.may_detach_mounts

${your_region_name}

请根据日志服务Project所在地域及网络类型填写。其中,地域信息请参见地域对照表,网络类型选择请参见选择网络

  • 如果为公网,格式为region-internet。例如华东 1(杭州)cn-hangzhou-internet

  • 如果为阿里云内网,格式为region。例如华东 1(杭州)cn-hangzhou

${your_aliyun_user_id}

您的日志服务所在的阿里云账号(主账号)ID。获取方法,请参见获取日志服务所在的阿里云账号(主账号)ID

${your_machine_group_user_defined_id}

设置机器组的用户自定义标识,请确保该标识在您的Project所在地域内唯一。比如docker-log-demo

重要

如果您要自定义配置Logtail容器的启动参数,只需保证以下前提条件。

  • 启动时,必须配置3个环境变量ALIYUN_LOGTAIL_USER_DEFINED_IDALIYUN_LOGTAIL_USER_IDALIYUN_LOGTAIL_CONFIG

  • 将宿主机上的/var/run目录挂载到Logtail容器的/var/run目录。

  • 将宿主机根目录挂载到Logtail容器的/logtail_host目录。

  • 如果Logtail日志(/usr/local/ilogtail/ilogtail.LOG)中出现The parameter is invalid : uuid=none的错误日志,请在宿主机上创建一个product_uuid文件,在其中输入任意合法UUID(例如169E98C9-ABC0-4A92-B1D2-AA6239C0D261),并把该文件挂载到Logtail容器的/sys/class/dmi/id/product_uuid目录。

2. 创建Logtail采集配置

  1. 进入采集配置流程。单击页面右侧快速接入数据卡片,在自建开源/商业软件页签下,单击Docker标准输出-容器

    image

  2. 选择目标Project和Logstore,然后单击下一步

    image

  3. 单击创建机器组。在右侧面板,单击用户自定义标识,输入log-docker-demo,然后单击确定。这里的自定义标识必须和步骤1.2中配置的${your_machine_group_user_defined_id}一致。

    image

  4. 在Logtail配置页面,确定全局配置、输入配置和处理配置,单击下一步。参数说明请参见采集主机文本日志

    image

  5. 在查询分析配置页面创建索引,根据向导完成数据接入。

3. 查看上传结果

3.1 查看容器标准输出日志

例如目标容器名为aliweb,使用docker logs ${container_ID}命令查看容器标准输出的日志。

image

您也可以通过日志文件查看。默认情况下,Docker将容器的日志输出保存在宿主机的/var/lib/docker/containers目录下。每个容器对应一个以容器ID命名的文件夹,而容器的日志则存储在该文件夹内,文件名通常为${container_id}-json.log

3.2 查看上传结果

image

Docker标准输出的每条日志默认包含如下字段:

字段名

说明

__source__

Logtail容器的IP地址。

__tag__:__hostname__

宿主机的名称。

__tag__:__receive_time__

日志到达服务端的时间。

_time_

数据上传时间,例如2024-02-02T02:18:41.979147844Z

_source_

输入源类型,stdout或stderr。

_image_name_

镜像名。

_container_name_

容器名。

_container_ip_

业务容器IP地址。

相关文档