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

时间:2012-11-26 10:38:10

标签: php debugging ubuntu amazon-ec2 error-log

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

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

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

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

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

有人知道如何配置吗?或者也许是一项服务来实现这一目标?

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

2 个答案:

答案 0 :(得分:7)

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

<强>的php.ini

error_log = syslog
php框

syslog-ng.conf

destination php { tcp("10.10.10.10" port(5140)); };
log { source(src); filter(f_php); destination(php); };

这会将所有php日志记录发送到10.10.10.10,其中syslog-ng正在侦听端口5140

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

这是一个关于如何设置系统日志服务器的好教程

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

编辑: 这当然也可以将你的php盒子的其他重要日志源记录到日志服务器。考虑流量日志,系统日志等等。

答案 1 :(得分:4)

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


中央记录服务器

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

sudo apt-get install syslog-ng

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

destination d_php { file("$PROGRAM" owner(www-data) group(www-data) perm(0644)); };
filter f_php { program("^\/var\/log\/"); };
log { source(s_all); filter(f_php); destination(d_php); flags(final); };

source s_all {
        # ....
        # .... LET THE PREVIOUS CONTENT STAY - add the following line
        tcp(port(5140) keep_alive(yes));
};

重新启动syslog服务:

sudo service syslog-ng restart

在FE服务器上

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

sudo apt-get install syslog-ng

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

destination php { tcp("log.example.com" port(5140)); };
log { source(s_all); filter(f_php); destination(php); };
filter f_php { facility(user); };

重新启动syslog服务器:

sudo service syslog-ng restart

应用程序代码更改

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

// PREVIOUS CODE: using PEAR Log
include '/usr/share/php/Log.php';
$log = Log::singleton('file', '/var/log/nginx/xxx.log', '', array(), PEAR_LOG_INFO);
// PREVIOUS CODE: Using error_log
ini_set('error_log' , '/var/log/nginx/xxx.log');

新代码应如下所示:

// NEW CODE: using PEAR Log
include '/usr/share/php/Log.php';
$log = Log::singleton('syslog', LOG_USER, '/var/log/nginx/xxx.log', array(), PEAR_LOG_INFO);
// NEW CODE: Using error_log
ini_set(‘error_log’, ‘syslog’);
openlog('/var/log/nginx/xxx.log', LOG_NDELAY, LOG_USER);

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

此方法允许您的每个应用程序,模块决定是否要进行集中日志记录。