通过 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.1 、bar.log.2 等日志文件。
LogCollector 会自动识别轮转前后的日志文件,保证日志的完整性。
如果日志文件轮转过于频繁,导致短时间内轮转创建大量的日志文件,那么 LogCollector 仅同时采集 20 个轮转日志文件,超过 20 个的轮转日志无法被采集,可能导致部分轮转日志文件尚未被采集就被删除,从而导致日志丢失。 - copytruncate 日志文件轮转:当日志文件达到一定大小或时间限制时,将当前的日志文件复制到一个新的日志文件中,例如添加时间戳或序号,然后清空原日志文件,并继续写入新的日志。例如原日志文件为
bar.log ,轮转后会生成 bar.log.1 、bar.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(RFC7159、ECMA-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 个。 |
多账号采集 | 请通过工单系统联系技术支持。 |
多地域采集 | 请通过工单系统联系技术支持。 |