You need to enable JavaScript to run this app.
导航
LogCollector 限制说明
最近更新时间:2024.10.15 11:09:08首次发布时间:2023.05.10 14:20:18

通过 LogCollector 采集日志数据时,请注意以下使用限制。

说明

本文档中的限制说明基于 LogCollector 最新正式版本。查看 LogCollector 版本号的步骤请参考查看软件版本,LogCollector版本说明请参考LogCollector 版本说明

运行环境

限制项

说明

体系结构

  • LogCollector 支持 Linux x86_64 架构,已经过兼容性测试的操作系统版本请参考安装环境
  • 暂不支持 ARM 架构。
  • 暂不支持 Windows 系统。

系统环境

Linux Kernel 2.6.32 及以上版本。

Kubernetes

  • 使用 DaemonSet 方式采集日志时,应使用 Kubernetes 1.10.0 或以上版本,即支持 Mount propagation: HostToContainer 的版本。
  • 使用 CRD 方式采集容器日志时,应使用 Kubernetes 1.16.0 及以上版本。
  • Kubernetes 1.7.0 及以上版本提供的 apiextensions.k8s.io/v1beta1 API 也支持 CRD 能力,但 Beta 版本的 API 稳定性取决于具体的 Kubernetes 版本,稳定性未知。

文件采集

限制项

说明

日志采集长度

单条日志最大长度为 512KiB。

  • LogCollector 2.1.0 及后续版本:支持通过启动参数 log_max_bytes 调整单条日志的最大长度,最大不能超过 8MB。
  • LogCollector 1.0.48 及后续版本:如果单条日志超出 512 KiB,日志会被拆分为多条进行采集。例如单条日志长度为 1048 KiB,则会被拆分成三条日志,第一条日志长度为 512 KiB,第二条日志长度为 512 KiB,第三条日志长度为 24 KiB。
  • LogCollector 1.0.48 之前版本:如果单条日志超出 512 KiB,超出部分将被截断;如果单条日志超出 2 MiB,整条日志将被丢弃。

日志没有以换行符结尾

当 LogCollector 读取到没有以换行符结尾的日志时,LogCollector 默认会等待 5 秒,然后上传这条日志。

日志文件大小

无限制。

日志文件编码

支持 UTF-8 编码的日志文件。

日志聚合上传

LogCollector 会将同一文件的日志自动聚合上传。相较于逐条上传日志的方式,聚合日志可以显著减少网络请求次数,提高日志上传的吞吐量。
聚合条件为日志超过 1024 条、日志总大小超过 512KiB 或者日志聚合时间超过 3 秒,任一条件满足则触发聚合。

日志文件轮转

LogCollector 支持日志文件轮转场景下的日志采集。

  • (推荐)rename 日志文件轮转:当日志文件达到一定大小或时间限制时,将当前的日志文件重命名为一个新的文件名,例如添加时间戳或序号,然后创建一个新的日志文件,并继续写入新的日志。例如原日志文件为 bar.log,轮转后会生成 bar.log.1bar.log.2 等日志文件。
    LogCollector 会自动识别轮转前后的日志文件,保证日志的完整性。
    如果日志文件轮转过于频繁,导致短时间内轮转创建大量的日志文件,那么 LogCollector 仅同时采集 20 个轮转日志文件,超过 20 个的轮转日志无法被采集,可能导致部分轮转日志文件尚未被采集就被删除,从而导致日志丢失。
  • copytruncate 日志文件轮转:当日志文件达到一定大小或时间限制时,将当前的日志文件复制到一个新的日志文件中,例如添加时间戳或序号,然后清空原日志文件,并继续写入新的日志。例如原日志文件为 bar.log,轮转后会生成 bar.log.1bar.log.2 等日志文件。
    假设配置的采集路径是 bar.log,当 LogCollector 存在采集延迟时,copytruncate 日志文件轮转会导致延迟采集的日志丢失。
    假设配置的采集路径是 bar.log*,copytruncate 日志文件轮转会导致已经采集过的日志重复采集。

日志文件的首次采集位置

