web-dev-qa-db-ja.com

Linux:ログファイルの新しい行をリモートSyslogに送信する方法

独自のプレーンテキストのログファイルを生成しているアプリケーションがいくつかあります。これらのアプリケーションをリモートSyslogサーバーに転送して、集中ロギングを行います。これらのマシンではrootにアクセスできません。また、syslogを再構成して出力をリモートマシンにリダイレクトすることもできません。

オンラインでいくつかの解決策を見つけましたが、それらは主に人々の手作りのbashスクリプトであり、大量生産の可能性がある実稼働環境での実装に適した、より堅牢なものを探しています。

できれば、小さなフットプリント、実行を継続するバックグラウンドデーモン、多くの回線に追いつくことができるなどを考慮して設計されたものが望ましい-現在、どのようなソリューションが利用可能か?

8

私は一緒にハッキングしましたtail.cおよびlogger.c軽量で高速かつ安定した単一の小さなフットプリントのコンパイル済みプログラム(バイナリ)に。ログファイルへの読み取りアクセス権がある限り、ルート権限がなくても機能します。

また、ネイティブロガーにいくつかの改良を加え、ログサーバーに送信される前に各ログ行の先頭にテキスト文字列を挿入する新しい(オプション)機能を追加しました。その結果、シェルパイプを使用せずに、単独で実行できるプログラムになります(つまり、tail logfile | logger)。明示的に強制終了するか、ネットワークソケットへの書き込みエラーが発生するまで、永久に実行されます。ログファイルがローテーションされた場合、またはログファイルが消えた場合でも、実行は継続されます(ファイルが再表示されるかどうかを確認するために引き続き検索が行われます)。

使い方は簡単です。監視する1つ以上のログファイルを指定するだけで、新しい行がファイルに書き込まれるたびに、その行のコピーが指定したローカルまたはリモートのsyslogサーバーに送信されます。さらに、そのオプションを使用する場合は、追加のテキスト文字列。

私は実際にプログラムを12月に終了しましたが、Yahooが著作権を取得して利用できるようになるのを待っていました。 (私はYahooでの仕事の一部としてそれを書いた)。

fileloggerプログラム情報とダウンロードリンク:

4

あなたはすでに「他の人のbashスクリプト」を拒否しましたが、これはかなり一般的な解決策です-一部の loggerコマンドのクリエイティブな使用 はファイルを追跡し、そのコンテンツを他の場所に送信できます。
私は個人的には、本番環境ではこれを行いません。


より少ないスクリプトハッカーを必要とするより良いオプションは、rsyslogdテキストファイル入力モジュール のように使用することです yoonixについて言及 -これはかなりありますが、ファイルのローテーション中に行が失われる可能性があります。また、syslogデーモンとしてrsyslogを使用しているLinuxシステムの場合、追加の作業はそれほど必要ありません。

syslog-ngファイル入力ソース もサポートし、rsyslogと同様の機能を備えています。


best解決策-これらのログを生成するアプリケーションを変更する必要があるにもかかわらず-直接syslogに記録することです。中間ステップやファイルなどを通過したくない場合-syslogはSYStemロガーであり、Unixプラットフォームでログを書き込むものsyslogに送信します。
残念ながら、これの実装は読者(およびアプリケーション開発者)の練習問題として残されており、開発者が存在しない、怠惰、または無能な場合は不可能かもしれません...

13
voretaq7

logstashfile 入力および syslog 出力とともに使用できます。

たとえば、監視する1つまたは複数のファイルとsyslogサーバー情報を使用して構成を作成します。

file-to-syslog.conf:

input { file { path => "/var/log/kern.log" } }
output {
    syslog {
        facility => "kernel"
        Host => "syslog.example.com"
        port => 514
        severity => "informational"
    }
}

Logstashの起動

Java -jar logstash-1.2.2-flatjar.jar agent -f file-to-syslog.conf
6
sciurus

これに取り組む方法はいくつかあります。しかし、very最初にすべきことは、syslog自体を使用してログを転送することです。

Syslog(およびsyslogの多くの代替)には、ロギングを別のアドレスの別のsyslogサーバーに転送する組み込みの機能があります。構成ファイルを変更し、ファシリティを転送するためのアドレスを追加することで、簡単に行うことができます。たとえば、次の行にこの行を追加します。

*.*    @192.168.1.1

...すべてのファシリティを192.168.1.1のマシンに転送します。(うまくいけば)サービスが実行されています。ここで示す例は、Debianの標準のsyslogサーバーであるrsyslogですが、他の多くのサーバーでも機能するはずです。 man syslogを使用したsyslogの実装については、ドキュメントを参照し、「転送」について何が書かれているかを確認してください。

リモートSyslogサーバーは、好きなものにすることができます。 Splunkなどの製品もあり、これらのログをWebダッシュボード、検索、イベント駆動型通知などを使用して1つのビューにうまく集約しています。詳細はこちらをご覧ください。 : http://www.splunk.com/ それがニーズを満たさない場合は、他のものを使用できます。 SQLデータベースにダンプするsyslogサーバーもあります!

