web-dev-qa-db-ja.com

ログを解析せずにJavaアプリからELKにログを記録する

JavaアプリからElasticSearchにログを送信したいのですが、従来のアプローチでは、アプリを実行しているサーバーにLogstashをセットアップし、logstashにログファイルを解析させます(regexを使用)。 ..!)そしてそれらをElasticSearchにロードします。

Log4J(またはlogback)を設定して、ElasticSearchに非同期で送信できるログコレクターに直接目的の形式でログを記録するのではなく、この方法で行われる理由はありますか?アプリ自体が最初に目的の形式でログに記録できるのに、複数行のスタックトレースを処理する(そしてログ解析でCPUサイクルを消費する)ためにgrokフィルターをいじる必要があるのは私には気が狂っているようです。

接線方向に関連する注意点として、Dockerコンテナーで実行されているアプリの場合、1つのプロセスのみを実行する必要がある場合、ElasticSearchに直接ログを記録するのがベストプラクティスですか?

14
Rob

通常、Log4j/Logback /その他のアペンダーからElasticsearchに直接ログを記録することはお勧めできませんが、Logstashフィルターを記述して「通常の」人間が読める形式のJavaログは悪い考えもあります。私は https://github.com/logstash/log4j-jsonevent-layout Log4jの通常のファイルアペンダーにLogstashによるさらなる解析を必要としないJSONログを生成させることができるすべての場所で使用します。

2
Magnus Bäck

本当にその道を進みたいのであれば、 Elasticsearchアペンダー (または これ または これ他のもの のようなものを使用することをお勧めします)ログをESクラスターに直接送信します。

ただし、@ Vineeth Mohanが述べたのと同じ理由で、これに反対することをお勧めします。また、いくつか質問する必要がありますが、主にESクラスターが何らかの理由(OOM、ネットワークダウン、ESアップグレードなど)でダウンした場合はどうなりますか?

非同期性が存在する理由はたくさんありますが、その1つはアーキテクチャの堅牢性であり、ほとんどの場合、ログ解析でCPUサイクルを数回増やすよりもはるかに重要です。

また、公式のESディスカッションフォーラムで行われているこの主題について、 進行中のディスカッション があることにも注意してください。

8
Val

簡単な解決策が必要な場合は、このアペンダーをここに記述しました Log4J2 Elastic REST Appender 使用する場合。これには、に基づいてログイベントをバッファリングする機能があります。 Elasticに送信するまでの時間やイベント数(_bulk APIを使用して、すべてを一度に送信します)。MavenCentralに公開されているため、非常に簡単です。

他の人々がすでに述べているように、それを行う最良の方法は、ファイルに保存してから、ESに個別に出荷することです。ただし、時間/リソースが最適な方法で実装されるまで、何かをすばやく実行する必要がある場合は、価値があると思います。

0
Marcelo Grossi

また、 https://github.com/elastic/Java-ecs-logging もあり、log4j、log4j2、およびLogbackのレイアウトを提供します。これは非常に効率的で、Filebeatの構成はごくわずかです。

免責事項:私はこのライブラリの作者です。

0
Felix