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


8

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

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

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



@yoonix:いいえ、しませんでしたが、私は:)に行きます
Michael Martinez

3
うーん、syslogはリモートのsyslogサーバーに送信できます。リモートサーバーに送信するようにローカルSyslogを構成します。次に、標準のsyslog呼び出しを介して、またはロガーなどを使用して、ローカルのsyslogにアクセスします。
Zoredache 2013年

4
なぜあなたは、名前付きパイプにログファイルを書き、彼らの方法の上でそれらを送信デーモンリスニングありませんserverfault.com/questions/189477/...
user9517

3
アプリを変更する必要はありません。アプリが書き込んでいるログファイルと同じ名前の名前付きパイプを配置するだけです。
user9517 2013年

回答:


13

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


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

syslog-ngと同様の機能を持つファイル入力ソースもサポートしますrsyslog


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


7
@MichaelMartinez rsyslogシステムで現在実行されている構成を変更します。2つのsyslogデーモンを実行しないでください。失礼なことではありませんが、間違った試みをやめる必要があります*:このシナリオに対する適切な解決策はすべて、サーバーでの管理(ルート)アクションまたはアプリの変更が必要です。あなたは、そうでない場合は、この質問は、組織内のどんなグループと現実との契約が問題になっているシステム上のルートを持っていることを顔に持っているつもりです ....(あなたが組織のポリシーを回避しようとしている) -トピックオフ
voretaq7を

5
@Michaelこれは、誰かが間違ったチームに修正の実装を強制しようとしていることを示しています。
Andrew B

4
@MichaelMartinez imho、それは技術的負債のレベルを壊滅させるかなり迅速なルートのように聞こえます。
Sirex 2013年

2
@Sirex。それが何であれ、それは物事の方法です。私は何万人もの従業員を抱える組織で働いており、そのほとんどが技術者(エンジニア、開発者、運用者など)です
Michael Martinez

5
私は推測する。一般的に私は長期的に自分が負った戦いに勝つことでメダルがないことを発見しました。技術的な借金がまとまると、皮肉にもビジネスに影響を与えます。私の経験では、部屋の象を避けるために熱心に働いた人々は、最終的には缶を運ぶことになりがちです。だから私はあなたのお尻をカバーし、誰かにこれの欠点を書面で同意してもらうと言います。
Sirex 2013年

6

ファイル入力およびsyslog出力でlogstashを使用できます。

たとえば、監視する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

+1。rsyslogのファイル入力を使用できない場合は、logstashが次善の策です。多くの点で、それは長期的にはより優れています。
Sirex 2013年

私はこれに精通していません。もしそれが私が必要とするものであれば、coreutilsとutil-linuxをハッキングする手間を省いたでしょう。
Michael Martinez

ええ、設定は次のようになります:pastebin.com/xeC9hxD3
Sirex

とてもかっこいいツールのように見えますが、ここで必要なものには間違いなく行き過ぎです。logstashは、Webインターフェースを備えた独自のサービスであり、Javaを必要とします。パフォーマンスを最適化するために軽量でフットプリントが小さいファイルロガーを引き続き使用します。...しかし、logstashを提案していただきありがとうございます。将来的には他の状況でも必要になる可能性があるためです。
Michael Martinez

ええ、それは瓶詰めのjrubyツールです。guiは実際には簡単にパッケージ化されているkibanaですが、実際には別のプロジェクトであるため、メッセージを解析するためだけに必要なわけではありません。基本的には伐採のスイスアーミーナイフです。入力と出力を定義し、途中でオプションでログを確認して、コンテキストを与えることができます。-ログデータに対してelasticsearchも使用したくない場合を除き、ITは多すぎる可能性があります。
Sirex 2013年

4

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

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

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

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

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


@slm:私はあなたが要求したように書き直しました
Michael Martinez

とても便利です、マイケルに感謝します。debian apt-get install用にパッケージ化する可能性はありますか?
joelparkerhenderson

