Skip to content

日志管理

youlai-think 采用 ThinkPHP 内置日志系统,支持多环境配置、日志滚动等特性。

日志框架

技术选型

组件说明
ThinkPHP LogThinkPHP 内置日志组件
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,
        ],
    ],
];

配置说明

配置项默认值说明
typefile日志类型
pathruntime/log/日志路径
levelall记录级别
file_size10MB单文件最大大小
max_files30最大保留文件数

日志使用

基本用法

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/日志目录

参考资料

基于 MIT 许可发布