4

トラフィックが増加すると、ほとんどのサーバーがロード バランサーに自動的に追加される、多くのサーバーを配置する展開セットアップを行います。このセットアップの問題点は、個々の開発者が何かをトラブルシューティングするためにログを追跡する必要がある場合、各サーバーでコンソールを開く必要があることです。これは、開発者がサーバーの数を知らないことが多いという事実によって複雑になります。その時点で機能しています。

開発者が 1 つのサーバー (デプロイ サーバーなど) ですべてのログを見つけることができれば、トラブルシューティングが容易になります。

これに向けて、デプロイ サーバーにログを複製する cron を使用して、各 FE マシンからデプロイ サーバーへのプッシュを設定することを考えていました。このアプローチには 2 つの問題があります。

  • cron をこれ以上頻繁に実行できないため、1 分間の遅延があります。
  • 各 FE マシンの cron は、デプロイ サーバーの特定の場所に同期するように設定する必要がありますが、前もって、そのような FE サーバーがいくつ存在するかはわかりません。

この問題を解決するために、error_log または PEAR Log を接続してデプロイ サーバーにログを直接送信する方法を検討しています。これにより、/var/log/.. のローカル ロケーションにリアルタイムでログが記録されます。

これを構成する方法を知っている人はいますか? それとも、これを実現するサービスですか?

サーバーはすべて Ubuntu 10.04 LTS であり、AWS の EC2 インスタンスでこれらのサーバーを実行しています。PHP のバージョンは 5.3 です。

4

2 に答える 2

7

できることは、中央のログサーバーに書き込むカスタムsyslogチャネルにログインすることです。

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-ng5140

ロギングボックス5140で、ec2セキュリティグループのポートを開く必要があります

これは、syslogサーバーをセットアップする方法に関する優れたチュートリアルです。

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

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 セキュリティ グループ内にある場合、サービスがリッスンしている限り、グループ内ではすべてのポートに自由にアクセスできるため、ポートを開く必要はありません。

このアプローチにより、各アプリ、モジュールが集中ログを必要とするかどうかを決定できます。

于 2012-12-05T02:06:15.743 に答える