4

我们将进行部署设置,我们将在其中拥有许多服务器,其中大部分会在流量增加时自动添加到负载均衡器中。这种设置的问题在于,如果单个开发人员需要跟踪日志以排除故障,他将不得不在每台服务器上打开一个控制台,这使得开发人员通常不知道我们可能有多少台服务器这一事实变得复杂。在当时发挥作用。

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

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

  • 有 1 分钟的延迟,因为无法更频繁地运行 cron。
  • 每台 FE 机器上的 cron 都必须设置为同步到部署服务器上的特定位置,但在前面,我不知道会有多少这样的 FE 服务器存在。

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

有人知道我可以如何配置吗?或者也许是实现这一点的服务?

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

4

2 回答 2

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

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

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

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

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

于 2012-11-26T12:13:34.383 回答
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));
};

重启系统日志服务:

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); };

重启系统日志服务器:

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 服务器和 Logging 服务器都在同一个 EC2 安全组内,则无需打开端口,因为在组内,所有端口都可以自由访问,只要有服务在侦听即可。

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

于 2012-12-05T02:06:15.743 回答