本文目录导读:

在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 或框架自带的日志系统。