log_message() 不支持直接对接 logentries,因其仅写本地文件且无远程传输能力;必须通过自定义日志库+钩子(ci3)或实现 handlerinterface(ci4)接管日志输出,并注意令牌安全、缓冲降级等生产要点。

log_message() 不支持直接对接 Logentries —— 它只写本地文件,没有内置远程日志传输能力。想把 CodeIgniter 日志发到 Logentries,必须绕过默认管道,自己接管日志输出。
为什么不能直接用 log_message() 推送到 Logentries
log_message() 是个封闭函数:它只做两件事——检查 $config['log_threshold'],然后把字符串写进 $config['log_path'] 下的 PHP 文件。它不暴露句柄、不支持回调、不接受自定义 handler。Logentries 需要 HTTP POST 或 syslog 协议,两者完全不兼容。
CI3 中替换日志写入点的可行方式
在 CI3 里,唯一可安全拦截日志落地的位置是 system/core/Log.php 的 write_log() 方法。但修改核心文件风险高,推荐用「包装器 + 钩子」替代:
- 新建一个日志库(如
application/libraries/Logentries_logger.php),封装 Logentries 的 HTTP 发送逻辑(需 cURL 或 Guzzle) - 在
post_system钩子中,重写log_message()行为:先调原始函数写本地文件,再提取最后一行(或改用自定义函数替代调用),喂给你的Logentries_logger - 注意:不要在钩子里调
$this->load->library(),因为post_system时 CI 对象可能已销毁;应提前加载或用静态实例 - 关键限制:
log_message('error', ...)的消息格式是纯字符串,不含时间戳、IP、请求路径——你得自己从$this->input和date()拼全结构化字段,否则 Logentries 里只有干瘪文本
CI4 的适配更简单但仍有坑
CI4 把日志抽象成 LoggerInterface,理论上可注入自定义 handler。但实际要注意:
- CI4 默认仍走
FileHandler,即使你配置了Writers,log_message()这个向后兼容函数依然只写文件,不触发新 Writer - 必须改用
service('logger')->error()等方法才能进 Writer 流程 - Logentries 的 Writer 需自己实现:继承
CodeIgniter\Log\Handlers\HandlerInterface,重写handle(),用curl_init()发 JSON 到 Logentries 的 HTTPS 端点(https://webhook.logentries.com/noformat/logs/YOUR_TOKEN) - 别忘了设置
$config['log_threshold'] = 0,否则log_message()还会重复写一份本地日志,造成冗余和权限干扰
生产环境最容易忽略的三个点
一是 Logentries 的 token 必须硬编码进 Writer 类或配置文件,绝不能放数据库或 session;二是每次 HTTP 请求都发日志会拖慢响应,建议加内存缓冲(比如每 5 条或 1 秒 flush 一次);三是 Logentries 接收失败时,handle() 内部不能抛异常,否则整个请求崩溃——得静默降级回写本地文件。