もちろん、これを行うために独自のスクリプト/プログラム/サービスを作成することはできますが、それがあなたのために行われ、すでにあなたに与えられているときに、なぜ車輪を再発明するのですか?


編集:だから私は戻って質問を読み直し、いくつかのコメントに気づきました。それは次のように聞こえます:

  1. アプリケーションログを集計したい
  2. ルートにアクセスできません
  3. アプリケーションはテキストをどこかにダンプするだけです
  4. アプリケーションがローカルSyslogへの書き込み方法を認識していない
  5. アプリケーションのソースコードを制御できません

それでは、それぞれに順番に取り組みましょう:

  1. syslogはログを一緒に集約するためのものでした。好きなものを使えますが、昔からあるのには理由があります。これは十分にテストされ、よくデバッグされ、十分に文書化され、よく知られており、ほとんどの* nixプラットフォームでは、ほぼすべてのフレーバーでほぼ普遍的にサポートされています。
  2. ログを設定するためにrootにアクセスする必要はありません。 syslog APIへのアクセスのみが必要です。 rootは、syslogに書き込むための要件ではありません。この場合、特権を削除するすべてのサービスは、診断をログファイルに書き込むことができません。
  3. 再:テキストダンプ、これは正常です。ただし、サブシェルを使用して、STDERRおよびSTDOUTの出力をsyslog APIを呼び出すプログラムにパイプすることができるはずです。これはロケット科学ではなく、もろいというわけではなく、十分に文書化されています。実際、これが出力リダイレクトが存在する理由の1つでもあります。単一のシェルスクリプトに投げられる単純なコマンドは次のようになります。

    (my-application 2>&1 | my-syslog-shunt)&

  4. アプリケーションのソースコードを変更できる場合は、シャントを書き込み、テキスト出力をプレーンテキストファイルではなくsyslogにダンプする必要があります。これは難しいことではありません。あなたがするすべてはあなたが出力するであろう行を取り、呼び出しでそれらをラップすることです。しかしながら....

  5. ソースコードにまったくアクセスできない可能性があるため、これを行うことはできません。これは、上記の#3のようなものがうまく機能することを意味します。

1
Avery Payne

私は自分の質問に答えています。

スウォッチは機能したかもしれませんが、PerlのSys :: Syslogモジュールをホストで機能させることができず、ホストにインストールされている/ usr/bin/loggerはリモートサーバーへのロギングをサポートしていません(util-linux-ng- 2.17.2)。

したがって、最初に行ったのは、ロガープログラムがリモートロギングをサポートするutil-linux-2.20.1のソースコードをダウンロードすることでした。テストの結果、ログ行で許可される文字数に制限があることが明らかになりました。ソースコードを掘り下げたところ、ハードコードされた400文字の制限が見つかりました。 (私を信じていない場合は、任意のLinuxシステムで「strings/usr/bin/logger | grep 400」を実行してください)。

この制限は、Apacheタイプのロギング(nodejsを含む)では受け入れられないため、コードを変更して制限を4096に増やしました。その間、オプションを挿入できる新しいコマンドラインオプションも追加しました各ログ行の先頭のテキスト文字列。これは、Apacheで見られるように、nodejsログにホスト名が含まれていないためです。

この時点で、「tail -F -n 0 [logfile] | ./modified_logger ....」を使用してシェルスクリプトを実行でき、動作しました。しかし、これを監視(daemontools)から、またはバックグラウンドで実行することについていくつかの懸念がありました。パイプの片側または反対側が終了すると、パイプ全体が終了するリスクがあるためです。パフォーマンスについても(未テストですが)懸念がありました。

そのため、尾の機能とロガーの機能を単一の実行可能バイナリに組み合わせて、Unixパイプや外部プログラムを使用する必要を回避することにしました。これを行うには、gnu coreutilsのtail.cをハッキングし、変更したロガープログラムに必要なものを組み込みました。

結果は、「filelogger」と呼んでいる新しいバイナリ(117kサイズ)で、1つ以上のファイルを継続的に監視し、UDPまたはTCPを介して、ローカルまたはリモートのsyslogに新しい各行を記録します。それは魅力のように働きます。私は少しのベンチマークを行うことができ、vlanとそれらの間にいくつかの物理スイッチが存在するサブネット間で、syslog-ngを実行しているリモートサーバーに約3秒間で約17,000行(1.8MB)を記録しました。

プログラムを実行するには、次のようなことを実行します(フォアグラウンド、バックグラウンド、またはdaemontoolsで監視)。

./filelogger -t 'access' -d -p local1.info -n [remote loghost] -u/tmp/ignored -a $(hostname)/ tmp/myfile1/tmp/myfile2 ...

/ tmp/myfile1および/ tmp/myfile2は、監視されているファイルです。

「-a」は私が追加した新しいオプションです。この場合、各ログ行の先頭にローカルホスト名を挿入します。

この解決策は、質問をしたときに私が探していた解決策のタイプであり、結局のところ、自分で作るまで存在しませんでした。 :)

0