@joelparkerhenderson。こんにちは、ジョエル。残念ながら、おそらくdebianを使用していないためではありません。バイナリをシステムにコピーして、実行されるかどうかを確認しましたか?
マイケルマルティネス

1

これに取り組む方法はいくつかあります。しかし、非常に、非常にあなたが最初にすべきことは次のとおりです。使用してログを転送するsyslogの自分自身を

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

*.*    @192.168.1.1

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

リモートSyslogサーバーは、好きなものにすることができます。Splunkのような製品さえあります:楽しく、ウェブダッシュボードを単一のビューにこれらのログを集約検索、イベント駆動型の通知、などなどあなたがより多くのここで見ることができ、http://www.splunk.com/ た場合は、それはあなたのニーズを満たさない、あなたは何か他のものを使うことができます。SQLデータベースにダンプするsyslogサーバーさえあります!

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


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

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

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

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

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

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

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


2つの理由:(1)すでに述べたように、問題のボックスにrootまたはsudoがなかったからです。(2)「ロガー」自体はリモートサーバーに転送できますが、ログ行ごとに400文字の制限があるため、Apacheログには適していません。とにかく、私はすでに私が必要とするものを正確に実行する(そして「ロガー」も改善する)カスタムソリューションをまとめました。"filelogger"については、ここで私の回答を参照してください
Michael Martinez

4. Syslogは、テキストを開いて書き込むことができる単なるファイルストリームではありません。私が書くシャントは、syslogがリッスンするUDPポートへのソケットを開く必要がありますか?
Noumenon 2018

1
@Noumenon、私はあなたの意図を完全に明確にしていませんが、ロガーコマンドを使用して実行できるプログラムログをシステムログにパイプしたいと思います。linux.die.net/man/1/logger
Avery Payne

@AveryPayneのようにRuntime.exec("logger ...")OK、ありがとう。
Noumenon 2018

0

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

スウォッチは機能していたかもしれませんが、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とそれらの間にいくつかの物理スイッチがあるサブネット間で約3秒で約17,000行(1.8MB)をsyslog-ngを実行しているリモートサーバーに記録しました。

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

./filelogger -t 'access' -d -p local1.info -n [リモートログホスト] -u / tmp / ignored -a $(ホスト名)/ tmp / myfile1 / tmp / myfile2 ...

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

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

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


私はおそらくこれをsourceforgeで利用できるようにするでしょう。非常に小さなフットプリントで、軽量で使いやすく、パフォーマンスが最適化されているという利点があります。メッセージテキストが読み込まれると、すべての処理はメモリバッファで行われ、直接ソケットに転送されます。
Michael Martinez


4
私は過酷にならないように努めていますが、私率直に言います。ひどいので、この解決策は存在しませんでした。組織内の他のグループとやり取りして正気な標準ソリューションを実装するのではなく、完全にサポートされていないコードをハッキングして、今後テスト/デバッグ/維持する必要があります。あなたは「それをしないでください」と言った50年以上の複合経験を簡単に無視しました-これがあなたの顔で爆破しないことを願っていますが、あなたは間違いなく、間違いなくここで間違っています...
voretaq7

1
ええ。右...これはオープンソースが前進する方法です、おい。みんながあなたのやり方でやったら、進歩はありません。GNU、Linux、そしてそれに基づくものすべてがどうやって生まれたと思いますか?私がここでやったようなことをしている人々。気分が良くなった場合は、私のコードをパッケージ管理システムに組み込むつもりです。このシステムでは、組織内の誰もが自由に使用、展開、および改善を望めます。
Michael Martinez

そして参考までに、それはひどい解決策ではありません。それどころか、それは非常に便利なツールです。先週私がオンラインで解決策を探していたとき、私は他の人々に出会い、この正確な機能をどこで見つけられるのかと尋ねました。
Michael Martinez
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.