php-fpm 访问日志到 rsyslog

php-fpm 访问日志到 rsyslog

我正在尝试找到一个解决方案,用于从多个服务器上 nginx 后面的 php72 php-fpm yii2 应用程序获取日志:现在应用程序将其日志写入服务器磁盘上的文件,yii 执行日志文件的轮换。

但是这个解决方案需要快速而大的磁盘,需要花费 $$ 并且通过共享目录将日志集中在一个地方 - 另一个问题是,因为从多个服务器访问文件会导致单个日志行碎片化。

目前我开始使用promtail/loki,但是promtail需要在带有应用程序的服务器上运行,并且会给配置和操作带来额外的开销。

这里出现了(我曾认为)旧的好 rsyslog,但我从 php-fpm 获取访问日志的所有尝试都失败了:

  • 将所有 rsyslog 行发送到中央 promtail,虽然不是没有问题,但它有效,
  • 从纯 php-cli 脚本获取日志到 rsyslog - 好的,
  • yii-scripts - 缺少一些成功,
  • php-fpm - 无人:没有访问日志,没有错误日志,不会到达(r)syslog

我所依赖的:

https://www.yiiframework.com/doc/api/2.0/yii-log-syslogtarget#$levels-detail

https://bugs.php.net/bug.php?id=76229

https://bugs.php.net/bug.php?id=67764

https://bugs.php.net/bug.php?id=79342

nginx/php-fpm 错误日志记录

我的配置:

/etc/php.ini

;error_log = syslog # if change fpm writes nothing to syslog

/etc/php-fpm.conf

error_log = syslog
syslog.facility = local0
syslog.ident = php-fpm
log_level = notice # debug mode results in a constant stream of lines about child processes spawning

/etc/php-fpm.d/site.conf

php_admin_flag[log_errors] = on
php_admin_value[auto_prepend_file] = /etc/php-fpm.d/prepare_log.php
;php_admin_value[syslog.facility] = local0 # if uncomment php cannot change admin flag value
;php_admin_value[syslog.ident] = php-fpm-$pool # if uncomment php cannot change admin flag value
access.log = syslog
slowlog = syslog
;php_admin_value[error_log] = /var/log/php-fpm/$pool-error.log
;php_admin_value[error_log] = syslog # if uncomment php cannot change admin flag value

/etc/php-fpm.d/prepare_log.php

<?php
        openlog('php', LOG_NOTICE, LOG_LOCAL3);

/etc/rsyslog.conf

$ModLoad imuxsock 
$ModLoad imjournal
...
*.* action(type="omfwd" protocol="tcp" target="promtail.localdomain" port="1514" Template="RSYSLOG_SyslogProtocol23Format" TCP_Framing="octet-counted" KeepAlive="on")

有没有办法解决此类问题,而无需将日志写入文件并从中读取?也许我理解错了,也许我需要查看 docker/kubernetes 机制来获取日志,也许有一个库可以直接写入 syslog/promtail,而不需要大量更改应用程序代码

相关内容