已设log_threshold=0,如何阻止CodeIgniter生成0字节日志文件?
log_threshold=0仍生成空日志文件的问题 这个问题在IIS+PHP环境下用CodeIgniter确实挺常见的,我之前也碰到过一模一样的情况——哪怕把$config['log_threshold']设成0,日志文件夹里还是会冒出一堆0字节的空日志文件。结合你的环境(Microsoft-IIS/7.5、PHP 5.5.32),给你几个亲测有效的解决思路:
检查PHP系统日志的配置冲突
IIS环境下,PHP本身的error_log设置可能会和CodeIgniter的日志机制“撞车”。打开你的php.ini文件,找到error_log配置项,看看它是不是指向了CodeIgniter的日志文件夹?如果是这种情况,你可以:- 把
error_log改成其他独立的路径(比如C:\PHP\logs\php_errors.log) - 如果不需要PHP系统级日志,直接注释掉这个配置项
- 把
修改CodeIgniter日志核心类的逻辑
如果上面的方法没效果,大概率是CodeIgniter的日志类在初始化时,不管阈值是否为0都会执行文件创建操作。你可以找到system/core/Log.php文件,定位到write_log方法,在方法开头添加一个判断:如果日志阈值为0,直接返回,不执行后续的文件创建流程。修改后的代码大概是这样:public function write_log($level = 'error', $msg, $php_error = FALSE) { // 新增:阈值为0时直接返回,不创建日志文件 if ($this->_threshold === 0) { return FALSE; } // 以下是原有的代码逻辑 $level = strtoupper($level); if (!isset($this->_levels[$level]) || ($this->_levels[$level] > $this->_threshold)) { return FALSE; } // ... 剩余代码保持不变 }注意:修改核心文件后,后续升级CodeIgniter时记得备份这个修改,避免被新版本覆盖。
排查自定义代码或第三方库的手动日志调用
有些项目里的自定义代码、第三方插件会无视log_threshold配置,直接调用log_message()方法触发日志写入。你可以全局搜索项目里的log_message关键词,看看有没有这种强制调用的情况,把这些调用加上阈值判断再执行。验证日志文件夹权限(辅助排查)
虽然空文件说明IIS运行账户有写权限,但还是可以确认下日志文件夹的权限设置——确保IIS的应用池账户(比如IUSR或者AppPoolIdentity)拥有该文件夹的读写权限,避免因权限异常导致的半写入状态。
这些方法应该能彻底解决你遇到的问题,我之前在类似的IIS环境下用第二种方法解决过相同的空日志文件问题,亲测有效。
内容的提问来源于stack exchange,提问作者Selçuk Koyuncu

