2009-09-18 15 views
10

私のレールアプリケーションでsyslogを使用することを考えています。プロセスはthis blog postに概説されている:railsアプリケーションでsyslogを使用する

  1. また、同じファイルにconfig.logger =行のコメントを解除しconfig/environments/production.rb
  2. のトップにrequire 'syslog_logger'を追加するには、Gemfile
  3. gem 'SyslogLogger'を追加します。

生産用ボックスには、乗客を使用して走行する4つのレールアプリケーションがあります。 4つすべてのアプリケーションでsysloggerを使用するように切り替えると、4つのアプリケーションすべてからのログメッセージが1つのファイルに送られ、ログメッセージがインターリーブされることになります。もちろん、私はsplunkを使用することができますが、最初に、私のレールアプリケーションごとに1つのログファイルを取得することが可能かどうかを確認したいと考えました。それは私の状況にとって望ましいことです。

これは可能ですか?

答えて

2

はい、デフォルトでは、ほぼすべてのUnix syslogdsは、userまたはlocal*ファシリティで指定されたメッセージを同じファイルに書き込みます。しかし、私が知っているすべてのsyslogdは、施設単位でログファイルを指定できるようになるため、最初のアプリケーションログはlocal1.*、次のログはlocal2.*などとすることができます。

さらに、syslog-ngのような新しいのsyslogデーモンが(/var/log/railsapp_1.logなどにそれらにrailsapp_1を持っている文字列をログ書き込み)正規表現に対してメッセージを評価することによって、異なるファイルにメッセージを分割することができます。だから、

、の引用答えは1をカバー@(お使いのシステムのmanページは、あなたがそれをやって助けていない場合は、その構成を変更するの血みどろの詳細はserverfault.comに頼まれなければならない。)

5

をごsyslogdが適切に設定し、設定が完了していますアプリを区別するためのオプション。ただし、syslogメッセージフレーミングには、実際には2つのフィールドがあり、さらに簡単になります。hostnameおよびtag(より一般的にはプログラム名として知られています)。

hostnameは、メッセージを集中サーバに転送する前にシステムsyslogデーモンによって設定されます。これは同じシステム上のすべてのアプリケーションで同じですが、過去1台のサーバーが大きくなると便利です。

さらに興味深いのはtagです。あなたのアプリは、SyslogLoggerをインスタンス化するときにtagと定義します。たとえば:

SyslogLogger.new('app1') 

ロガークラスはapp1としてsyslogdをシステムに送信されます、それは(ログメッセージ自体を変更する必要なしに)ローカルログファイルと任意のリモートのsyslogの宛先の両方に表示されます。デフォルトはrailsです。最近のsyslogデーモンはすべてtagに基づいてフィルタリングできます。 syslog-ngの場合はprogram()、rsyslogの場合は$programnameを参照してください。

また、SyslogLoggerは基本的にC openlog()syslog()の機能をラッピングしているので、基本的にすべてのログ後設定はシステムデーモンで行われます。一般的には望ましいことですが、自動デプロイメントを簡略化したり、syslog()で許可されていない属性を変更したり、システムデーモンにアクセスできない環境でRailsアプリケーションを特定の宛先に直接ログしたりすることがあります。

これらのケースに入り込み、UDPパケット自体を生成するドロップインLoggerを置き換えました。 remote_syslog_loggerの宝石はon GitHubです。

関連する問題