Logtail限制说明

重要

本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。

本文简介Logtail采集数据时在运行环境、文件采集、容器采集、CheckPoint管理、Logtail采集配置、机器组、性能、错误处理等方面的限制。

运行环境

限制项

限制说明

体系结构

  • Linux Logtail版本支持x86_64和arm64。

  • Windows Logtail版本支持x86_32和x86_64。

内存

负载为空时,不开启插件最少需要20 MB内存,开启插件最少需要120 MB内存。

实际使用量与采集速率、监控目录和文件数量、发送阻塞程度有关。

系统环境

  • Linux Kernel 2.6.32及以上版本。

  • glibc 2.5及以上版本。

  • Windows Server 2004及以上版本。

Kubernetes

  • 使用DaemonSet方式采集日志时,要求Kubernetes为1.10.0及以上版本(支持Mount propagation: HostToContainer)。

  • 使用CRD方式(alibaba-log-controller组件)采集日志时,要求Kubernetes为1.16.0及以上版本。

    Kubernetes 1.7.0及以上版本提供的apiextensions.k8s.io/v1beta1 API也支持CRD能力,但Beta版本的API稳定性取决于具体的Kubernetes版本,稳定性未知。

Docker

采集容器标准输出的限制说明如下:

  • 必须在Docker的配置文件daemon.json中添加"log-driver": "json-file"

  • 如果是Centos 7.4及以上版本(除Centos 8.0以外),需设置fs.may_detach_mounts=1。更多信息,请参见Bug 1468249Bug 1441737issue 34538

ACK logtail-ds组件

  • logtail-ds:每个节点至少预留0.1 Core CPU,256 MB内存。

  • alibaba-log-controller:每个节点至少预留0.05 Core CPU,100 MB内存。

重要

以上组件均为system-cluster-critical优先级,集群资源不足时请勿部署,否则可能驱逐节点上原有的Pod。

文件采集

限制项

限制说明

单条日志长度

默认限制为512 KB。您可通过启动参数max_read_buffer_size进行调整,最大不能超过8 MB。具体操作,请参见设置Logtail启动参数

多行日志按行首正则表达式划分后,每条日志大小限制仍为512 KB。如果日志超过512 KB,会被强制拆分为多条进行采集。例如:单条日志大小为1025 KB,则第一次处理512 KB,第二次处理512 KB,第三次处理1 KB,最终采集结果为多条不完整的日志。

文件编码

支持UTF-8或GBK的编码日志文件,建议使用UTF-8编码获得更好的处理性能。

警告

如果日志文件为其它编码格式则会出现乱码、数据丢失等问题。

日志文件大小

无限制。

日志文件轮转

日志轮转队列大小默认为20。您可通过启动参数logreader_max_rotate_queue_size进行调整。具体操作,请参见设置Logtail启动参数

支持设置采集路径为xxx.logxxx.log*形式。

重要

同一个Logtail实例中请勿混用两种形式,否则可能导致同一文件匹配多个Logtail采集配置,出现重复采集。

如果未处理完成的文件超过20个,将导致新生成的日志丢失。此类情况,请优先排查Logstore Shard写入Quota是否超限,并调整Logtail并发水平。具体操作,请推荐参数值

更多信息,请参见相关技术文章

日志解析阻塞时采集行为

日志解析阻塞时,Logtail会保持该日志文件描述符为打开状态,避免阻塞期间文件被删除,导致日志丢失。

如果解析阻塞期间出现多次日志文件轮转,Logtail会将文件放入轮转队列。

正则表达式

支持Perl兼容正则表达式。

JSON

完全支持标准JSON(RFC7159ECMA-404)。不支持非标准JSON,例如{"name": "\xE5\xAD\xA6"}

同一文件对应多个Logtail配置

默认一个文件只能匹配一个Logtail采集配置。如果文件中的日志需要被采集多份,请参见如何实现文件中的日志被采集多份

重要

采集多份时,文件读取的IO、计算资源和网络IO都会线性增加。

文件打开行为

Logtail会保持被采集的文件和轮转队列中待采集的文件处于打开状态,以保证采集数据完整性。出现以下情况,会关闭文件。

  • 文件超过5分钟未被修改。

  • 发生轮转且采集完毕。

  • Logtail采集配置发生变更。

