本文目录导读:

- PHP配置文件 (php.ini) - 最基础方法
- 在代码中动态配置 - 适合单个项目
- 使用.htaccess(Apache)
- Nginx配合PHP-FPM
- 使用第三方错误处理库 - 推荐
- 框架特定配置
- 实战建议
- 安全注意事项
- 日志格式建议
在PHP项目中配置错误日志是开发和运维中的重要环节,以下是几种常见的配置方法,按推荐程度和场景排序:
PHP配置文件 (php.ini) - 最基础方法
编辑 php.ini 文件(可通过 php --ini 查看位置):
; 开启错误显示(生产环境建议关闭) display_errors = Off display_startup_errors = Off ; 开启错误日志记录 log_errors = On ; 错误级别(生产环境建议 E_ALL & ~E_DEPRECATED & ~E_STRICT) error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT ; 错误日志文件路径(确保目录可写) error_log = /var/log/php_errors.log ; 可选:限制错误报告(生产环境推荐) ; error_reporting = E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
重启Web服务器生效:sudo systemctl restart apache2 或 sudo systemctl restart php-fpm
在代码中动态配置 - 适合单个项目
// 项目入口文件(如 index.php)
error_reporting(E_ALL);
ini_set('log_errors', 1);
ini_set('error_log', __DIR__ . '/logs/php_error.log');
ini_set('display_errors', 0); // 生产环境关闭显示
使用.htaccess(Apache)
# 在项目根目录的.htaccess php_value error_log /var/www/project/logs/php_errors.log php_value error_reporting 32767 # 对应 E_ALL php_flag log_errors On php_flag display_errors Off
Nginx配合PHP-FPM
在nginx配置中:
server {
# 错误日志单独配置
error_log /var/log/nginx/project_error.log;
location ~ \.php$ {
# 开启PHP错误日志
fastcgi_param PHP_VALUE "error_log=/var/log/php_custom.log";
fastcgi_param PHP_VALUE "log_errors=1";
}
}
使用第三方错误处理库 - 推荐
Monolog (最流行)
composer require monolog/monolog
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
use Monolog\Handler\RotatingFileHandler;
$log = new Logger('app');
// 按天轮转日志,保留30天
$log->pushHandler(new RotatingFileHandler(__DIR__.'/logs/app.log', 30, Logger::ERROR));
// 同时输出到控制台
$log->pushHandler(new StreamHandler('php://stdout', Logger::DEBUG));
Whoops (PHP错误处理)
composer require filp/whoops
// 开发环境
$whoops = new \Whoops\Run;
$whoops->pushHandler(new \Whoops\Handler\PrettyPageHandler);
$whoops->register();
// 生产环境
$whoops->pushHandler(function($exception) {
error_log($exception->getMessage());
echo "Internal Server Error";
});
框架特定配置
Laravel
# .env 文件 APP_DEBUG=true # 开发环境 APP_LOG_LEVEL=debug # 日志级别
Symfony
# config/packages/monolog.yaml
monolog:
handlers:
main:
type: stream
path: "%kernel.logs_dir%/%kernel.environment%.log"
level: warning
errors:
type: stream
path: "%kernel.logs_dir%/errors.log"
level: error
实战建议
生产环境完整配置示例:
// config.php
define('ENV', 'production'); // production/development
$logPath = __DIR__ . '/logs/' . date('Y-m') . '/';
if (!is_dir($logPath)) {
mkdir($logPath, 0755, true);
}
if (ENV === 'production') {
// 生产:只记录错误,不显示
error_reporting(E_ALL & ~E_DEPRECATED & ~E_STRICT);
ini_set('display_errors', 0);
ini_set('log_errors', 1);
ini_set('error_log', $logPath . 'error.log');
set_error_handler(function($severity, $message, $file, $line) {
throw new ErrorException($message, 0, $severity, $file, $line);
});
set_exception_handler(function($e) {
error_log(sprintf(
"[%s] %s in %s:%d\nStack trace:\n%s",
date('Y-m-d H:i:s'),
$e->getMessage(),
$e->getFile(),
$e->getLine(),
$e->getTraceAsString()
));
// 返回友好的错误页面
http_response_code(500);
echo "Something went wrong. Please try again later.";
});
} else {
// 开发:显示所有错误
error_reporting(E_ALL);
ini_set('display_errors', 1);
ini_set('log_errors', 1);
ini_set('error_log', $logPath . 'dev.log');
}
安全注意事项
- 不要将错误日志放在Web可访问目录(如 public/)
- 设置日志文件权限:
chmod 644或chmod 640 - 定期轮转日志:使用 logrotate
- 敏感信息过滤:避免记录密码、token等
- 使用统一日志格式:便于ELK等日志系统分析
日志格式建议
推荐使用结构化日志格式:
[2024-01-15 10:30:45] app.ERROR: Error message {"user_id":123,"ip":"192.168.1.1"} []
[2024-01-15 10:30:46] app.WARNING: Something suspicious {"user_id":456} []
选择哪种方式取决于你的项目复杂度,简单项目用 ini_set 即可,大型项目推荐使用 Monolog 等成熟库。