@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 サーバーと Logging サーバーがすべて同じ EC2 セキュリティ グループ内にある場合、サービスがリッスンしている限り、グループ内ではすべてのポートに自由にアクセスできるため、ポートを開く必要はありません。
このアプローチにより、各アプリ、モジュールが集中ログを必要とするかどうかを決定できます。