LogCollector 支持采集历史日志文件和新日志文件。LogCollector 会定时扫描采集路径匹配的日志文件,包括历史日志文件和新日志文件,然后并发采集。LogCollector 同时会通过 inotify 监控新日志文件的写入事件,然后并发采集。

  • 历史日志文件:LogCollector 会从上次采集结束的位置继续开始采集。
  • 新日志文件:如果新日志文件小于等于增量采集回溯量,那么 LogCollector 会从新日志文件的起始位置开始首次采集。如果新日志文件的大小大于增量采集回溯量,那么 LogCollector 会从新日志文件的末尾位置减去增量采集回溯量开始首次采集。

忽略历史日志文件

LogCollector 默认会忽略 30 天没有被更新的日志文件。

日志文件标识

LogCollector 使用 inode、device 和前 1024 个字节的校验和来唯一标识日志文件。

说明

  • 使用 vim 修改日志文件时,vim 会重建日志文件,导致日志文件的 inode 发生变化,LogCollector 会将其视为全新的日志文件并从头开始采集其中的日志。
  • 当日志文件被 truncate 时,日志文件的前 1024 个字节内容会发生变化,导致日志文件的前 1024 个字节的校验和(Checksum)发生变化,因此 LogCollector 会将其视为全新的日志文件并从头开始采集其中的日志。

采集文件数量

LogCollector 最多能同时采集 10,000 个日志文件。待采集的日志文件数量超出 10,000 时,超出的日志文件暂时无法被采集。

采集路径通配符

LogCollector 采集路径支持通配符星号 *、双星号**、问号?

  • * 表示任意多个字符(目录分隔符 / 除外)。
  • ? 表示任意单个字符(目录分隔符 / 除外)。
  • ** 表示任意多个字符(包括目录分隔符 /)。
    • LogCollector 采集路径中,双星号**通配符最多配置一个。
    • 日志采集路径中指定通配符 ** 时,表示多层目录匹配,仅在此时,日志服务才会监听指定目录下深至 8 级的子目录。例如采集路径是 /var/**/a.log,LogCollector 将默认解析为 /var/a.log/var/*/a.log/var/*/*/a.log/var/*/*/*/a.log/var/*/*/*/*/a.log/var/*/*/*/*/*/a.log/var/*/*/*/*/*/*/a.log/var/*/*/*/*/*/*/*/a.log/var/*/*/*/*/*/*/*/*/a.log

扫描日志文件周期

LogCollector 每隔 10 秒扫描一次,发现与采集路径匹配的日志文件。

扫描日志文件数量

LogCollector 单次扫描最多能够扫描 100,000 个日志文件。如果采集路径匹配的日志文件数量超过100,000,那么只有 100,000 个日志文件被扫描,其他日志文件无法被扫描。

inotify 数量

LogCollector 最多持有 16 个 inotify 实例。
一个采集 pipeline 独占一个 inotify 实例。如果采集 pipeline 的数量超过 16,那么只有 16 个采集 pipeline 能够成功获取到 inotify 实例,并使用定期扫描和 inotify 实时监控发现待采集的日志文件),其他采集 pipeline 无法获取到 inotify 实例,只能使用定期扫描发现待采集的日志文件。

说明

  • 物理机场景下,一个采集 pipeline 为一个采集规则。
  • 容器场景下,一个采集 pipeline 为一个采集规则及其匹配的一个容器。

inotify 监控的日志目录数量

单个 inotify 实例最多能够监控 200 个日志目录。inotify 实例只监控日志目录,不监控日志文件。如果需要被监控的日志目录数量超过 200,那么只有 200 个日志目录被监控,其他日志目录无法被监控。

日志文件的句柄释放策略

当 LogCollector 持续读取到日志文件结束符 EOF 的时间超过 60 秒时,LogCollector 将关闭日志文件的句柄。LogCollector 还支持其他日志文件句柄释放策略,包括:

  • 当日志文件被删除时,关闭文件句柄。
  • 当日志文件被重命名时,关闭文件句柄。
  • 当 LogCollector 读取到日志文件 EOF 时,关闭文件句柄。
  • 当 LogCollector 读取日志文件的时间超过多少秒时,关闭文件句柄。

