本文目录导读:

- 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 等成熟库。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播