ThinkPHP 在 CentOS 的日志管理实践
一 默认路径与级别
- 默认日志目录为项目根目录下的 runtime/log/,常见按天生成文件(如:YYYY-mm-dd.log)。
- 日志级别从低到高:debug → info → notice → warning → error → critical → alert → emergency;在配置中设置 level 可只保留高于等于该级别的日志(如仅记录 error)。
- 快速记录示例:
- 使用门面:
- Log::info(‘用户登录’, [‘user_id’ => 1]);
- Log::error(‘支付失败’, [‘order_id’ => 1001]);
- 使用助手函数:
- 手动写入与保存:
- Log::record(‘消息’, ‘notice’);(先写入内存)
- Log::save();(在请求结束或手动触发时落盘)
- Log::write(‘立即写入’, ‘warning’);(实时写入)
- 版本要点:
- 5.0.4+ 命令行模式会自动定时写入;
- 5.0.16+ 支持文件日志自动清理(配合 max_files 限制保留数量)。
二 在 CentOS 进行日志轮转
- 推荐优先使用框架内置的文件日志保留策略(简单、可靠):
- 在 config/log.php 的 file 通道中设置保留文件数,例如:
- ‘max_files’ => 30(仅保留最近 30 个日志文件,超出自动清理)
- 若需与系统统一运维策略,可用 logrotate 管理 ThinkPHP 日志目录(适合多项目、集中采集场景):
- 创建配置:/etc/logrotate.dphp
- 示例配置(按天轮转、保留 7 天、压缩、自动创建新文件):
- /var/www/your-project/runtime/log/*.log {
- daily
- rotate 7
- compress
- missingok
- notifempty
- create 644 www-data www-data
- copytruncate
}
- 说明:
- 路径请替换为你的实际 runtime/log 绝对路径;
- copytruncate 可在不重启应用的情况下清空原文件继续写入,适合文件句柄被长期占用的场景;
- 测试与生效:
- 手动测试:logrotate -f /etc/logrotate.dphp
- 日常由 /etc/cron.daily/logrotate 每日自动执行。
三 集中采集与可视化(可选)
- 使用 Filebeat → Logstash → Elasticsearch → Kibana 集中管理与检索日志:
- Filebeat 读取 ThinkPHP 日志,针对堆栈多行日志可设置多行合并,例如以 ----- 开头的行作为新事件起始:
- filebeat.inputs:
- type: log
- paths:
- /var/www/your-project/runtime/log/*.log
- multiline.pattern: ‘^-’
- multiline.negate: true
- multiline.match: after
- encoding: utf-8
- 将处理后的日志送入 Logstash/ES 后在 Kibana 中检索、分析与告警。
四 常见问题与运维建议
- 目录权限:确保 runtime/log 对 Web/CLI 运行用户可写(如 www-data 或 nginx 用户),否则会出现日志不写入。
- 日志不写入:检查是否误将日志类型设为 test(该类型不写磁盘);如需临时关闭可如此设置,排查完请恢复为 file。
- 日志过大:优先使用框架的 max_files 控制保留数量;若采用 logrotate,可结合 size 与 rotate 控制体积与周期。
- 敏感信息:避免在生产日志中记录 密码、密钥、卡号 等敏感数据。
- 实时排查:开发/排错时可用 tail -f runtime/log/YYYY-mm-dd.log 实时查看最新日志。