# PHP错误日志记录:error_log() 与 Monolog 集成
在PHP开发中,有效的错误日志记录对于调试和监控应用程序至关重要。本文将深入探讨PHP内置的error_log()函数以及更高级的Monolog日志库的使用方法。
## 一、PHP内置的error_log()基础用法
error_log()是PHP提供的内置函数,用于将错误信息发送到系统日志、文件或指定邮箱。
### 1.1 基本语法
```php
error_log(string $message, int $message_type = 0, string $destination = null, string $extra_headers = null): bool
```
### 1.2 常见使用方式
**写入系统日志:**
```php
error_log("数据库连接失败", 0); // 使用默认的系统日志
```
**写入指定文件:**
```php
error_log("用户登录失败\n", 3, "/var/log/php_errors.log");
```
**发送邮件通知:**
```php
error_log("系统出现严重错误", 1, "admin@example.com", "From: webmaster@example.com");
```
## 二、Monolog高级日志库
Monolog是PHP生态中最流行的日志库之一,提供了丰富的处理器(Handlers)、格式化器(Formatters)和处理器(Processors)。
### 2.1 安装Monolog
```bash
composer require monolog/monolog
```
### 2.2 基本使用示例
```php
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
// 创建日志实例
$log = new Logger('name');
$log->pushHandler(new StreamHandler('path/to/your.log', Logger::WARNING));
// 记录日志
$log->warning('这是一个警告');
$log->error('这是一个错误');
```
### 2.3 日志级别
Monolog支持RFC 5424定义的8个日志级别:
- DEBUG (100)
- INFO (200)
- NOTICE (250)
- WARNING (300)
- ERROR (400)
- CRITICAL (500)
- ALERT (550)
- EMERGENCY (600)
### 2.4 常用处理器
**文件处理器:**
```php
$log->pushHandler(new StreamHandler('app.log', Logger::DEBUG));
```
**RotatingFileHandler(按日期分割):**
```php
$handler = new RotatingFileHandler('app.log', 0, Logger::DEBUG);
$log->pushHandler($handler);
```
**Slack通知:**
```php
$slack = new SlackWebhookHandler('webhook_url', '#errors', 'Bot Name');
$log->pushHandler($slack);
```
### 2.5 日志格式化
```php
use Monolog\Formatter\LineFormatter;
// 设置自定义格式
$formatter = new LineFormatter(
"[%datetime%] %channel%.%level_name%: %message% %context% %extra%\n",
"Y-m-d H:i:s"
);
$handler = new StreamHandler('app.log', Logger::DEBUG);
$handler->setFormatter($formatter);
$log->pushHandler($handler);
```
## 三、Monolog高级特性
### 3.1 上下文信息
```php
$log->error('用户登录失败', ['username' => 'testuser', 'ip' => '192.168.1.1']);
```
### 3.2 处理器(Processors)
```php
// 添加进程ID
$log->pushProcessor(function ($record) {
$record['extra']['pid'] = getmypid();
return $record;
});
```
### 3.3 多通道日志
```php
$dbLogger = new Logger('database');
$dbLogger->pushHandler(new StreamHandler('logs/db.log'));
$apiLogger = new Logger('api');
$apiLogger->pushHandler(new StreamHandler('logs/api.log'));
```
## 四、Monolog与error_log()集成
我们可以将Monolog和error_log()结合起来使用,实现更灵活的日志记录策略。
```php
use Monolog\Handler\ErrorLogHandler;
$log = new Logger('system');
$log->pushHandler(new ErrorLogHandler(ErrorLogHandler::OPERATING_SYSTEM, Logger::ERROR));
// 这将通过error_log()记录到系统日志
$log->error('系统发生错误');
```
## 五、最佳实践建议
1. **开发环境**:使用DEBUG级别,将日志输出到文件和控制台
2. **生产环境**:使用ERROR级别以上,结合文件日志和通知机制
3. **敏感信息**:避免在日志中记录密码、密钥等敏感数据
4. **日志轮转**:设置合理的日志轮转策略,防止日志文件过大
5. **监控**:对关键错误设置报警机制
## 六、性能考虑
1. 在高流量应用中,避免同步写入日志
2. 考虑使用RedisHandler或AmqpHandler异步处理日志
3. 对于非关键日志,可以批量处理
## 结语
无论是简单的error_log()还是功能强大的Monolog,良好的日志记录策略都能显著提升应用的可维护性。根据项目需求选择合适的工具和配置,将为你的开发和运维工作带来极大便利。
希望本文能帮助你更好地理解和使用PHP中的日志记录工具。如果你有任何问题或建议,欢迎在评论区留言讨论。