日志配置详解

日志系统的所有配置集中在 config/log.php 文件中,本页详细说明每个配置项的作用和使用方式。

完整配置示例

php
<?php
// config/log.php

declare (strict_types=1);

use Viswoole\Log\Drives\File;

return [
    // ========== 基础设置 ==========

    // 默认使用的日志通道名称
    'default' => 'file',

    // ========== 级别路由 ==========

    // 将特定日志级别路由到指定通道
    // 键名为级别名,值为通道名(字符串或数组)
    'type_channel' => [
        // 'error' => 'error_channel',
        // 'sql' => 'sql_channel',
    ],

    // ========== 跟踪设置 ==========

    // 是否记录日志调用来源(文件路径:行号)
    // 开启后会在 context 中注入 _trace_source 字段
    'trace_source' => true,

    // ========== 控制台输出 ==========

    // 是否同时将日志输出到控制台
    // 开发环境建议开启,生产环境建议关闭
    'console' => false,

    // ========== 通道定义 ==========

    // 日志通道列表,键名为通道名称
    'channels' => [
        'file' => File::class,
    ],
];

配置项详细说明

default

  • 类型: string
  • 默认值: 'file'
  • 说明: 指定默认使用的日志通道名称,必须与 channels 中的某个键名匹配
php
'default' => env('LOG_CHANNEL', 'file'),

type_channel

  • 类型: array<string, string|string[]>
  • 默认值: []
  • 说明: 按日志级别将日志路由到指定的通道

配置规则:

php
'type_channel' => [
    // 单通道路由
    'error' => 'error_file',

    // 多通道路由(同一条日志写入多个通道)
    'critical' => ['error_file', 'alert_service'],

    // 支持的路由级别:
    // emergency, alert, critical, error, warning, notice, info, debug, sql, task
]

路由优先级: 当某级别在 type_channel 中配置了通道时,优先使用该通道;否则回退到 default 通道。

trace_source

  • 类型: bool
  • 默认值: false
  • 说明: 是否在日志中记录调用来源(源码默认 false,框架自带 config/log.php 中显式设为 true

开启效果 (true):

json
{
  "timestamp": "2024-01-01T12:00:00+08:00",
  "level": "info",
  "message": "用户登录",
  "context": {},
  "source": "/app/Controller/AuthController.php:45"
}

关闭效果 (false):

json
{
  "timestamp": "2024-01-01T12:00:00+08:00",
  "level": "info",
  "message": "用户登录",
  "context": {},
  "source": "not record"
}

性能提示: 开启 trace_source 会使用 debug_backtrace() 回溯调用栈,高频场景下可能产生少量性能开销。

console

  • 类型: bool
  • 默认值: true
  • 说明: 是否将日志同步输出到控制台终端(源码默认 true,框架自带 config/log.php 中显式设为 false

适用场景:

  • 开发环境调试:设为 true,实时查看日志
  • 生产环境:设为 false,避免污染标准输出

控制台输出效果:

text
[2024-01-01T12:00:00+08:00][info]: 用户登录 {} in AuthController.php:45    ← 绿色(info级别)
[2024-01-01T12:00:01+08:00][error]: 数据库连接失败 {...} in Database.php:22  ← 红色(error级别)

channels

  • 类型: array<string, DriveInterface|string|array>
  • 说明: 定义所有可用的日志通道

支持的配置格式:

格式一:字符串(驱动类名)

php
'channels' => [
    'file' => \Viswoole\Log\Drives\File::class,
]

框架会自动实例化该类(无参构造)。

格式二:数组(带选项)

php
'channels' => [
    'file' => [
        'driver' => \Viswoole\Log\Drives\File::class,
        'options' => [
            'storageDays' => 7,
            'maxFiles' => 30,
            'fileSize' => 10485760,
            'dateFormat' => 'c',
            'logFormat' => '[%timestamp][%level]: %message %context in %source',
            'json' => true,
            'json_flags' => JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES,
            'log_dir' => BASE_PATH . '/runtime/logs',
        ]
    ],
]

格式三:驱动实例

php
'channels' => [
    'custom' => new \App\Log\CustomLogDriver($config),
]

File 驱动专属配置

当通道使用 Viswoole\Log\Drives\File 驱动时,options 支持以下参数:

参数类型默认值说明
storageDaysint7日志保留天数,超期的日期目录会被自动删除
maxFilesint30单个日志级别下最大文件数量,超出后删除最早的文件
fileSizeint10485760 (10MB)单个日志文件最大字节数,超出后自动切割新文件
dateFormatstring'c'时间戳格式,PHP date() 格式字符;传 'timestamp' 则保留原始时间戳
logFormatstring见下方日志文本格式规则
jsonbooltrue是否以 JSON 格式存储日志
json_flagsintJSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHESJSON 编码标志位
log_dirstringBASE_PATH.'/runtime/logs'日志文件根目录

logFormat 占位符

json 设为 false 时,logFormat 支持以下占位符:

占位符说明示例值
%timestamp时间戳2024-01-01T12:00:00+08:00
%level日志级别info
%message日志消息用户登录
%context上下文数据(JSON 编码){"user_id":100}
%source调用来源AuthController.php:45

格式示例:

php
// 默认格式
'logFormat' => '[%timestamp][%level]: %message %context in %source'

// 输出: [2024-01-01T12:00:00+08:00][info]: 用户登录 {"user_id":100} in AuthController.php:45

// 简洁格式
'logFormat' => '%level | %message'

// 输出: info | 用户登录

// 自定义分隔符
'logFormat' => '%timestamp | [%level] %message'

环境变量集成

推荐使用环境变量管理敏感配置:

php
// config/log.php
return [
    'default' => env('LOG_CHANNEL', 'file'),
    'trace_source' => env('LOG_TRACE_SOURCE', true),
    'console' => env('APP_DEBUG', false),  // 开发环境自动开启
    'type_channel' => [],
    'channels' => [
        'file' => [
            'driver' => File::class,
            'options' => [
                'storageDays' => (int)env('LOG_STORAGE_DAYS', 7),
                'log_dir' => env('LOG_DIR', BASE_PATH . '/runtime/logs'),
            ]
        ],
    ],
];

对应的 .env 文件:

ini
# 日志配置
LOG_CHANNEL=file
LOG_TRACE_SOURCE=true
LOG_STORAGE_DAYS=7
LOG_DIR=/var/log/app

配置最佳实践

开发环境

php
// config/log.php (开发环境)
return [
    'default' => 'file',
    'type_channel' => [],
    'trace_source' => true,
    'console' => true,           // 控制台实时查看
    'channels' => [
        'file' => [
            'driver' => File::class,
            'options' => [
                'storageDays' => 3,       // 短保留期
                'fileSize' => 5242880,    // 5MB 便于查看
                'json' => true,
            ]
        ],
    ],
];

生产环境

php
// config/log.php (生产环境)
return [
    'default' => 'file',
    'type_channel' => [
        'error' => 'error',             // 错误日志单独存储
        'critical' => 'error',
    ],
    'trace_source' => true,
    'console' => false,                 // 关闭控制台输出
    'channels' => [
        'file' => [
            'driver' => File::class,
            'options' => [
                'storageDays' => 30,     // 长保留期
                'maxFiles' => 100,       // 允许更多文件
                'fileSize' => 52428800,  // 50MB 减少文件数
                'json' => true,          // 结构化便于分析
            ]
        ],
        'error' => [
            'driver' => File::class,
            'options' => [
                'storageDays' => 90,     // 错误日志保留更久
                'log_dir' => BASE_PATH . '/runtime/logs/error',
            ]
        ],
    ],
];