Log::record()负责内存暂存日志,Log::save()负责落盘持久化,二者协作;默认请求结束自动save,高频埋点用record,关键操作中途落盘用save,实时强记录用write。

ThinkPHP6 中 Log::save() 和 Log::record() 不是替代关系,而是分工协作:前者负责“落盘”,后者负责“暂存”。调用 record 不会立刻写入文件,必须配合 save 才能真正保存日志。
Log::record() 是内存暂存操作
它只是把日志信息(含级别、时间等上下文)放进内存缓冲区,不涉及文件 I/O。系统默认在请求结束时自动调用 Log::save(),所以日常开发中只写 record 就够了。
- 默认记录级别是
INFO,可显式指定,比如Log::record('用户登录失败', 'error') - 支持第三个参数
$record(布尔值),设为true可绕过日志级别过滤,强制记录 - 高频调用不会立即产生磁盘压力,适合在循环或中间逻辑中埋点
Log::save() 是持久化执行动作
它把当前内存中所有通过 record 积累的日志,按配置的类型(如 file)、目标路径和格式,一次性刷入存储介质。手动调用它通常用于两种场景:
- 需要在请求中途就确保日志已写入(例如关键操作后立即留痕,防止后续异常导致丢失)
- 自定义日志通道或目标(比如把审计日志单独写进数据库表,而不是文件)
- 配合
record使用时,可传参覆盖全局配置,如Log::save('file', '/var/log/myapp/audit.log')
对比 write() 方法:实时写入,不走缓冲
如果你需要某条日志“立刻落地、不等待”,应该用 Log::write(),它跳过内存缓冲,直接写入,适合记录 SQL、关键错误或调试快照。
立即学习“PHP免费学习笔记(深入)”;
-
Log::write('SQL: ' . $sql, 'sql')常用于数据库操作审计 - 它不依赖
save,也不受record的级别过滤影响(除非你代码里主动判断) - 频繁调用
write会增加 I/O 开销,慎用于高并发循环内
不复杂但容易忽略:多数时候只用 record 就行;需要“马上看到”或“独立路径”时,才介入 save 或换用 write。



















