log_threshold决定日志记录级别:0关闭、1仅error、2加debug、3加info、4含sql;生产建议设1,开发可设3或4;log_message()级别参数须小写'error'/'debug'/'info';log_path需可写绝对路径且结尾带斜杠;ci3需手动加载log库,ci4自动加载;404日志依赖log_threshold≥1。

log_threshold 配置值决定哪些日志能落地
CodeIgniter 不会自动记录所有日志,log_threshold 是开关阀门。它不是布尔值,而是整数级别阈值,值越小记录越少,越大越详细:
-
0:完全关闭日志写入(连 404 和控制器缺失都不会记) -
1:仅记录'error'级别(PHP 错误、show_error()、show_404()自动触发的日志) -
2:增加'debug'级别(CI 内部调试信息,如加载类、配置项解析) -
3:再增加'info'级别(常规运行提示,如路由匹配、钩子触发) -
4:还包含数据库查询语句($this->db->last_query()类似内容)
生产环境建议设为 1,开发环境可设为 3 或 4;但别长期开 4,高频查询会快速撑爆磁盘。
log_message() 的第一个参数必须是小写字符串
调用 log_message() 时,级别参数大小写敏感,错一个字母就静默失败:
- ✅ 正确:
log_message('error', 'User login failed') - ❌ 失败:
log_message('Error', ...)、log_message('ERROR', ...)、log_message('err', ...)
CI3 中该函数不校验参数,直接丢弃非法级别;CI4 同样不报错,但日志不会出现。别靠“试试看”,只用这三个小写值:'error'、'debug'、'info'。
日志路径必须是可写绝对路径,且结尾带斜杠
$config['log_path'] 不支持相对路径或 URL,也不能是空字符串或错误权限目录:
- ✅ 推荐写法:
$config['log_path'] = '/var/www/myapp/logs/';(结尾有/) - ❌ 常见陷阱:
$config['log_path'] = 'logs/'(相对路径,实际写到 webroot 下,极不安全) - ❌ 权限问题:目录不存在、无写权限、SELinux 限制都会导致日志静默消失,查
ls -ld /var/www/myapp/logs/确认
CI3 要求手动加载日志库:$this->load->library('log');CI4 已自动加载,但旧项目迁移时容易漏掉这步,导致 log_message() 调用报 Fatal error: Call to a member function write_log()。
404 和控制器缺失日志依赖 log_threshold=1 及以上
很多人以为 404 一定会进日志,其实不然:show_404() 默认会调用 log_message('error', ...),但前提是 log_threshold >= 1。如果设为 0,连 404 都不会留下痕迹。
同理,访问不存在的控制器(比如 /index.php/nonexist)也会触发自动 404 日志,但同样受该阈值控制。排查上线后“找不到页面却没日志”问题时,第一反应应是检查 log_threshold 是否被误设为 0 —— 这个值在 CI3 的默认配置里就是 0,极易被忽略。










