日志没写进文件需检查log.driver是否为file、log.level是否足够低;Log::record()易出错,应优先用Log::info()等语义化方法;确保log.path路径存在且运行用户有权限;注意日志按天轮转和缓冲机制。

日志没写进文件?检查 log.driver 和 log.level 配置
ThinkPHP 默认用 File 驱动写日志,但如果你改过配置或升级过版本,可能被悄悄切到了 Stdout(只输出到控制台)或 Test(测试驱动,不落盘)。log.level 也得是 debug、info 或更低级别,否则 Log::info() 这类调用会被直接忽略。
- 确认
config/log.php中'driver' => 'file',不是'stdout' -
'level' => 'debug'才能记录所有等级;设成'error'就连warning都不会写 - 线上环境默认是
'level' => 'error',别误以为“日志坏了”,其实是它本来就不该记 info - 如果用了多应用模式,检查对应应用目录下的
config/log.php,主配置可能被覆盖
Log::record() 不生效?优先用 Log::info() 等语义化方法
Log::record() 是底层写法,需要手动传入 level 字符串和上下文数组,容易拼错参数顺序或漏掉 context 键名。实际开发中几乎没人这么写,既难读又易出错。
- 用
Log::info('用户登录', ['uid' => 123])更安全,level 自带、格式统一 -
Log::record()的第二个参数是level(字符串),比如'error',不是数字400;第三个才是上下文数组 - 如果日志内容含中文或特殊符号,确保
log.file_permission设为0644,否则某些 Linux 环境下 file_put_contents 会静默失败
日志路径不对或权限拒绝?看 log.path 和运行用户
ThinkPHP 默认把日志写到 runtime/log/,但这个路径必须存在、可写,且 PHP 进程的运行用户(如 www-data、nginx、apache)有权限创建子目录和写文件。常见错误是部署时用 root 解压代码,但 web 服务以普通用户运行,导致 runtime 目录属主不匹配。
- 执行
ls -ld runtime log看目录权限,再用ps aux | grep php-fpm确认 worker 用户 - 临时修复:用
chown -R www-data:www-data runtime(按实际用户调整) - 生产环境别设
log.path到/tmp或根目录——有些容器或安全策略会拦截 - 如果改过
log.path,注意结尾不能带斜杠,'path' => '/var/log/tp/'正确,'path' => '/var/log/tp//'会导致路径拼接异常
查不到刚写的日志?注意缓存、轮转与时间戳格式
ThinkPHP 日志默认按天轮转,文件名形如 20240512.log。如果你在凌晨 00:01 写日志,却翻前一天的文件,自然找不到。另外,日志不是实时刷盘,有缓冲机制,极端情况下重启服务前最后几条可能丢失。
- 用
tail -f runtime/log/$(date +%Y%m%d).log实时盯当天文件,别瞎翻旧文件 - 开启
'realtime_write' => true可禁用缓冲,但会轻微影响性能,仅调试时开 - 日志内容里的时间是服务器本地时区,不是 UTC;如果服务器时区设错(比如显示 CST 却是美国中部时间),时间戳就对不上
- Log::error() 记录的异常堆栈默认不包含完整 trace,要加
Log::error($e->getMessage(), ['trace' => $e->getTraceAsString()])
日志轮转逻辑藏在 think\log\driver\File 里,不建议手动删旧文件——它只靠文件名日期判断,删了可能导致当日日志写不进去。真要清理,用脚本按日期归档,别暴力 rm -rf runtime/log
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











