初始化本地仓库
This commit is contained in:
@@ -0,0 +1,400 @@
|
||||
---
|
||||
name: backend-logger
|
||||
description: Help integrate backend debug logger component (core/logger) into code. Provides logger usage patterns, configuration guidance, and best practices for different log levels.
|
||||
globs:
|
||||
- "app/**/*.php"
|
||||
- "plugin/**/*.php"
|
||||
- "backend/core/logger/**/*.php"
|
||||
---
|
||||
|
||||
# Madong Backend Logger Integration
|
||||
|
||||
快速集成后端调试日志组件到你的代码中。
|
||||
|
||||
## 组件介绍
|
||||
|
||||
`core/logger` 是一个基于 Monolog 的日志组件,提供静态方法调用接口,支持多种日志级别和自动文件分割。
|
||||
|
||||
### 核心特性
|
||||
|
||||
- ✅ 静态方法调用,使用简单
|
||||
- ✅ 支持 8 种日志级别
|
||||
- ✅ 按日期和级别自动分割日志文件
|
||||
- ✅ 支持日志清理和保留策略
|
||||
- ✅ 支持上下文数据
|
||||
- ✅ 基于 Monolog,功能强大
|
||||
|
||||
---
|
||||
|
||||
## 快速开始
|
||||
|
||||
### 1. 基本使用
|
||||
|
||||
```php
|
||||
use core\logger\Logger;
|
||||
|
||||
// 简单日志
|
||||
Logger::info('用户登录成功');
|
||||
Logger::error('数据库连接失败');
|
||||
|
||||
// 带上下文的日志
|
||||
Logger::info('用户登录', ['user_id' => 123, 'ip' => '192.168.1.1']);
|
||||
Logger::error('订单创建失败', ['order_id' => 456, 'error' => '库存不足']);
|
||||
```
|
||||
|
||||
### 2. 日志级别
|
||||
|
||||
| 方法 | 级别值 | 使用场景 |
|
||||
|------|--------|----------|
|
||||
| `Logger::debug()` | 100 | 调试信息,开发环境使用 |
|
||||
| `Logger::info()` | 200 | 一般信息,如用户操作 |
|
||||
| `Logger::notice()` | 250 | 重要事件,但非错误 |
|
||||
| `Logger::warning()` | 300 | 警告信息,潜在问题 |
|
||||
| `Logger::error()` | 400 | 运行错误,需要关注 |
|
||||
| `Logger::critical()` | 500 | 严重故障,需要立即处理 |
|
||||
| `Logger::alert()` | 550 | 需要立即采取行动 |
|
||||
| `Logger::emergency()` | 600 | 系统不可用,最高级别 |
|
||||
|
||||
---
|
||||
|
||||
## 配置说明
|
||||
|
||||
配置文件路径:`backend/core/logger/config/app.php`
|
||||
|
||||
```php
|
||||
return [
|
||||
'enable' => true,
|
||||
'base' => [
|
||||
'path' => runtime_path('logs'), // 日志存储路径
|
||||
'channel' => 'core', // 日志通道名称
|
||||
'retention_days' => 7, // 保留天数
|
||||
'daily_rotation' => true, // 每日文件分割
|
||||
],
|
||||
'format' => [
|
||||
'date' => 'Y-m-d H:i:s.u',
|
||||
'output' => "[%datetime%] %channel%.%level_name%: %message% %context%\n",
|
||||
],
|
||||
'levels' => [
|
||||
'debug' => config('app.debug', false), // 跟随应用调试模式
|
||||
'min_level' => 'debug', // 最小记录级别
|
||||
],
|
||||
'handlers' => [
|
||||
'stream' => true, // 启用文件处理器
|
||||
'syslog' => false, // 禁用 syslog
|
||||
],
|
||||
];
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 使用场景
|
||||
|
||||
### 场景 1: 控制器中记录请求日志
|
||||
|
||||
```php
|
||||
namespace app\adminapi\controller\user;
|
||||
|
||||
use core\base\Controller;
|
||||
use core\logger\Logger;
|
||||
use support\Request;
|
||||
|
||||
class UserController extends Controller
|
||||
{
|
||||
public function index(Request $request)
|
||||
{
|
||||
Logger::info('访问用户列表', [
|
||||
'user_id' => $request->user->id ?? 0,
|
||||
'page' => $request->get('page', 1),
|
||||
'ip' => $request->getRealIp(),
|
||||
]);
|
||||
|
||||
// 业务逻辑...
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 场景 2: 服务层记录业务日志
|
||||
|
||||
```php
|
||||
namespace app\service\admin\order;
|
||||
|
||||
use core\base\BaseService;
|
||||
use core\logger\Logger;
|
||||
use app\dao\order\OrderDao;
|
||||
|
||||
class OrderService extends BaseService
|
||||
{
|
||||
public function createOrder(array $data)
|
||||
{
|
||||
Logger::info('开始创建订单', ['data' => $data]);
|
||||
|
||||
try {
|
||||
$order = $this->dao->save($data);
|
||||
Logger::info('订单创建成功', ['order_id' => $order->id]);
|
||||
return $order;
|
||||
} catch (\Throwable $e) {
|
||||
Logger::error('订单创建失败', [
|
||||
'data' => $data,
|
||||
'error' => $e->getMessage(),
|
||||
'trace' => $e->getTraceAsString(),
|
||||
]);
|
||||
throw $e;
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 场景 3: 异常处理
|
||||
|
||||
```php
|
||||
namespace app\service\admin\payment;
|
||||
|
||||
use core\base\BaseService;
|
||||
use core\logger\Logger;
|
||||
|
||||
class PaymentService extends BaseService
|
||||
{
|
||||
public function processPayment(int $orderId, float $amount)
|
||||
{
|
||||
try {
|
||||
// 支付处理逻辑...
|
||||
Logger::info('支付处理成功', [
|
||||
'order_id' => $orderId,
|
||||
'amount' => $amount,
|
||||
]);
|
||||
} catch (\Throwable $e) {
|
||||
Logger::critical('支付处理失败', [
|
||||
'order_id' => $orderId,
|
||||
'amount' => $amount,
|
||||
'error' => $e->getMessage(),
|
||||
'file' => $e->getFile(),
|
||||
'line' => $e->getLine(),
|
||||
]);
|
||||
throw $e;
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 场景 4: 调试信息
|
||||
|
||||
```php
|
||||
namespace app\service\admin\sync;
|
||||
|
||||
use core\base\BaseService;
|
||||
use core\logger\Logger;
|
||||
|
||||
class SyncService extends BaseService
|
||||
{
|
||||
public function syncData(array $items)
|
||||
{
|
||||
Logger::debug('开始同步数据', ['count' => count($items)]);
|
||||
|
||||
foreach ($items as $index => $item) {
|
||||
Logger::debug('处理数据项', [
|
||||
'index' => $index,
|
||||
'item' => $item,
|
||||
]);
|
||||
// 处理逻辑...
|
||||
}
|
||||
|
||||
Logger::debug('数据同步完成');
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 场景 5: 性能监控
|
||||
|
||||
```php
|
||||
namespace app\service\admin\report;
|
||||
|
||||
use core\base\BaseService;
|
||||
use core\logger\Logger;
|
||||
|
||||
class ReportService extends BaseService
|
||||
{
|
||||
public function generateReport(string $type)
|
||||
{
|
||||
$startTime = microtime(true);
|
||||
Logger::info('开始生成报表', ['type' => $type]);
|
||||
|
||||
// 报表生成逻辑...
|
||||
$report = $this->buildReport($type);
|
||||
|
||||
$duration = round((microtime(true) - $startTime) * 1000, 2);
|
||||
Logger::info('报表生成完成', [
|
||||
'type' => $type,
|
||||
'duration' => $duration . 'ms',
|
||||
'size' => strlen($report),
|
||||
]);
|
||||
|
||||
return $report;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 日志文件结构
|
||||
|
||||
日志文件按日期和级别自动分割:
|
||||
|
||||
```
|
||||
runtime/logs/
|
||||
└── core/ # 通道名称
|
||||
└── 2024-01/ # 年月目录
|
||||
├── 01-DEBUG.log # 每日调试日志
|
||||
├── 01-INFO.log # 每日信息日志
|
||||
├── 01-WARNING.log # 每日警告日志
|
||||
├── 01-ERROR.log # 每日错误日志
|
||||
└── ...
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 日志清理
|
||||
|
||||
### 手动清理
|
||||
|
||||
```php
|
||||
use core\logger\Logger;
|
||||
|
||||
// 清理过期日志(根据配置的 retention_days)
|
||||
Logger::cleanup();
|
||||
|
||||
// 强制清理所有日志
|
||||
Logger::cleanup(true);
|
||||
|
||||
// 清理指定通道的日志
|
||||
Logger::cleanup(false, 'payment');
|
||||
```
|
||||
|
||||
### 自动清理
|
||||
|
||||
建议在定时任务中配置自动清理:
|
||||
|
||||
```php
|
||||
// config/crontab.php
|
||||
return [
|
||||
'0 2 * * *' => function () {
|
||||
\core\logger\Logger::cleanup();
|
||||
},
|
||||
];
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 最佳实践
|
||||
|
||||
### 1. 选择合适的日志级别
|
||||
|
||||
```php
|
||||
// ✅ 好的做法
|
||||
Logger::debug('变量值', ['var' => $value]); // 调试信息
|
||||
Logger::info('用户操作', ['action' => 'login']); // 一般信息
|
||||
Logger::warning('库存不足', ['product_id' => 123]); // 警告
|
||||
Logger::error('支付失败', ['order_id' => 456]); // 错误
|
||||
Logger::critical('数据库连接失败'); // 严重错误
|
||||
|
||||
// ❌ 不好的做法
|
||||
Logger::emergency('用户登录'); // 级别过高
|
||||
Logger::debug('支付失败'); // 级别过低
|
||||
```
|
||||
|
||||
### 2. 提供有意义的上下文
|
||||
|
||||
```php
|
||||
// ✅ 好的做法
|
||||
Logger::info('订单创建成功', [
|
||||
'order_id' => $order->id,
|
||||
'user_id' => $order->user_id,
|
||||
'amount' => $order->amount,
|
||||
'payment_type' => $order->payment_type,
|
||||
]);
|
||||
|
||||
// ❌ 不好的做法
|
||||
Logger::info('订单创建成功');
|
||||
Logger::info('订单创建成功', ['data' => $order]); // 数据过多
|
||||
```
|
||||
|
||||
### 3. 避免敏感信息
|
||||
|
||||
```php
|
||||
// ✅ 好的做法
|
||||
Logger::info('用户登录', [
|
||||
'user_id' => $user->id,
|
||||
'ip' => $request->getRealIp(),
|
||||
]);
|
||||
|
||||
// ❌ 不好的做法
|
||||
Logger::info('用户登录', [
|
||||
'password' => $request->post('password'), // 敏感信息
|
||||
'token' => $user->api_token, // 敏感信息
|
||||
]);
|
||||
```
|
||||
|
||||
### 4. 异常日志包含堆栈
|
||||
|
||||
```php
|
||||
try {
|
||||
// 业务逻辑...
|
||||
} catch (\Throwable $e) {
|
||||
Logger::error('操作失败', [
|
||||
'error' => $e->getMessage(),
|
||||
'file' => $e->getFile(),
|
||||
'line' => $e->getLine(),
|
||||
'trace' => $e->getTraceAsString(),
|
||||
]);
|
||||
throw $e;
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 集成步骤
|
||||
|
||||
### Step 1: 检查配置
|
||||
|
||||
确认 `backend/core/logger/config/app.php` 配置正确。
|
||||
|
||||
### Step 2: 引入 Logger
|
||||
|
||||
在需要记录日志的文件中引入:
|
||||
|
||||
```php
|
||||
use core\logger\Logger;
|
||||
```
|
||||
|
||||
### Step 3: 添加日志调用
|
||||
|
||||
根据业务场景选择合适的日志级别和位置。
|
||||
|
||||
### Step 4: 验证日志
|
||||
|
||||
检查 `runtime/logs/{channel}/{Y-m}/` 目录下的日志文件。
|
||||
|
||||
---
|
||||
|
||||
## Quick Commands
|
||||
|
||||
| Command | Description |
|
||||
|---------|------------|
|
||||
| `add logger to UserController` | 在 UserController 中添加日志 |
|
||||
| `add logger to OrderService` | 在 OrderService 中添加日志 |
|
||||
| `add debug logger to sync method` | 在同步方法中添加调试日志 |
|
||||
| `add error logger to try-catch` | 在异常处理中添加错误日志 |
|
||||
| `show logger usage examples` | 显示日志使用示例 |
|
||||
| `configure logger for production` | 配置生产环境日志 |
|
||||
|
||||
---
|
||||
|
||||
## Boundaries
|
||||
|
||||
- ✅ **Always**: 使用静态方法调用 `Logger::xxx()`
|
||||
- ✅ **Always**: 提供有意义的上下文数据
|
||||
- ✅ **Always**: 选择合适的日志级别
|
||||
- ✅ **Always**: 异常日志包含堆栈信息
|
||||
- ⚠️ **Ask first**: 敏感信息是否需要脱敏
|
||||
- 🚫 **Never**: 记录密码、token 等敏感信息
|
||||
- 🚫 **Never**: 在循环中大量记录 debug 日志
|
||||
- 🚫 **Never**: 使用过高的日志级别记录普通信息
|
||||
Reference in New Issue
Block a user