一个日志文件匹配多个采集配置

当一个日志文件匹配多个采集配置时,默认情况下,这个日志文件被最新创建的采集配置所采集。

软连接

物理机部署环境中,LogCollector 支持采集软连接。

  • 单个采集配置同时匹配软连接和软连接所指向的实际文件的场景下,LogCollector 只会采集软连接或其指向的实际文件,不会同时采集两者。因此,日志携带的 __path__ 元数据可能为软连接的路径,也可能为软连接所指向的实际文件的路径。
  • 如果是通过定期扫描发现的日志文件,那么 LogCollector 会选择采集路径字典序较小的日志文件,因此 __path__ 元数据可能为软连接的路径,也可能为软连接所指向的实际文件的路径。
  • 如果是通过 inotify 发现的日志文件,那么 LogCollector 只会选择采集软连接指向的实际文件,因此 __path__ 元数据只会为软连接所指向的实际文件的路径。

正则表达式

支持 Perl 兼容正则表达式。

JSON

支持标准JSON(RFC7159ECMA-404)。

容器采集

通过LogCollector采集容器日志时,除上述文件采集的限制项外,还存在如下限制项。

分类
限制项
说明

通用限制

Kubernetes 容器生命周期

默认情况下,容器生命周期至少应在 10 秒以上,LogCollector 才能采集到日志。若有更短容器生命周期的采集需求,请通过工单系统联系技术支持。

Kubernetes Pod销毁事件

接收到 Kubernetes Pod 销毁事件时,LogCollector 不会立即停止采集该 Pod 内的容器日志,而是会额外采集 15 秒后释放该 Pod 内容器的文件句柄,这可能会延长 Pod 的销毁时间。
您可以通过启动参数 cleanup_timeout 调整额外的采集时间。

容器运行时

LogCollector 支持 Docker 和 Containerd 两种容器运行时。

  • Docker:LogCollector 通过 /run/docker.sock 访问 Docker 容器运行时,请确保该路径存在且具备访问权限。
  • Containerd:LogCollector 通过 /run/containerd/containerd.sock 访问 Containerd 容器运行时,请确保该路径存在且具备访问权限。

容器内日志文件

挂载方式

容器内日志文件的采集路径目前仅支持“不挂载”、“emptyDir 挂载”和“hostPath 挂载” 3 种方式。

软链接

容器内日志文件不支持软连接。

Job 工作负载

针对 Job 工作负载类型的 Kubernetes Pod,销毁 Pod 之前 Kubernetes 会首先清理 Pod 内容器的资源(例如 rootfs 下的文件句柄),因为 LogCollector 没有接收到 Kubernetes Pod 销毁事件,所以 LogCollector 不会释放正在采集的日志文件句柄,导致 Kubernetes Pod 销毁时间延长。建议使用“emptyDir 挂载”和“hostPath 挂载”,不要使用“不挂载”。

容器标准输出

标准输出日志驱动

如果使用 Docker 作为容器运行时,必须在 Docker 的配置文件 daemon.json 中添加 "log-driver": "json-file"

标准输出日志轮转

容器标准输出的标准输出文件由 docker 或 kubelet 进行日志文件轮转。其中,kubelet 日志文件轮转的大小默认为 10MB,如果容器每秒标准输出的速率大于 10MB/s,将导致标准输出文件快速轮转,建议改用容器内日志文件方式进行采集或修改 kubelet 的 containerLogMaxSize 参数以避免日志丢失。

采集配置

限制项

说明

采集配置更新生效的延时

从通过 API 或者控制台更新的采集配置到 LogCollector 客户端配置生效的延时约为 60 秒。

采集配置动态加载

LogCollector 支持动态加载采集配置,且其中某一采集配置的更新不影响其他配置。

单个 LogCollector 可加载配置数

理论上无限制。建议一台服务器中的 LogCollector 采集配置数不超过 100 个。

多账号采集

请通过工单系统联系技术支持。

多地域采集

请通过工单系统联系技术支持。