怎么通过Logrotate工具实现Workerman stdout日志文件的自动切割?

秋静姑娘_4965

秋静姑娘_4965

2026-05-24

941人浏览

原创

必须用copytruncate,否则workerman因不重开文件描述符会持续写入旧inode导致日志丢失;它通过复制内容后截断原文件,保持fd有效,确保日志不中断、不丢失。

怎么通过logrotate工具实现workerman stdout日志文件的自动切割?

Logrotate 配置里必须用 copytruncate,否则 Workerman 会写丢日志

Workerman 默认不重开文件描述符,它把 stdout(比如 /var/log/workerman.log)打开后就一直往里写,不会感知到 Logrotate 的 move 或 rename 操作。如果你不用 copytruncate,Logrotate 会把原文件移走再新建一个同名空文件,而 Workerman 还在往旧的 inode 里写——结果就是新日志文件永远为空,旧日志被切走后内容丢失。

正确做法是让 Logrotate 先复制一份再清空原文件,这样 Workerman 的 fd 仍有效:

/var/log/workerman.log {
    daily
    missingok
    rotate 30
    compress
    delaycompress
    copytruncate
    notifempty
}

注意几点:

  • copytruncate 是关键,不能省;
  • notifempty 避免空文件被误切;
  • delaycompress 防止刚切完就压缩,方便排查问题;
  • 别加 create,Workerman 自己建的日志文件权限/属主可能被覆盖。

Workerman 启动时要确保 stdout 被重定向到具体文件,而不是管道或 /dev/null

很多人用 php start.php start -d 启动后发现日志没生成,其实是没显式重定向 stdout。Workerman 默认把 echo、var_dump 等输出打到终端,后台运行时这些输出会被丢弃,除非你主动重定向。

启动命令必须带重定向:

php start.php start -d >> /var/log/workerman.log 2>&1

或者更稳妥地,在代码里用 file_put_contents + STDOUT 替代直接 echo,但最简单可靠的方式还是 shell 层重定向。注意:

科学计算器在线使用工具代码
科学计算器在线使用工具代码

html5 css3制作在线科学计算器ui布局,3D计算器面板,加减乘除数字计算器工具特效。

下载
  • 不要只写 >> 不写 2>&1,否则错误日志(如 Notice、Warning)不会进日志文件;
  • 路径得是绝对路径,相对路径在 daemon 模式下容易指向错目录;
  • 确保运行 Workerman 的用户对 /var/log/workerman.log 有写权限(比如用 www-data 运行,就得 chown www-data:www-data /var/log/workerman.log)。

Logrotate 手动测试切割是否生效,别等自动触发才发现问题

Logrotate 默认每天凌晨触发,等一天才能验证配置是否有效,太慢。应该立刻手动跑一次:

logrotate -f /etc/logrotate.d/workerman

然后检查:

  • 原 /var/log/workerman.log 是否变为空(copytruncate 的表现);
  • 是否有类似 /var/log/workerman.log.1 的归档文件生成;
  • Workerman 进程是否还在持续写入(tail -f /var/log/workerman.log 看实时输出);
  • 如果没写入,用 lsof -p $(pgrep -f "start.php") | grep log 确认进程是否还持有旧文件句柄(正常情况应指向当前 workerman.log,不是 .1)。

避免和 Workerman 内置日志组件冲突,禁用 Worker::$logFile 或保持路径一致

有些项目启用了 Workerman 的 Worker::$logFile = '/path/to/log';,它会调用 error_log() 写文件,和 shell 重定向的 stdout 是两套机制。混用会导致日志重复、时间戳错乱、甚至因并发写同一个文件引发内容损坏。

建议统一渠道:

  • 如果用 Logrotate 管理,就关掉 Worker::$logFile(设为 null 或注释掉);
  • 如果保留 Worker::$logFile,那 Logrotate 配置目标就得改成它指定的路径,且同样必须加 copytruncate;
  • 千万别让 Worker::$logFile 和 shell 重定向指向不同文件又都开着——你会看到一半日志在 A 文件、一半在 B 文件,查问题时直接抓瞎。

Logrotate 本身不复杂,但和 Workerman 这种长期运行、不 reload fd 的进程配合时,copytruncate 是绕不开的硬约束,漏掉它,一切配置都是白搭。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

workerman

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
Workerman安装配置教程
Workerman安装配置教程

Workerman安装配置教程专题提供Workerman安装配置、WebSocket开发、TCP通信、异步编程、高并发服务搭建与PHP实时通信开发教程。

2026.05.20

166

15

Workerman实时通信与长连接开发教程
Workerman实时通信与长连接开发教程

WWorkerman实时通信与长连接开发教程聚合实时通信、聊天室、长连接、消息推送、AI流式输出等Workerman高并发开发内容。

2026.05.20

202

12

Workerman异步通信与TCP服务器开发
Workerman异步通信与TCP服务器开发

Workerman异步通信与TCP服务器开发专题整理Workerman异步通信、TCP服务、HTTP服务、WebSocket开发与高并发PHP服务器教程。

2026.05.20

187

13

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

2026.09.30

120

10

LLVM RISC-V参数配置教程
LLVM RISC-V参数配置教程

本专题介绍LLVM对RISC-V基础ISA和扩展的支持方式,涵盖RV32、RV64、标准扩展、实验性扩展、厂商扩展、-menable-experimental-extensions和版本差异。

2026.09.30

100

14

LLVM IR中间表示入门指南
LLVM IR中间表示入门指南

本专题整理LLVM IR的核心概念,包括中间表示作用、模块结构、函数、基本块、SSA形式、类型系统和常见语法,帮助新手理解LLVM编译流程中的关键层。

2026.09.30

80

12

PDF转图片方法
PDF转图片方法

需要把 PDF 页面用于上传、预览、分享或图片归档时,PDF 转图片方法专题整理 JPG/PNG 格式选择、逐页导出、清晰度设置、批量下载和结果检查等流程,帮助用户稳定完成 PDF 图片化处理。

2026.09.30

60

26

PixTV AI视频生成与无限画布创作
PixTV AI视频生成与无限画布创作

PixTV专题整理AI视频与视觉内容创作相关功能使用教程,涵盖AI生图、视频生成、无限画布、多模型创作、素材管理、声音音乐及视频剪辑等功能,帮助用户快速掌握PixTV从创意到成片的完整制作方法。

2026.09.29

80

15

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

2026.09.23

280

15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习

Pandas 官方文档与用户指南
Pandas 官方文档与用户指南

共0课时 | 0人学习

GDB 当前开发版文档
GDB 当前开发版文档

共0课时 | 0人学习