一、日志配置管理
ThinkPHP的日志配置主要通过config/log.php文件实现,核心参数包括:
default指定全局使用的日志通道(如file);channels定义具体通道配置,每个通道支持以下关键参数:
type:日志驱动(默认file,可选database、email、自定义类等);path:日志存储路径(默认runtime/log,可自定义日期格式如runtime/log/YYYY-mm-dd.log);level:记录级别(从低到高为debug→info→notice→warning→error→critical→alert→emergency,可过滤低级别日志);max_files:最大日志文件数(0表示不限,避免磁盘占满);json:是否以JSON格式记录(便于ELK等工具收集);apart_level:单独记录的日志级别(如error级别单独存文件,便于快速定位问题)。'channels' => [
'prod_error' => [
'type' => 'file',
'path' => runtime_path('log/prod'),
'level' => ['error', 'critical'],
'max_files' => 90,
'apart_level' => ['error'], // error级别单独文件
],
'file' => [
'type' => 'file',
'path' => runtime_path('log'),
'level' => ['info', 'warning'],
'max_files' => 30,
],
],
二、日志记录方法
ThinkPHP提供静态Facade和类方法两种记录方式,支持上下文数据传递(数组自动转为JSON):
Log::write('手动记录日志', 'info')(需手动触发);Log::info('用户登录成功', ['user_id' => 1])、Log::error('数据库连接失败', ['host' => '127.0.0.1']);error级别日志(无需手动处理);config/database.php中的trigger_sql(APP_DEBUG=true时默认开启),记录执行的SQL语句及耗时。三、日志查看方式
runtime/log目录下,按日期或通道分文件(如2025-07-07.log、prod_error.log),可通过cat、less等命令查看;php think log命令查看所有日志,支持过滤级别(如php think log --level=error仅看错误日志)和通道(如php think log --channel=prod_error);tail -f runtime/log/prod_error.log实时查看错误日志更新,便于快速响应问题。四、日志清理与维护
runtime/log目录下不需要的日志文件(如rm -rf runtime/log/2025-06-*.log);logrotate工具实现自动轮转,示例配置(/etc/logrotate.d/thinkphp):/path/to/runtime/log/*.log {
daily # 每天轮转
rotate 30 # 保留30天
compress # 压缩旧日志(gzip)
missingok # 文件不存在不报错
notifempty # 空文件不轮转
create 640 www-data www-data # 新文件权限(www-data为Web用户)
sharedscripts # 所有文件处理完再执行脚本
postrotate
/usr/bin/find /path/to/runtime/log -name "*.gz" -mtime +90 -exec rm -f {} \; # 删除90天以上的压缩日志
endscript
}
五、生产环境最佳实践
runtime/log目录权限正确(如chmod 750 runtime/log,所有者为Web用户,组为可读),避免未授权访问;prod_error、prod_sql、prod_business),便于分类分析;max_files限制日志文件数量,结合find命令或监控工具(如Prometheus)监控日志大小,超过阈值时发送报警(如邮件、钉钉);json格式并发送到日志收集系统(如ELK),减少磁盘IO;低频日志(如错误日志)保留长期(如90天)。