thinkphp默认使用文件驱动自动记录日志到runtime/log/下按日期分片的文件中,无需手动操作;支持log::record()暂存、log::write()立即写入、log::channel()自定义通道,需注意级别过滤、敏感信息脱敏及磁盘空间管理。

ThinkPHP 默认用文件方式记录日志,不需要额外配置就能自动写入 runtime/log/ 目录下按日期分片的文件中。关键在于理解“怎么记”“记什么”和“怎么控制”,而不是手动操作文件。
默认日志行为:开箱即用,无需手动写文件
只要没在配置中关闭日志('log.close' => true),系统会在请求结束时自动把错误、SQL、调试等信息写入文件。比如开启调试模式后,SQL 语句、变量 dump、运行时间都会进日志;生产环境关闭调试后,通常只保留 error 和 warning 级别。
- 日志路径默认是
runtime/log/,每天生成一个新文件,如20260921.log - 不用自己
fopen/fwrite,ThinkPHP 的File驱动已封装好权限、分片、大小限制(默认单文件 2MB) - 若想改位置,只需在
app.php中配置:'log' => ['type' => 'file', 'path' => APP_PATH . 'logs/']
手动记录日志:用 Log::record() 最常用
业务中需要留痕时(如用户登录失败、订单状态变更),调用 Log::record() 即可,它把日志暂存内存,等请求结束自动落盘。
- 基础写法:
Log::record('用户ID: 123 登录成功');→ 默认级别为info - 指定级别:
Log::record('支付回调验签失败', 'error');或Log::record('缓存命中率: 87%', 'notice'); - 支持数组,自动转 JSON:
Log::record(['uid' => 123, 'action' => 'pay', 'amount' => 99.9], 'info'); - 注意:如果配置了
'log.level' => ['error'],那info级别会被跳过,不写入
实时写入与高级控制:按需选择 write 或 channel
绝大多数场景 record() 足够。只有两种情况建议换方法:
- 要立刻写入磁盘(比如记录关键异常后程序可能崩溃)→ 用
Log::write('msg', 'error') - 要把某类日志单独导出(如所有 error 推送到钉钉,或写进数据库)→ 先定义通道,再用
Log::channel('db')->error('xxx') - 不要用已废弃的
_log()函数,5.0+ 版本会报错Call to undefined function _log()
查看与管理日志文件:定位准、删得稳
日志文件就在 runtime/log/ 下,按日期命名,直接用文本编辑器或 tail -f 查看。线上环境要注意:
- 避免日志撑爆磁盘:配置
'file_size' => 2097152(2MB)和'max_files' => 30(最多保留30天) - 敏感信息过滤:不要在日志里直接写密码、token、银行卡号;记录前先用
array_filter清洗参数 - 临时关闭日志:配置
'log.close' => true,或代码中调用Log::close()
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