如果无论文件是否采集完成或仍有日志写入文件,您都希望文件在删除后的可控时间内释放文件句柄,则您可通过启动参数force_release_deleted_file_fd_timeout设置超时时间。具体操作,请参见设置Logtail启动参数

首次日志采集行为

Logtail只采集增量的日志文件。首次发现文件被修改后,如果文件大小超过1 MB(容器标准输出为512 KB),则从最后1 MB处开始采集,否则从开始位置采集。

您可通过Logtail采集配置中的tail_size_kb参数调整新文件首次采集的大小。具体操作,请参见Logtail配置

如果下发Logtail采集配置后,日志文件一直无修改,则Logtail不会采集该文件。如果需要采集历史文件,请参见导入历史日志文件

文件发生覆盖的行为

Logtail采用inode+文件中前1024字节的Hash识别文件。文件被覆盖后,如果inode或文件前1024字节Hash发生变化,则文件会作为新文件从头开始采集,否则不会被采集。

文件发生移动的行为

文件发生移动后,如果匹配Logtail采集配置,且该Logtail采集配置之前从未匹配过该文件,则移动后的文档将被当成新文件从头开始采集,否则不会被采集。

文件采集历史

Logtail会在内存中保留文件采集历史进度,保证文件发生变化后仅采集增量部分,超过保留范围的日志如果发生写入,会导致重复采集。

  • 默认最多保留1个月内的历史文件。

  • 如果同一目录下历史文件超过5,000个时,仅保留最近1周的记录。

  • 如果同一目录下历史文件超过10,000个时,仅保留1天内的记录。

非标准文本日志

对于日志中包含\0的行,该条日志会被截断到第一个\0处,之后部分丢弃。对于其他转义字符(如ASCII颜色)或不可见字符,Logtail将按原样上报。

容器采集

说明

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

限制项

限制说明

首次日志采集行为

如果采集的是容器标准输出,则首次发现文件修改后,默认如果文件大小超过512 KB,则从最后512 KB处开始采集,否则从头采集。您可通过Logtail采集配置中的StartLogMaxOffset参数调整。具体操作,请参见通过DaemonSet-控制台方式采集容器标准输出

软链接

采集容器文件中的日志时,不支持目录及文件的软连接。

容器生命周期

默认情况下,容器生命周期至少在10秒以上,Logtail才能采集到日志。在容器文件采集场景下,出于性能因素,Logtail将限制3分钟内容器更新次数为10次。您可通过启动参数docker_config_update_intervalmax_docker_config_update_times进行调整。具体操作,请设置Logtail启动参数

标准输出日志轮转

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

标准输出日志驱动

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

CheckPoint管理

限制项

限制说明

CheckPoint超时时间

默认情况下,如果文件超过30天未被修改,该Checkpoint将被删除。如果在Logtail采集配置中设置了preserve:false,则文件超过30分钟未被修改,该Checkpoint将被删除。

CheckPoint保存策略

定期保存(15分钟),程序退出时会自动保存。您可以通过启动参数check_point_dump_interval进行调整。具体操作,请参见设置Logtail启动参数

CheckPoint保存位置

保存路径默认为/tmp/logtail_checkpoint。您可以通过启动参数check_point_filename进行调整。具体操作,请参见设置Logtail启动参数

宕机时的处理

由于CheckPoint是定期保存,因此宕机恢复时将从上一个完整保存的CheckPoint开始恢复,可能导致数据采集重复。调整Checkpoint保存策略以减少数据被重复采集。

Logtail采集配置

限制项

限制说明

配置更新生效的延时

从通过控制台或API更新配置到Logtail客户端配置生效的延时约为30秒。

配置动态加载

支持,且其中某一配置更新不影响其他配置。

单个Logtail实例的总体可加载配置数

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

第三方Flusher输出

通过日志服务控制台或者API创建的配置会与Logstore建立关联,因此,当您在插件配置中使用第三方Flusher时,Logtail会默认往当前Logstore发送一份数据。

多账号、跨账号

支持。更多信息,请参见多账号场景通过Logtail跨阿里云账号采集容器日志

多地域

默认不支持,如有需求请提工单申请。

全球加速

支持。需在服务侧开启后,在客户端设置全球加速。更多信息,请参见开启全球加速服务

机器组

限制项

限制说明

机器数量

理论上无限制,建议配置不超过100,000个,否则心跳无法正常获取。

应用配置数

理论上无限制,建议配置数不超过1,000个。

