如何设置PHP日志以转到远程服务器?

Shr*_*eni 4 php debugging ubuntu error-log amazon-ec2

我们将进行部署设置,我们将拥有许多服务器,其中大部分服务器在流量上升时自动添加到负载均衡器.这种设置的问题在于,如果一个开发人员需要拖尾日志来解决问题,他将不得不在每台服务器上打开一个控制台,由于开发人员通常不知道我们可能会使用多少台服务器,因此这很复杂当时有功能.

如果开发人员可以在一台服务器中找到所有日志 - 比如我们的部署服务器,则故障排除变得更加容易.

为此,我考虑使用cron设置从每台FE计算机到部署服务器的推送,该计划将复制我们的部署服务器上的日志.这种方法存在两个问题:

  • 有一分钟的滞后,因为crons不能更频繁地运行.
  • 每台FE计算机上的cron必须设置为同步到部署服务器上的特定位置,但事先我不知道有多少这样的FE服务器存在.

为了解决这个问题,我正在研究一种连接error_log或PEAR Log以将日志直接发送到我们的部署服务器的方法,该服务器会将其实时记录到/ var/log /中的本地位置.

谁知道我怎么配置这个?或者也许是一项服务来实现这一目标?

我们的服务器都是Ubuntu 10.04 LTS,我们在AWS的EC2实例上运行这些服务器.我们的PHP版本是5.3.

Mic*_*eim 7

您可以做的是登录自定义syslog通道,该通道写入中央日志记录服务器.

php.ini中

error_log = syslog
Run Code Online (Sandbox Code Playgroud)

php框上的syslog-ng.conf

destination php { tcp("10.10.10.10" port(5140)); };
log { source(src); filter(f_php); destination(php); };
Run Code Online (Sandbox Code Playgroud)

这将发送所有PHP记录到一个盒子10.10.10.10,其中syslog-ng在端口监听5140.

在日志框中,您必须打开5140ec2安全组中的端口

这是一个关于如何设置syslog服务器的好教程

http://praxis.edoceo.com/howto/syslog-ng

编辑:这当然也可以将您的PHP框的其他重要日志源记录到日志服务器..考虑流量日志,系统日志等.


Shr*_*eni 5

@MichelFeldheim 的答案是起源,但我们对其进行了改进,以处理写入多个日志文件的多个应用程序。

\n\n
\n\n

中央日志服务器

\n\n

中央日志服务器中,安装 syslog-ng 并进行配置:

\n\n
sudo apt-get install syslog-ng\n
Run Code Online (Sandbox Code Playgroud)\n\n

将以下内容添加到 /etc/syslog-ng/syslog-ng.conf 中:

\n\n
destination d_php { file("$PROGRAM" owner(www-data) group(www-data) perm(0644)); };\nfilter f_php { program("^\\/var\\/log\\/"); };\nlog { source(s_all); filter(f_php); destination(d_php); flags(final); };\n\nsource s_all {\n        # ....\n        # .... LET THE PREVIOUS CONTENT STAY - add the following line\n        tcp(port(5140) keep_alive(yes));\n};\n
Run Code Online (Sandbox Code Playgroud)\n\n

重新启动系统日志服务:

\n\n
sudo service syslog-ng restart\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

在 FE 服务器上

\n\n

在每台FE 服务器上,安装 syslog-ng 并进行配置:

\n\n
sudo apt-get install syslog-ng\n
Run Code Online (Sandbox Code Playgroud)\n\n

将以下内容添加到每个 FE 服务器上的 /etc/syslog-ng/syslog-ng.conf 中:

\n\n
destination php { tcp("log.example.com" port(5140)); };\nlog { source(s_all); filter(f_php); destination(php); };\nfilter f_php { facility(user); };\n
Run Code Online (Sandbox Code Playgroud)\n\n

重新启动系统日志服务器:

\n\n
sudo service syslog-ng restart\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

应用程序代码更改

\n\n

现在,应用程序代码可以这样更改。假设每个应用程序都有这样的代码写入单独的文件,并且您希望在中央日志服务器中反映相同的结构:

\n\n
// PREVIOUS CODE: using PEAR Log\ninclude \'/usr/share/php/Log.php\';\n$log = Log::singleton(\'file\', \'/var/log/nginx/xxx.log\', \'\', array(), PEAR_LOG_INFO);\n// PREVIOUS CODE: Using error_log\nini_set(\'error_log\' , \'/var/log/nginx/xxx.log\');\n
Run Code Online (Sandbox Code Playgroud)\n\n

新代码应如下所示:

\n\n
// NEW CODE: using PEAR Log\ninclude \'/usr/share/php/Log.php\';\n$log = Log::singleton(\'syslog\', LOG_USER, \'/var/log/nginx/xxx.log\', array(), PEAR_LOG_INFO);\n// NEW CODE: Using error_log\nini_set(\xe2\x80\x98error_log\xe2\x80\x99, \xe2\x80\x98syslog\xe2\x80\x99);\nopenlog(\'/var/log/nginx/xxx.log\', LOG_NDELAY, LOG_USER);\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果您的 FE 服务器和日志服务器都在同一个 EC2 安全组内,则无需打开端口,因为在组内,只要有服务正在侦听,所有端口都可以自由访问。

\n\n

这种方法允许您的每个应用程序、模块决定它们是否需要集中日志记录。

\n