如何在Envoy基于文件的日志功能中配置日志轮转?
Envoy FileAccessLog 日志轮转相关问题解答
原生FileAccessLog的内置滚动机制
type.googleapis.com/envoy.extensions.access_loggers.file.v3.FileAccessLog 本身没有任何内置的日志滚动/轮转逻辑。它的工作逻辑非常简单:Envoy启动时打开配置中指定的日志文件,持有该文件的句柄,之后所有访问日志以追加模式持续写入这个句柄,全程不会主动判断文件大小、写入时间,也不会主动切分、重命名、清理旧日志。
默认配置下日志文件是否会持续增大
会。只要Envoy进程持续运行、没有外部介入操作,日志文件会随着请求写入持续增大,没有上限,直到占满所在磁盘分区的可用空间。
如果手动对日志文件做重命名/移动操作但没有通知Envoy,Envoy依然会持有原文件的句柄继续写入,被移动走的旧日志文件体积依然会持续增长,不会释放磁盘空间。
日志轮转的实现方案
生产环境通用的实现方案有两种,都不需要修改Envoy本身的日志写入逻辑:
- 方案1:宿主机部署场景使用系统logrotate
这是物理机/虚拟机部署Envoy时最通用的方案,依赖Linux系统自带的logrotate组件完成日志切分、压缩、保留周期管理,只需要在切分完成后给Envoy进程发送SIGUSR1信号,通知Envoy重新打开日志文件句柄即可。
参考配置(放置在/etc/logrotate.d/envoy路径下):/var/log/envoy/access.log { # 按天轮转 daily # 单文件超过1G也触发轮转,避免短时间大流量打满磁盘 size 1G # 保留14份历史日志 rotate 14 # 轮转后的旧日志用gzip压缩 compress # 最新一份轮转日志不压缩,方便排查问题 delaycompress # 日志文件不存在时不报错 missingok # 文件为空时不轮转 notifempty # 轮转后创建新文件,设置权限和属主 create 0640 envoy envoy # 所有日志切分完成后统一执行脚本 sharedscripts postrotate # 给Envoy进程发SIGUSR1信号触发日志句柄重开 /bin/kill -SIGUSR1 $(cat /var/run/envoy/envoy.pid 2>/dev/null) 2>/dev/null || true endscript } - 方案2:容器/K8s场景将日志输出到标准输出
云原生部署场景下不需要在容器内部处理日志轮转,直接将FileAccessLog的日志路径配置为/dev/stdout,让日志输出到标准输出流:
后续日志轮转、采集工作交给容器运行时、K8s kubelet或者部署的边车日志组件(如Fluent Bit、Filebeat)完成即可,不需要在Envoy侧做额外配置。access_log: - name: envoy.access_loggers.file typed_config: "@type": type.googleapis.com/envoy.extensions.access_loggers.file.v3.FileAccessLog path: /dev/stdout log_format: # 可按需自定义日志格式 text_format_source: inline_string: "[%START_TIME%] \"%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%\" %RESPONSE_CODE% %RESPONSE_FLAGS% %BYTES_RECEIVED% %BYTES_SENT% %DURATION% \"%REQ(X-FORWARDED-FOR)%\" \"%REQ(USER-AGENT)%\" \"%REQ(X-REQUEST-ID)%\"\n"
注意:不要使用手动复制、直接清空日志文件的方式处理日志,未发送SIGUSR1信号的情况下,这类操作会导致日志丢失、磁盘空间无法正常释放。
内容的提问来源于stack exchange,提问作者Bishnu
相关产品推荐
相关产品推荐

