温馨提示×

ubuntu上thinkphp日志管理技巧有哪些

小樊
40
2025-11-15 00:29:24
栏目: 编程语言

Ubuntu上 ThinkPHP 日志管理实用技巧

一 基础配置与目录规范

  • 将日志统一写入项目目录的 runtime/logs,避免与系统日志混淆,便于备份与权限隔离。
  • 按环境区分日志级别:开发环境可开启更详细的 debug/sql,生产环境仅保留 info/notice/warning/error 等必要级别。
  • 为便于检索与分析,建议开启单行 JSON 格式记录(新版支持)。
  • 示例(适配 TP5/6 常见结构):
// config/log.php
return [
    'default' => env('log.channel', 'file'),
    'level'   => env('APP_DEBUG') ? 'debug' : 'info',
    'type'    => 'File',
    'path'    => runtime_path('logs'),
    'json'    => true,         // 单行 JSON,便于采集
    'max_files' => 30,         // 保留最近30个文件(自动清理)
];

说明:ThinkPHP 自 5.1.6 起支持按文件数量自动清理(max_files),自 5.1.15 起支持 JSON 格式日志。

二 分级存储与保留策略

  • 建议采用“分级通道”将常规、错误、紧急日志分离,分别设置不同的保留周期与分割策略,既便于排障又利于成本控制。
  • 参考配置(可按项目实际调整):
// config/log.php
return [
    'default' => 'stack',
    'channels' => [
        'stack' => [
            'type' => 'stack',
            'channels' => ['daily', 'error_file', 'emergency'],
        ],
        'daily' => [
            'type' => 'file',
            'path' => runtime_path('logs/daily'),
            'level' => ['info','notice','warning'],
            'max_files' => 30,         // 保留30天
            'file_size' => 10485760,    // 10MB 分割
            'json' => false,
        ],
        'error_file' => [
            'type' => 'file',
            'path' => runtime_path('logs/error'),
            'level' => ['error','critical'],
            'max_files' => 90,         // 保留90天
            'apart_level' => true,     // 每个级别单独文件
            'file_size' => 20971520,    // 20MB 分割
            'json' => true,            // JSON 便于分析
        ],
        'emergency' => [
            'type' => 'file',
            'path' => runtime_path('logs/emergency'),
            'level' => ['emergency'],
            'max_files' => 365,        // 保留1年
        ],
    ],
];

要点:常规日志按天/大小滚动并保留较短周期;错误日志保留更久;紧急日志长期留存。

三 系统级日志轮转与清理

  • 使用 logrotate 管理 ThinkPHP 日志目录,获得更稳健的按日轮转、压缩与保留策略,避免单文件过大与磁盘被占满。
  • 创建配置文件 /etc/logrotate.dphp
/path/to/project/runtime/logs/*.log {
    daily
    missingok
    rotate 30
    compress
    delaycompress
    notifempty
    create 640 www-data www-data
    sharedscripts
    postrotate
        # 如需要,可在此触发应用内刷新句柄(可选)
    endscript
}
  • 说明:上述策略为“每日轮转、保留 30 天、压缩旧日志、按 www-data 创建新文件”。可按目录层级与保留需求调整。
  • 如需清理超过 N 天的日志文件,也可使用 crontab + find 的兜底方案(示例保留 10 天):
# 每30分钟清理一次10天前的日志
*/30 * * * * find /path/to/project/runtime/logs -mtime +10 -name "*.log" -delete

提示:优先使用 logrotate;find 方案适合作为应急或特定目录的补充。

四 安全与合规要点

  • 避免在生产环境输出敏感信息(如 password、token、credit_card 等)。可在日志格式化或写入前对上下文进行过滤;若使用数据库日志,可在驱动层忽略敏感字段。
  • 示例(字段过滤思路):
$context = array_filter($context, function($key) {
    return !in_array($key, ['password','token','credit_card']);
}, ARRAY_FILTER_USE_KEY);
  • 建议错误日志采用 JSON 格式,便于与 ELK/Graylog 等日志平台对接与检索。
  • 生产环境关闭 APP_DEBUG,仅保留必要级别的日志,减少性能开销与信息泄露风险。

五 集中化与扩展采集

  • 引入 Monolog 或自定义驱动,将 error/emergency 级别日志同步到外部日志服务或消息通道,实现集中化存储与告警。
  • 示例(Monolog 写入文件并滚动):
use Monolog\Logger;
use Monolog\Handler\RotatingFileHandler;
use Monolog\Formatter\LineFormatter;

$logger = new Logger('app');
$handler = new RotatingFileHandler('/path/to/project/runtime/logs/app.log', 30, Logger::DEBUG);
$formatter = new LineFormatter("[%datetime%] [%channel%.%level_name%] %message% %context% %extra%\n", 'Y-m-d H:i:s', true, true);
$handler->setFormatter($formatter);
$logger->pushHandler($handler);
$logger->error('Something went wrong', ['uid'=>123]);
  • 如需大规模检索与可视化,可将日志接入 ELK Stack(Elasticsearch/Logstash/Kibana)Graylog

0