CodeIgniter无法直接对接Papertrail,因其日志系统仅支持本地文件写入,不支持远程syslog/HTTP/TCP输出;Papertrail只接收标准syslog协议流。正确方式是通过Logspout(Docker环境)或CI4内置SyslogHandler+rsyslog转发实现。

CodeIgniter 本身不支持直接对接 Papertrail,必须通过 syslog 协议中转;直接改写日志路径或调用 log_message() 不会发到 Papertrail。
为什么不能直接在 CodeIgniter 中配置 Papertrail 地址
CodeIgniter 的日志系统(Logger.php 或 config.php 中的 $config['log_threshold'])只支持写入本地文件,不提供远程 syslog、HTTP 或 TCP 输出能力。Papertrail 是一个接收标准 syslog 流的 SaaS 服务,它不接受 PHP 文件写入、数据库插入或自定义 HTTP POST —— 只认 syslog://host:port 格式的原始 UDP/TCP 日志流。
常见错误现象:
- 在
config.php里把$config['log_path']改成"syslog://logs.papertrailapp.com:43858"—— 完全无效,PHP 会报错或静默失败 - 用
error_log()发送消息到 Papertrail 地址 —— 仅当服务器已配置 rsyslog 转发时才可能生效,且格式不兼容 - 以为开启
$config['log_threshold'] = 4就能“自动上云” —— 实际仍只落盘到app/Writeable/logs/
正确接入方式:用 Logspout + Docker 把容器日志转发到 Papertrail
这是目前最稳定、侵入性最小的方案,适用于生产环境部署在 Docker 中的 CodeIgniter 应用(包括 CI3 和 CI4)。关键不是改框架,而是让整个容器的日志输出被采集并重定向。
操作步骤:
- 确认你的 CodeIgniter 应用运行在 Docker 容器中,并且
docker-compose.yml可编辑 - 在
docker-compose.yml同级目录下,添加一个logspout服务块(注意替换你 Papertrail 控制台给出的真实地址):
logspout:
image: gliderlabs/logspout:v3.2.6
command: syslog://logs.papertrailapp.com:43858
volumes:
- /var/run/docker.sock:/var/run/docker.sock
restart: unless-stopped- 确保 CodeIgniter 容器的
logging配置为json-file(默认),且未禁用 stdout/stderr 输出 - 启动后,所有
echo、error_log()、log_message()写入文件的日志,只要最终触发了stdout(比如用tail -f查看日志文件再重定向),或你主动把日志cat到stdout,Logspout 就能捕获 —— 但更推荐让 CodeIgniter 直接输出到stderr(见下一条)
让 CodeIgniter 主动输出 syslog 到 stderr(CI4 推荐)
如果你不想依赖 Logspout,或应用不在 Docker 中,可以绕过文件日志,直接用 PHP 的 openlog() + syslog() 发送到 Papertrail。但这要求服务器已安装并配置好 rsyslog 转发规则,或使用 syslog-ng。
更轻量的做法(尤其适合 CI4):
- 在
app/Config/Logger.php中,把$this->threshold设为0(关闭文件日志) - 在
app/Services.php中重写logger服务,替换为自定义驱动:
public function logger()
{
$logger = new \CodeIgniter\Log\Handlers\SyslogHandler();
$logger->setFacility(LOG_USER);
$logger->setIdent('ci4-app');
return $logger;
}- 然后确保服务器 rsyslog 配置了转发(例如
/etc/rsyslog.d/99-papertrail.conf):
*.* @logs.papertrailapp.com:43858
- 重启 rsyslog:
sudo systemctl restart rsyslog
注意:SyslogHandler 在 CI4 中原生支持,但 CI3 没有该类,需自行实现或改用 Monolog。
容易忽略的关键点
Papertrail 不解析 PHP 日志文件格式,只收纯文本行。所以即使你用 log_message('info', 'user_login|id:123|ip:192.168.1.1'),也得确保这行最终变成 stdout/stderr 的一行输出,而不是写进 log-2026-05-12.php 文件里——否则 Papertrail 永远看不到。
另外,Papertrail 免费计划每月限 100MB,高频 SQL 日志(log_threshold = 4)极易超标;建议只开 error 或 info 级别,且在钩子中过滤掉 SELECT 类查询。


















