PHP项目如何配置错误日志

wen PHP项目 24

本文目录导读:

PHP项目如何配置错误日志

  1. PHP配置文件 (php.ini) - 最基础方法
  2. 在代码中动态配置 - 适合单个项目
  3. 使用.htaccess(Apache)
  4. Nginx配合PHP-FPM
  5. 使用第三方错误处理库 - 推荐
  6. 框架特定配置
  7. 实战建议
  8. 安全注意事项
  9. 日志格式建议

在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 apache2sudo 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');
}

安全注意事项

  1. 不要将错误日志放在Web可访问目录(如 public/)
  2. 设置日志文件权限chmod 644chmod 640
  3. 定期轮转日志:使用 logrotate
  4. 敏感信息过滤:避免记录密码、token等
  5. 使用统一日志格式:便于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 等成熟库。

抱歉,评论功能暂时关闭!