ThinkPHP 5.0+ 已彻底移除 _log() 全局函数,调用会报 Call to undefined function _log() 错误;应改用 Log::record()(支持级别控制)、Log::channel()->error()(自定义通道)或 Log::write()(需通过门面引入)。

ThinkPHP 的 _log 方法早已废弃,5.0+ 版本中直接调用会报错或静默失败,必须改用 think\Log 类或 Log::record() 等标准接口。
为什么调用 _log() 没反应或报错
ThinkPHP 3.x 中的全局函数 _log() 在 5.0+ 完全移除,不是兼容层保留项。常见现象包括:
- PHP 报
Fatal error: Uncaught Error: Call to undefined function _log() - 项目降级到 3.2 但用了 5.x 的核心文件,导致函数存在但行为异常
- 误以为它是日志门面方法,实际它从没支持过日志级别参数(如
_log('msg', 'error')无效)
5.x/6.x 正确记录日志的三种方式
推荐优先使用 Log::record(),它最贴近原 _log() 的语义,且支持级别控制:
-
Log::record('用户登录失败', 'error')→ 记录 error 级别 -
Log::record('订单ID: '. $id, 'info')→ info 级别,不触发告警 -
Log::record(['uid' => 1001, 'action' => 'pay'], 'debug')→ 支持数组,自动 JSON 化
注意:Log::record() 默认写入 runtime/log/ 下按日期分片的文件,不实时刷盘;如需立即落盘,加第三个参数:Log::record('msg', 'error', true)。
立即学习“PHP免费学习笔记(深入)”;
日志级别怎么选:error / warning / info / debug 的实际影响
级别不只是语义标签,它决定是否被写入、是否触发邮件/钉钉告警(取决于配置):
-
'error':默认开启记录,建议用于异常捕获块(catch内)、关键业务失败 -
'warning':不中断流程但需人工关注,比如库存校验偏差、第三方接口超时重试成功 -
'info':常规操作留痕,如「用户 123 修改了收货地址」,但高频调用会撑大日志体积 -
'debug':仅开发/测试环境启用,生产环境默认过滤;开启后会记录 SQL 日志、变量 dump,性能损耗明显
级别由配置项 log.level 控制最低记录阈值(如设为 'error',则 info 和 debug 不写入)。
自定义日志通道时 Log::channel() 怎么配合级别使用
如果需要把错误日志单独推送到 Elasticsearch 或写入数据库,不能只靠 Log::record(),得先定义通道:
Log::channel('es')->error('支付回调签名失败');
关键点:
-
Log::channel('xxx')返回的是通道实例,后面必须接->error()/->info()等方法,不能接->record() - 通道配置里可独立设置
level,比如数据库通道只存error,文件通道存info及以上 - 调用
Log::channel('xxx')->info(...)时,即使全局log.level是error,该通道仍会记录 —— 级别判断发生在通道内部
通道名必须在 config/log.php 的 channels 数组中预定义,否则返回空实例,调用方法会报 Call to a member function error() on null。



















