在 access_log 指令中需配合 buffer 使用 flush=时间值(如 flush=5s),仅对 access_log 生效,控制缓冲区最迟刷盘时限,单位仅支持 s,且 log_format 必须前置定义。

直接在 access_log 指令中添加 flush=时间值 即可,比如 flush=5s,表示缓冲区中的日志最多停留 5 秒就会强制写入磁盘。这个参数必须配合 buffer 使用,单独设置无效,且只对 access_log 生效,error_log 不支持。
flush 参数的生效前提
它不是独立开关,依赖缓冲机制才能起作用:
- 必须先配置
buffer=大小(如buffer=64k),否则flush被完全忽略 -
log_format定义需放在access_log指令之前,否则格式可能不生效 - 时间单位仅支持 s(秒),例如
flush=1s、flush=10s;不支持ms或m
常见 flush 时间值选择建议
需根据业务对延迟敏感度和容错能力做权衡:
- 1s~3s:适合监控接口、实时告警类场景,能快速发现问题,但断电或崩溃时可能丢失最多几秒日志
- 5s:通用推荐值,多数业务在此档位平衡了响应速度与可靠性,刷盘频率适中,I/O 压力可控
- 10s 或更长:吞吐优先型服务(如静态资源分发、日志量极大且磁盘较慢),但故障时可能丢失最多 10 秒甚至更多访问记录
配置写法与验证要点
正确示例(放在 http 或 server 块中):
access_log /var/log/nginx/access.log main buffer=64k flush=5s;
注意以下细节:
- 每个 worker 进程独享一份缓冲区,总内存占用 =
worker_processes × buffer_size - 修改后执行
nginx -s reload生效,无需重启进程 - 可通过
strace -p $(pgrep nginx) -e write观察实际刷盘间隔,验证是否按预期触发
flush 的实际行为逻辑
它控制的是“最迟刷盘时限”,不是固定周期定时器:
- 若缓冲区提前写满(如 2 秒就攒够 64KB),会立即刷盘,不等满 5 秒
- 若请求稀疏,缓冲区长期不满,则严格等到第 5 秒才强制刷出
- worker 进程优雅退出(如 reload)时,Nginx 会主动刷空当前 buffer,避免日志丢失



















