PHP项目日志级别怎么设

wen PHP项目 3

本文目录导读:

PHP项目日志级别怎么设

  1. 使用错误处理函数(内建方式)
  2. 使用 Monolog(最流行的日志库)
  3. 使用框架的内置日志系统
  4. 环境变量配置方式
  5. 自定义简单日志类
  6. 最佳实践建议
  7. 日志级别对照表

在PHP项目中设置日志级别,通常有以下几种方式:

使用错误处理函数(内建方式)

// 设置错误报告级别
error_reporting(E_ALL); // 报告所有错误
// 或
error_reporting(E_ERROR | E_WARNING | E_PARSE); // 只报告严重错误
// 设置日志记录
ini_set('log_errors', 1);
ini_set('error_log', '/path/to/error.log');

使用 Monolog(最流行的日志库)

use Monolog\Logger;
use Monolog\Handler\StreamHandler;
use Monolog\Handler\RotatingFileHandler;
// 创建日志实例
$logger = new Logger('my_logger');
// 定义日志级别
$logger->pushHandler(new StreamHandler('path/to/app.log', Logger::INFO));
$logger->pushHandler(new StreamHandler('path/to/error.log', Logger::ERROR));
// 使用不同级别记录日志
$logger->debug('调试信息');
$logger->info('用户登录成功');
$logger->notice('需要注意的信息');
$logger->warning('警告信息');
$logger->error('错误信息');
$logger->critical('严重错误');
$logger->alert('必须立即处理的错误');
$logger->emergency('系统不可用');
// 动态设置级别
$logger->setLevel(Logger::WARNING); // 只记录WARNING及以上

使用框架的内置日志系统

Laravel

// config/logging.php
'channels' => [
    'stack' => [
        'driver' => 'stack',
        'channels' => ['single', 'slack'],
    ],
    'single' => [
        'driver' => 'single',
        'path' => storage_path('logs/laravel.log'),
        'level' => env('LOG_LEVEL', 'debug'), // 从环境变量读取
    ],
],
// 使用方式
use Illuminate\Support\Facades\Log;
Log::info('这是一条信息日志');
Log::warning('这是一个警告');
Log::error('这是一个错误');

ThinkPHP

// config/log.php
return [
    'default' => 'file',
    'channels' => [
        'file' => [
            'type' => 'file',
            'path' => './runtime/log/',
            'level' => ['error', 'warning'], // 设置日志级别
        ],
    ],
];
// 使用
\think\facade\Log::info('信息');
\think\facade\Log::error('错误');

环境变量配置方式

// .env 文件
APP_LOG_LEVEL=debug
APP_LOG_FILE=/var/log/php_app.log
// 在代码中读取
$logLevel = getenv('APP_LOG_LEVEL') ?: 'info';
$logFile = getenv('APP_LOG_FILE') ?: 'php://stderr';
// 根据环境设置日志级别
$levelMap = [
    'debug' => Logger::DEBUG,
    'info' => Logger::INFO,
    'warning' => Logger::WARNING,
    'error' => Logger::ERROR,
];
$logger->setLevel($levelMap[$logLevel] ?? Logger::INFO);

自定义简单日志类

class SimpleLogger {
    private $level;
    private $logFile;
    const LEVELS = [
        'debug' => 100,
        'info' => 200,
        'notice' => 250,
        'warning' => 300,
        'error' => 400,
        'critical' => 500,
    ];
    public function __construct($level = 'info', $logFile = 'app.log') {
        $this->level = self::LEVELS[$level] ?? self::LEVELS['info'];
        $this->logFile = $logFile;
    }
    public function log($message, $level = 'info') {
        $currLevel = self::LEVELS[$level] ?? self::LEVELS['info'];
        if ($currLevel >= $this->level) {
            $timestamp = date('Y-m-d H:i:s');
            $formattedMsg = "[$timestamp] [$level] $message\n";
            file_put_contents($this->logFile, $formattedMsg, FILE_APPEND);
        }
    }
    public function info($msg) { $this->log($msg, 'info'); }
    public function error($msg) { $this->log($msg, 'error'); }
    public function warning($msg) { $this->log($msg, 'warning'); }
    public function debug($msg) { $this->log($msg, 'debug'); }
}
// 使用
$logger = new SimpleLogger('debug', 'myapp.log');
$logger->info('用户操作记录');

最佳实践建议

// 根据环境设置不同的日志级别
if (APP_ENV === 'production') {
    // 生产环境只记录警告和错误
    $logLevel = Logger::WARNING;
} elseif (APP_ENV === 'staging') {
    // 预发布环境记录信息级别
    $logLevel = Logger::INFO;
} else {
    // 开发环境记录所有级别
    $logLevel = Logger::DEBUG;
}
// 根据请求类型或用户角色调整
if ($isAdmin) {
    $logLevel = Logger::DEBUG; // 管理员可以查看更多日志
}

日志级别对照表

级别 数值 适用场景
EMERGENCY 600 系统崩溃,无法使用
ALERT 550 必须立即处理
CRITICAL 500 严重错误,如数据库连接失败
ERROR 400 普通错误,需要记录
WARNING 300 警告,不影响运行
NOTICE 250 重要事件
INFO 200 常规信息
DEBUG 100 调试信息,开发时使用

选择哪种方式取决于项目规模、框架使用和实际需求,对于简单项目可使用内建函数,大型项目建议使用 Monolog 或框架自带的日志系统。

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