温馨提示×

thinkphp在centos上的日志如何管理

小樊
50
2025-11-19 20:37:59
栏目: 编程语言

ThinkPHP 在 CentOS 上的日志管理实践

一 定位与保留策略

  • 日志默认目录为项目根目录下的 runtime/log/,常见按天生成文件(如:YYYY-mm-dd.log)。框架自 5.1.6+ 起支持通过文件通道的 max_files 限制保留文件数量,避免无限增长;从 5.1.15+ 可开启 json 格式便于分析。示例配置(config/log.php):

    • 设置保留最近 30 个日志文件
    • 仅记录 error/info 级别
    • 开启 JSON 行式日志
    • 自定义日志路径(可选)

    参考配置:

    return [
        'default' => 'file',
        'channels' => [
            'file' => [
                'type'      => 'file',
                'path'      => '',            // 默认 runtime/log
                'level'     => ['error','info'],
                'max_files' => 30,
                'json'      => true,
            ],
        ],
    ];
    

    提示:确保运行用户对 runtime/log 具备写权限;JSON 格式便于后续接入 ELK/Graylog 等系统。

二 使用 logrotate 对 ThinkPHP 日志做系统级轮转

  • 建议将 ThinkPHP 日志纳入 logrotate 统一管理(可与 PHP-FPM、Nginx 等系统日志一并维护)。创建文件 /etc/logrotate.dphp
    /var/www/your-project/runtime/log/*.log {
        daily
        rotate 30
        compress
        missingok
        notifempty
        create 644 www-data www-data
        copytruncate
        dateext
        dateformat -%Y%m%d
    }
    
    关键点说明:
    • 使用 copytruncate 可在不重启/不重开文件句柄的情况下轮转,适合长期运行的应用。
    • 设置合适的 create 权限与属主(示例为 www-data,请按实际运行用户调整)。
    • 使用 dateext/dateformat 生成如 “.log-20251119” 的日期后缀,便于检索与清理。
    • 测试与生效:
      • 手动测试:logrotate -f /etc/logrotate.dphp
      • 查看状态/调试:logrotate -d /etc/logrotate.dphp
    • 说明:CentOS 的 logrotate 通常由 /etc/cron.daily/logrotate 每日自动执行,无需额外添加定时任务。

三 关联日志的轮转与监控

  • 同时管理 PHP-FPM、Nginx/Apache 等关联日志,避免单点磁盘被占满:
    • PHP-FPM(/etc/logrotate.d/php-fpm):
      /var/log/php-fpm/*.log {
          daily
          rotate 7
          compress
          missingok
          notifempty
          create 640 root adm
          sharedscripts
          postrotate
              if [ -f /run/php-fpm/php-fpm.pid ]; then
                  kill -USR2 `cat /run/php-fpm/php-fpm.pid`
              fi
          endscript
      }
      
    • Nginx(/etc/logrotate.d/nginx):
      /var/log/nginx/*.log {
          daily
          rotate 7
          compress
          missingok
          notifempty
          create 640 nginx adm
          postrotate
              if [ -f /run/nginx.pid ]; then
                  kill -HUP `cat /run/nginx.pid`
              fi
          endscript
      }
      
    • 日常查看与告警:
      • 实时查看:tail -f /var/log/php-fpm.log 或 tail -f runtime/log/2025-*.log
      • 基础分析:grep/awk 检索关键字(如 “error”)
      • 可配合 logwatch 做日报/周报分析。

四 集中化与多行堆栈处理

  • 集中化采集:将 ThinkPHP 日志(JSON 行式)PHP-FPM/Nginx 日志统一发送到 ELK/Graylog。以 Filebeat 为例,针对 TP 日志常见堆栈跨多行的特点,建议开启多行合并:
    filebeat.inputs:
    - type: log
      enabled: true
      paths:
        - /var/www/your-project/runtime/log/*.log
      multiline.pattern: '^-'
      multiline.negate: true
      multiline.match: after
      encoding: utf-8
    output.elasticsearch:
      hosts: ["your-es:9200"]
    
    说明:以行首 “-----”“Caused by:” 作为多行起始的合并策略,可显著提升堆栈可读性。

五 常见问题与快速处置

  • 磁盘被日志打满
    • 临时止血:确认无写入风险后,备份并清空大文件(如:> runtime/log/xxx.log),随后立即完善轮转策略。
    • 根治:启用 max_files、配置 logrotatecopytruncate/dateext、并纳入日常巡检。
  • 开发环境日志过多
    • 非必要时可临时关闭应用日志:如在 ThinkPHP 3.2 中将 LOG_RECORD => false,并将入口 APP_DEBUG => false;上线务必恢复,避免丢失错误线索。
  • 权限或路径错误导致不写日志
    • 检查 runtime/log 目录存在且对 Web/PHP-FPM 运行用户可写;必要时修正目录属主属组与权限。

0