PHP日志级别由error_reporting、log_errors、error_log三个参数共同控制:前者决定记录哪些错误类型,后两者分别控制是否写入文件及写入路径;推荐通过php.ini全局配置,并按环境区分设置。

配置PHP日志级别,核心是控制哪些错误类型被记录,而不是“开启/关闭日志”本身。关键参数只有三个:`error_reporting`(决定记录什么)、`log_errors`(决定是否写入文件)、`error_log`(决定写到哪)。其他如`display_errors`属于安全辅助项,不参与日志级别定义。
修改 php.ini 是最常用且推荐的方式
这是全局生效、稳定可靠的方法,适用于所有请求(Web 和 CLI):
- 找到你的 php.ini 文件(运行
php --ini或查看phpinfo()中的 “Loaded Configuration File”) - 确认以下三行已取消注释(即前面没有分号
;),并按需调整值:
log_errors = On
error_log = /var/log/php_error.log
说明:
-
E_ALL & ~E_NOTICE表示记录所有错误,但排除通知类信息(如未定义变量访问),适合测试环境;开发可设为E_ALL,生产建议用E_ERROR | E_WARNING -
log_errors = On必须启用,否则无论error_reporting设多高,都不会写日志 -
error_log路径要确保存在,且 Web 服务器用户(如www-data、apache或nginx)有写权限
用 ini_set() 在脚本中临时设置
适用于无法修改 php.ini 的共享主机,或需要按需切换日志行为的场景(注意:部分设置可能受 php_admin_flag 限制):
立即学习“PHP免费学习笔记(深入)”;
ini_set('log_errors', '1');
ini_set('error_log', '/home/user/logs/php_errors.log');
注意:
- 必须在出错前调用,通常放在脚本最开头
-
error_log路径需 PHP 进程可写,且不能是相对路径(除非明确知道当前工作目录) - 该设置只对当前请求有效,不影响其他脚本或 CLI 执行
区分环境设置不同级别
不要一套配置打天下。根据部署环境动态调整更合理:
-
开发环境:显示全部问题 →
error_reporting = E_ALL -
测试/预发环境:忽略低风险提示 →
error_reporting = E_ALL & ~E_NOTICE & ~E_DEPRECATED -
生产环境:只记录真正影响服务的问题 →
error_reporting = E_ERROR | E_WARNING | E_PARSE,同时务必display_errors = Off
你可以通过判断 $_SERVER['DOCUMENT_ROOT']、环境变量或配置文件来自动加载对应规则,避免手动切换。
验证配置是否生效
改完别急着上线,快速验证两步:
- 执行
php -i | grep error_reporting(CLI)或新建info.php输出phpinfo(),确认值已更新 - 写一个测试脚本触发错误:
<?php trigger_error("Test warning", E_USER_WARNING); ?>
然后检查你指定的error_log文件是否新增了这一行



















