日志管理
youlai-think 采用 ThinkPHP 内置日志系统,支持多环境配置、日志滚动等特性。
日志框架
技术选型
| 组件 | 说明 |
|---|---|
| ThinkPHP Log | ThinkPHP 内置日志组件 |
| Monolog | 底层日志库(ThinkPHP 使用) |
日志级别
日志级别从低到高:
debug < info < notice < warning < error < critical < alert < emergency| 级别 | 说明 | 适用场景 |
|---|---|---|
| debug | 调试信息 | 开发调试 |
| info | 普通信息 | 关键业务节点 |
| notice | 提示信息 | 一般性提示 |
| warning | 警告信息 | 潜在问题 |
| error | 错误信息 | 异常情况 |
| critical | 严重错误 | 需要立即处理 |
日志配置
配置文件
php
// config/log.php
return [
'default' => 'file',
'channels' => [
'file' => [
'type' => 'file',
'path' => runtime_path() . 'log/',
'level' => ['error', 'warning', 'info', 'debug'],
'file_size' => 10 * 1024 * 1024, // 10MB
'max_files' => 30,
],
],
];配置说明
| 配置项 | 默认值 | 说明 |
|---|---|---|
type | file | 日志类型 |
path | runtime/log/ | 日志路径 |
level | all | 记录级别 |
file_size | 10MB | 单文件最大大小 |
max_files | 30 | 最大保留文件数 |
日志使用
基本用法
php
use think\facade\Log;
// 记录不同级别日志
Log::debug('调试信息', ['userId' => 1]);
Log::info('用户登录', ['username' => 'admin']);
Log::warning('缓存失效', ['key' => 'user:1']);
Log::error('订单创建失败', ['orderId' => 12345]);
// 上下文日志
Log::info('用户操作', [
'userId' => 1,
'action' => 'login',
'ip' => request()->ip(),
]);异常日志
php
try {
// 业务逻辑
$order = $this->orderService->create($data);
} catch (\Exception $e) {
Log::error('订单创建异常', [
'data' => $data,
'message' => $e->getMessage(),
'trace' => $e->getTraceAsString(),
]);
throw $e;
}日志文件
文件结构
runtime/log/
├── 202401/
│ ├── 15.log # 当天日志
│ ├── 14.log # 昨天日志
│ └── ...
└── error/
└── 20240115.log # 错误日志日志格式
[2024-01-15 10:30:45] INFO: 用户登录成功 {"userId":1,"username":"admin"}
[2024-01-15 10:31:22] ERROR: 订单创建失败 {"orderId":12345,"error":"库存不足"}日志查看
命令行查看
bash
# 查看当天日志
tail -f runtime/log/202401/15.log
# 搜索错误
grep "ERROR" runtime/log/202401/15.log
# 实时监控
tail -f runtime/log/202401/15.log | grep "ERROR"Docker 日志
bash
# 查看容器日志
docker logs -f youlai-think
# 查看最近 100 行
docker logs --tail 100 youlai-think日志最佳实践
敏感信息脱敏
php
// ❌ 不推荐:记录敏感信息
Log::info('用户登录', ['password' => $password]);
// ✅ 推荐:脱敏处理
Log::info('用户登录', [
'phone' => $this->maskPhone($phone),
'ip' => request()->ip(),
]);
private function maskPhone(string $phone): string
{
return substr($phone, 0, 3) . '****' . substr($phone, -4);
}条件日志
php
// 生产环境只记录 info 及以上
if (config('app.debug')) {
Log::debug('详细调试信息', $params);
}相关文件
| 文件 | 说明 |
|---|---|
config/log.php | 日志配置 |
runtime/log/ | 日志目录 |
