codeigniter无法直接对接papertrail,因其原生日志类仅支持文件写入,不支持syslog协议;需通过logspout等工具将stdout/stderr转发至papertrail。

CodeIgniter 本身不支持直接对接 Papertrail,必须通过 syslog 协议中转;直接改 $config['log_path'] 或调用 log_message() 不会把日志发到 Papertrail。
为什么不能直接写入 Papertrail
Papertrail 是远程 syslog 服务,只接收符合 RFC 5424/RFC 3164 格式的 UDP/TCP 日志流。CodeIgniter 原生日志类 Log.php 只支持写文件,不提供网络输出能力。试图把 $config['log_path'] 设成 udp://logs.papertrailapp.com:XXXXX 会静默失败——框架根本不解析这类协议地址。
常见错误现象:
- 日志仍只出现在
application/logs/,Papertrail 后台无任何事件 - 修改
log_path为 URL 格式后,log_message()调用不再生成本地文件,也不报错 - 用
file_put_contents('udp://...')手动发包,因缺少 syslog 头部(如 PRI、timestamp、hostname)被 Papertrail 拒收
用 Logspout 容器桥接 CodeIgniter 和 Papertrail
Logspout 是专为 Docker 设计的 syslog 转发器,能自动捕获容器 stdout/stderr 并转发至 Papertrail。这是目前最轻量、免侵入的方案,无需修改 CodeIgniter 代码。
实操步骤:
- 确认你的 CodeIgniter 应用已容器化(即运行在 Docker 中),且日志输出到 stdout(例如:用
echo或error_log()输出,或配置 CI 将log_message()重定向到 stdout) - 在
docker-compose.yml中添加 Logspout 服务,使用官方镜像:gliderlabs/logspout:v3.3 - 将 Papertrail 提供的 endpoint(如
logs5.papertrailapp.com:43858)作为命令参数传入 - 挂载
/var/run/docker.sock,使 Logspout 能监听其他容器日志流
示例配置片段:
logspout:
image: gliderlabs/logspout:v3.3
command: syslog://logs5.papertrailapp.com:43858
volumes:
- /var/run/docker.sock:/var/run/docker.sock
restart: unless-stopped
让 CodeIgniter 日志进 stdout(关键一步)
默认情况下,log_message() 写的是文件,Logspout 捕获不到。必须让日志最终流向 stdout,才能被 Logspout 拾取。
推荐做法(不改框架源码):
- 在
application/config/config.php中,把$config['log_path']设为空字符串(''),强制 CI 使用默认路径;再通过 Linux 符号链接把application/logs/指向/dev/stdout(仅限开发/测试环境) - 更稳妥的方式:自定义一个日志驱动类,继承
CI_Log,重写write_log()方法,用error_log($msg)替代文件写入(error_log()默认输出到 stderr,Logspout 可捕获) - 避免在生产环境用
/dev/stdout符号链接——容器重启后可能失效,且无法保留本地备份
注意:error_log() 输出的内容需手动补全 syslog 格式头(如 May 12 13:51:00 ci-app user_login|id:123|ip:192.168.1.100),否则 Papertrail 会归类为 “unparsed” 事件,搜索和过滤功能受限。
审计日志别走 Papertrail 直连
后台操作审计(如管理员删订单、改权限)需要结构化字段(user_id、uri、method、IP、参数快照),而 Papertrail 接收的是纯文本流。即使你把 log_message('info', 'admin_delete_order|id:1001|by:5') 发过去,也失去了数据库 JOIN、时间范围聚合、字段提取等能力。
正确做法:
- 审计日志坚持写进专用数据库表(如
admin_audit_logs),用INSERT显式记录 - 让 Logspout 只负责系统级日志(PHP 错误、SQL 查询、404)、应用启动/关闭事件等无结构文本流
- 若真要聚合审计日志,应另起服务从数据库 binlog 或定时拉取增量,转成 JSON 发给 Papertrail(非本文范畴)
最后提醒:Papertrail 免费计划每月上限 100MB,高频审计写入极易超标。别把 log_message('info', ...) 当审计主通道用——它只是文本管道,不是数据仓库。











