@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 安全组内,则无需打开端口,因为在组内,所有端口都可以自由访问,只要有服务在侦听即可。
这种方法允许您的每个应用程序、模块决定是否需要集中日志记录。