性能

限制项

限制说明

日志处理吞吐能力

原始日志流量默认限制为20 MB/s(数据被编码压缩后上传,一般压缩率为5~10倍)。超过该日志流量则有可能丢失日志,您可启动参数max_bytes_per_sec进行调整。具体操作,请参见设置Logtail启动参数

最大性能

单核的能力如下:

  • 极简模式日志最大处理能力为100 MB/s。

  • 正则默认最大处理能力为20 MB/s(与正则表达式的复杂度有关)。

  • 分隔符日志最大处理能力为40 MB/s。

  • JSON日志最大处理能力为30 MB/s。

通过启动参数process_thread_count设置多个处理线程,可提升1.5~3倍性能。

最大监控目录及文件数

与内存使用限制参数mem_usage_limit有关(主机场景默认为384 MB,容器场景默认为2048 MB),分为以下四个层级:

  • 最大监控目录总数:⌊mem_usage_limit/100⌋×5000(目录不包含Logtail采集配置中指定的目录黑名单)。

  • 最大监控目录和文件总数:⌊mem_usage_limit/100⌋×50000(目录不包含Logtail采集配置中指定的目录黑名单,文件包含未被Logtail采集配置匹配的文件)。

  • 单个采集配置监控目录和文件总数:⌊mem_usage_limit/100⌋×5000(目录不包含Logtail采集配置中指定的目录黑名单,文件包含未被Logtail采集配置匹配的文件)。

  • 单个目录中被监控的子目录和文件总数:⌊mem_usage_limit/100⌋×5000(目录包含Logtail采集配置中指定的目录黑名单,文件包含未被Logtail采集配置匹配的文件)。

当上述任一层级所监控的目录及文件数达到上限时,Logtail不再对该层级中剩余的目录和文件进行监控。您可以通过提高Logtail采集配置监控目录的精度或调整启动参数mem_usage_limit来提高监控上限。关于mem_usage_limit参数的更多信息,请参见设置Logtail启动参数

另外,针对Linux系统,Logtail还支持通过inotify机制对目录进行监听,从而减少日志采集的延时。inotify机制所能监控的最大目录数(含子目录)为3000。

资源超限处理策略

如果Logtail占用相关资源超过最大限制的时间5分钟,则Logtail会强制重启,此时数据可能会丢失或重复。

多租户隔离

Logtail在配置级别实现隔离,即单个Logtail采集配置出现异常不影响其他Logtail采集配置。更多信息,请参见相关技术文章

日志采集延迟

正常情况下从日志写入磁盘到Logtail采集到日志的延迟不超过1秒。

日志上传策略

Logtail会将同一文件的日志自动聚合上传,聚合条件为日志超过4000条、日志总大小超过512 KB或者日志采集时间超过3秒。任一条件满足则触发上传行为

错误处理

限制项

限制说明

网络错误处理

在出现网络异常时会主动重试并自动调整重试间隔。在极端情况下,可能存在日志重复采集或丢弃的风险:

  • 客户端发出的包被服务端接收,而服务端回应的包未能在15秒内被客户端接收时,客户端的重试将导致数据的重复采集。

  • 网络链路异常导致客户端收到的包损坏,连续产生5次错误,最终导致数据被丢弃。

资源配额超限处理

如果数据发送速率超出Logstore最大配额,Logtail会阻塞采集并自动重试。请尝试扩大Logstore的Shard数量。更多信息,请参见相关技术文章

客户端时间异常

可能因为请求时间和服务端时间差别超过15分钟,导致最大重试5次仍然不成功,数据被丢弃。请修正客户端机器时间。

Project或Logstore不存在

重试5次仍然不成功后丢弃数据。这种情况可能是因为您通过API删除了Logstore。请通过API删除对应Logtail采集配置和配置应用。

鉴权失败

重试5次仍然不成功后丢弃数据。这种情况通常有2种可能。

  • 在Logtail刚启动时出现,与网络不稳定,无法获得鉴权有关。

  • 如果持续出现,与机器无法通过HTTPS协议与日志服务Endpoint建立连接获得鉴权有关。

其他未知错误

重试5次仍然不成功后丢弃数据。

超时最大尝试时间

如果数据持续发送失败超过6小时,该数据将被丢弃。

状态自检

支持异常情况下自动重启,例如程序异常退出及使用资源超限等。