tp5 已彻底移除全局函数 _log(),调用会直接报 fatal error: uncaught error: call to undefined function _log();这不是配置或兼容性问题,而是该函数被永久删除,老项目迁移时需改用 log::info() 等语义化方法。

为什么不能直接用 _log()?
TP5 已彻底移除全局函数 _log(),调用会直接报 Fatal error: Uncaught Error: Call to undefined function _log()。这不是配置问题,也不是版本兼容开关——它就是被删了。很多老项目迁移时卡在这一步,以为是没加载类或路径不对,其实根源是函数本身不存在。
Log::record() 和语义化方法怎么选?
推荐优先使用 Log::info()、Log::error()、Log::debug() 这类语义化方法,而不是裸调 Log::record():
-
Log::info('用户登录', ['uid' => 123])自动带info级别,上下文自动 JSON 化,不易传错参数顺序 -
Log::record('用户登录', 'info', ['uid' => 123])要手动对齐三个参数位置,第二个必须是字符串级别(如'error'),传400或ERROR都会静默失败 - 语义化方法底层仍走
record,但做了封装校验,开发时更稳
如何扩展自定义日志级别(比如 crud)?
TP5 允许注册新级别,但需两步配合生效:
- 在配置中放开记录阈值:
'level' => ['error', 'info', 'debug', 'crud'](写在config/log.php的level数组里) - 调用时用
Log::record('订单创建', 'crud')或封装成门面方法:Log::crud('订单创建') - 注意:自定义级别不会自动出现在
Log::channel()的语义方法里,Log::channel('file')->crud()会报错,只能走record()底层 - 如果想统一管理 CRUD 日志到独立文件,建议建专用通道,而非仅靠级别
怎么新增一个日志通道(比如写进数据库)?
扩展通道不是改函数,而是注册驱动 + 配置 + 调用三步:
- 先实现驱动类,比如
app\log\driver\Db.php,继承\think\log\driver\File或实现\think\log\DriverInterface - 在
config/log.php中添加通道配置:'channels' => ['db' => ['type' => 'Db', 'table' => 'sys_logs']] - 调用:
Log::channel('db')->error('支付失败')—— 注意必须用->error(),不能用->record() - 通道配置中的
level可独立设置,例如数据库通道只存error,而文件通道存info及以上
通道驱动一旦注册,就和内置 File 驱动平级;但别忘了给数据库表加索引,高频写入时 created_at 字段没索引会导致慢查拖垮整个日志流程。











