提升 Ubuntu 上 PHP 日志可读性的实用方案
一 标准化日志格式与级别
- 在 php.ini 中统一基础行为:开启错误日志、关闭浏览器显示、设置合适的错误报告级别,并指定日志路径。示例:
- log_errors = On
- display_errors = Off
- error_reporting = E_ALL & ~E_NOTICE
- error_log = /var/log/php_errors.log
- 使用结构化日志(如 JSON)输出关键字段:timestamp、level、message、context、file、line、request_id,便于检索与聚合分析。
- 规范日志级别:DEBUG/INFO/WARNING/ERROR/CRITICAL,避免滥用 DEBUG,生产以 WARNING/ERROR 为主,必要时动态调高。
- 在日志消息中记录关键变量与请求标识(如用户 ID、订单号、trace_id),并编写日志字段说明文档,统一团队口径。
二 配置 PHP 与 PHP-FPM 输出
- 定位并编辑正确的 php.ini:执行 php --ini 查看加载路径,常见为 /etc/php/{version}/{sapi}/php.ini(如 apache2/cli/fpm)。修改后需重启对应服务。
- 若使用 PHP-FPM,可自定义访问日志格式(pool.d/www.conf):
- 取消注释并调整 access.format,例如:
- access.format = “%h %t "%m %r" %>s %b "%{Referer}i" "%{User-Agent}i"”
- 重启服务:sudo systemctl restart php{version}-fpm
- 变更 Web 服务(Apache/Nginx)后需重启以生效:
- Apache:sudo systemctl restart apache2
- Nginx:sudo systemctl restart nginx。
三 使用 Monolog 统一应用日志
- 安装与基础用法(通过 Composer):
- composer require monolog/monolog
- 单行可读格式(LineFormatter)示例:
- 设定格式模板(包含时间、级别、消息、文件、行号、上下文):
- “[%datetime%] %channel%.%level_name%: %message% %context% %extra%\n”
- 为处理器设置该格式化器,输出到文件或标准输出,便于本地与容器环境阅读。
- JSON 结构化格式(JsonFormatter)示例:
- 输出为 JSON 对象/数组,字段包含 timestamp、level、message、context、extra,便于 ELK/Grafana Loki 等系统解析与检索。
四 日志轮转与保留策略
- 使用 logrotate 管理日志体积与保留期,创建 /etc/logrotate.d/php:
- 示例配置(按天轮转、保留 7 天、压缩、空文件不轮转、创建指定权限文件):
- /var/log/php_errors.log { daily missingok rotate 7 compress notifempty create 640 root adm }
- 对应用日志(如 /var/log/my_app.log)同样配置轮转,避免单文件过大影响检索与阅读。
五 搜索、分析与可视化
- 将 JSON 日志接入 ELK Stack(Elasticsearch + Logstash + Kibana) 或 Grafana Loki,通过字段快速过滤与聚合分析。
- 在开发/调试环境为控制台日志添加颜色高亮,快速区分 ERROR/WARNING/INFO/DEBUG。
- 建立日志审查机制(如每周抽样、异常关键字告警),持续优化日志质量与字段覆盖。