ELKとは何ですか? ELK は、Elastic が提供するログ収集およびフロントエンド表示ソリューションの完全なセットです。ElasticSearch、Logstash、Kibana という 3 つの製品の頭字語です。 Logstash はログのフィルタリングやログのフォーマットなどのログ処理を担当し、ElasticSearch は強力なテキスト検索機能を備えているため、ログの保存コンテナとして機能します。Kibana はフロントエンドの表示を担当します。 ELK アーキテクチャは次のとおりです。 Filebeat は、さまざまなクライアントからログを収集し、それらを Logstash に渡して統合処理するために追加されます。 エルク建設 ELK は 3 つの製品で構成されているため、これら 3 つの製品を順番にインストールすることを選択できます。 ここでは、Docker を使用して ELk をインストールすることを選択します。 ELk の Docker インストールは、これら 3 つの製品のイメージを個別にダウンロードして実行することもできますが、今回は elk の 3 in 1 イメージを使用して直接インストールします。 そのため、まずは Docker の動作環境があることを確認する必要があります。Docker の動作環境の構築については、https://blog.csdn.net/qq13112... を参照してください。 画像をプルする Docker 環境ができたら、サーバー上でコマンドを実行します。 このコマンドは、Docker リポジトリから elk three-in-one イメージをダウンロードします。合計サイズは 2G を超えます。ダウンロード速度が遅すぎる場合は、Docker リポジトリのソース アドレスを国内のソース アドレスに置き換えることができます。 ダウンロードが完了したら、画像を確認します。 Logstash の設定 ログ入力用に、 入力{ ビート { ポート => 5044 } } Logstash から ElasticSearch にログを出力するための新しい output.conf を作成します。 出力{ エラスティックサーチ ホスト => ["localhost"] manage_template => false インデックス => "%{[@metadata][beat]}" } } ここでの コンテナの実行 イメージを入手したら、直接起動できます。 -d はコンテナをバックグラウンドで実行することを意味します。 -p はホスト ポート: コンテナ ポートを意味します。つまり、コンテナで使用されるポートをホストのポートにマッピングします。ElasticSearch のデフォルト ポートは 9200 と 9300 です。私のマシンではすでに 3 つの ElasticSearch インスタンスが実行されているため、マッピング ポートはここで変更されます。 -v は、ホスト ファイル|フォルダー:コンテナ ファイル|フォルダーを意味します。ここでは、コンテナの再起動後にデータが失われないように、コンテナ内の elasticsearch データはホストの --name はコンテナに名前を付けることを意味します。名前を付けると、後でコンテナを操作しやすくなります。 以前に ElasticSearch を構築したことがある場合は、構築プロセスでさまざまなエラーが発生することがわかりますが、docker を使用して elk を構築するプロセスではそれらのエラーは発生しません。 実行後にコンテナを確認します。 コンテナのログを表示します。 コンテナを入力します: 設定を変更した後、コンテナを再起動します。 キナバを見る ブラウザにhttp://my_host:5601/と入力してください ファイルビートのセットアップ Filebeat はデータを収集し、Logstash または ElasticSearch にレポートするために使用されます。ログを収集する必要があるサーバーに Filebeat をダウンロードし、使用するために解凍します。 設定ファイルを変更する filebeat を入力し、filebeat.yml を変更します。 ファイルビートプロスペクター: - タイプ: ログ #設定を有効にするにはtrueに設定する必要がありますenabled: true パス: #収集するログパスを設定します - /var/log/*.log #タグを追加して後で分類に使用できます: ["my_tag"] #ElasticSearch型に対応 ドキュメントタイプ: my_type セットアップ.kibana: #kibana の IP とポートは kibana:5601 です ホスト: "" 出力.logstash: #logstashのIPとポートはlogstash:5044です ホスト: [""] #trueに設定する必要があります。そうしないと有効になりません。enabled: true #FilebeatからElasticSearchに直接データを収集したい場合は、output.elasticsearchの関連設定を行うことができます。 Filebeatを実行する 走る: この時点で、Filebeat が設定されたパスの下にあるログを Logstash に送信し、その後 elk で Logstash がデータを処理した後に ElasticSearch に送信することがわかります。しかし、私たちがやりたいのは elk を通じてデータ分析を実行することなので、ElasticSearch にインポートされるデータは JSON 形式である必要があります。 これは以前の単一ログの形式です: 2019-10-22 10:44:03.441 INFO rmjk.interceptors.IPInterceptor 行:248 - {"clientType":"1","deCode":"0fbd93a286533d071","eaType":2,"eaid":191970823383420928,"ip":"xx.xx.xx.xx","model":"HONOR STF-AL10","osType":"9","path":"/applicationEnter","result":5,"session":"ef0a5c4bca424194b29e2ff31632ee5c","timestamp":1571712242326,"uid":"130605789659402240","v":"2.2.4"} インポート後の分析が難しかったので、Logstash のフィルターで grok を使ってログを JSON 形式に加工してから ElasticSearch にインポートしようと思いましたが、ログのパラメータが固定されていなかったので難しすぎました。そこで、ログを直接 JSON 形式にして Filebeat で送信する Logback に切り替えました。 ログバック構成 私のプロジェクトは Spring Boot です。プロジェクトに依存関係を追加します。 <依存関係> <グループ ID>net.logstash.logback</グループ ID> <artifactId>logstash-logback-encoder</artifactId> <バージョン>5.2</バージョン> </依存関係> 次に、プロジェクトのリソース ディレクトリに logback.xml を追加します。 <?xml バージョン="1.0" エンコーディング="UTF-8"?> <構成> <!-- 例: 1. ログ レベルとファイル ログ レコードは階層的に記録されます。レベルはログ ファイル名に対応します。異なるレベルのログ情報は、異なるログ ファイルに記録されます。たとえば、エラー レベルは log_error_xxx.log または log_error.log (このファイルは現在のログ ファイル) に記録され、log_error_xxx.log はアーカイブ ログです。 ログファイルは日付ごとに記録されます。ログファイルのサイズが同じ日に2M以上になった場合は、0、1、2などの順序で名前が付けられます。例:log-level-2013-12-21.0.log 他のレベルのログ記録でも同様です。 2. ファイル パスを開発およびテストに使用する場合は、Eclipse でプロジェクトを実行し、相対パス ../logs を使用して Eclipse インストール パス内の logs フォルダーを検索します。 Tomcatにデプロイされている場合は、Tomcat 3のログファイル内にあります。Appender FILEERROR はエラー レベルに対応し、ファイル名は log-error-xxx.log の形式で命名されます。 FILEWARN は警告レベルに対応し、ファイル名は log-warn-xxx.log の形式で命名されます。 FILEINFO は情報レベルに対応し、ファイル名は log-info-xxx.log の形式で命名されます。 FILEDEBUG はデバッグ レベルに対応し、ファイル名は log-debug-xxx.log の形式で命名されます。 stdout は開発とテストの便宜のためにコントロールにログ情報を出力します --> <contextName>サービス</contextName> <プロパティ名="LOG_PATH" 値="logs"/> <!-- システム ログ ディレクトリを設定します --> <プロパティ名="APPDIR" 値="doctor"/> <!-- ロガー、日付ローリング レコード --> <アペンダー名="FILEERROR" クラス="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 記録されるログ ファイルのパスとファイル名 --> <ファイル>${LOG_PATH}/${APPDIR}/log_error.log</ファイル> <!-- ロガーのローリング戦略、日付とサイズによる記録 --> <ローリングポリシークラス="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- アーカイブされたログ ファイルのパス。たとえば、今日は 2013-12-21 のログです。現在書き込まれているログ ファイルのパスは、file ノードで指定します。このファイルと file で指定したファイル パスを別のパスに設定して、現在のログ ファイルまたはアーカイブされたログ ファイルを別のディレクトリに配置することもできます。 2013-12-21 のログ ファイルは、fileNamePattern によって指定されます。 %d{yyyy-MM-dd} は日付の形式を指定し、%i はインデックスを指定します --> <ファイル名パターン>${LOG_PATH}/${APPDIR}/error/log-error-%d{yyyy-MM-dd}.%i.log</ファイル名パターン> <!-- ログ記録に加えて、ログ ファイルも 2 MB を超えないように構成されています。2 MB を超えると、ログ ファイルはインデックス 0 から始まります。 ログファイルに名前を付けます。例: log-error-2013-12-21.0.log --> <timeBasedFileNamingAndTriggeringPolicy クラス="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <最大ファイルサイズ>2MB</最大ファイルサイズ> </timeBasedFileNamingAndTriggeringPolicy> </ローリングポリシー> <!-- ログを追加 --> <append>真</append> <!-- ログファイルの形式 --> <エンコーダークラス="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger 行:%-3L - %msg%n</pattern> <charset>utf-8</charset> </エンコーダ> <!-- このログファイルは情報レベルのみを記録します --> <フィルタークラス="ch.qos.logback.classic.filter.レベルフィルター"> <level>エラー</level> <onMatch>承認</onMatch> <onMismatch>拒否</onMismatch> </フィルター> </アペンダー> <!-- ロガー、日付ローリング レコード --> <アペンダー名="FILEWARN" クラス="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 記録されるログ ファイルのパスとファイル名 --> <ファイル>${LOG_PATH}/${APPDIR}/log_warn.log</ファイル> <!-- ロガーのローリング戦略、日付とサイズによる記録 --> <ローリングポリシークラス="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- アーカイブされたログ ファイルのパス。たとえば、今日は 2013-12-21 のログです。現在書き込まれているログ ファイルのパスは、file ノードで指定します。このファイルと file で指定したファイル パスを別のパスに設定して、現在のログ ファイルまたはアーカイブされたログ ファイルを別のディレクトリに配置することもできます。 2013-12-21 のログ ファイルは、fileNamePattern によって指定されます。 %d{yyyy-MM-dd} は日付の形式を指定し、%i はインデックスを指定します --> <ファイル名パターン>${LOG_PATH}/${APPDIR}/warn/log-warn-%d{yyyy-MM-dd}.%i.log</ファイル名パターン> <!-- ログ記録に加えて、ログ ファイルも 2 MB を超えないように構成されています。2 MB を超えると、ログ ファイルはインデックス 0 から始まります。 ログファイルに名前を付けます。例: log-error-2013-12-21.0.log --> <timeBasedFileNamingAndTriggeringPolicy クラス="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <最大ファイルサイズ>2MB</最大ファイルサイズ> </timeBasedFileNamingAndTriggeringPolicy> </ローリングポリシー> <!-- ログを追加 --> <append>真</append> <!-- ログファイルの形式 --> <エンコーダークラス="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger 行:%-3L - %msg%n</pattern> <charset>utf-8</charset> </エンコーダ> <!-- このログファイルは情報レベルのみを記録します --> <フィルタークラス="ch.qos.logback.classic.filter.レベルフィルター"> <level>警告</level> <onMatch>承認</onMatch> <onMismatch>拒否</onMismatch> </フィルター> </アペンダー> <!-- ロガー、日付ローリング レコード --> <アペンダー名="FILEINFO" クラス="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 記録されるログ ファイルのパスとファイル名 --> <ファイル>${LOG_PATH}/${APPDIR}/log_info.log</ファイル> <!-- ロガーのローリング戦略、日付とサイズによる記録 --> <ローリングポリシークラス="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- アーカイブされたログ ファイルのパス。たとえば、今日は 2013-12-21 のログです。現在書き込まれているログ ファイルのパスは、ファイル ノードによって指定されます。このファイルと、ファイルによって指定されたファイル パスを異なるパスに設定して、現在のログ ファイルまたはアーカイブされたログ ファイルを異なるディレクトリに配置することができます。 2013-12-21 のログ ファイルは、fileNamePattern によって指定されます。 %d{yyyy-MM-dd} は日付の形式を指定し、%i はインデックスを指定します --> <ファイル名パターン>${LOG_PATH}/${APPDIR}/info/log-info-%d{yyyy-MM-dd}.%i.log</ファイル名パターン> <!-- ログ記録に加えて、ログ ファイルも 2 MB を超えないように構成されています。2 MB を超えると、ログ ファイルはインデックス 0 から始まります。 ログファイルに名前を付けます。例: log-error-2013-12-21.0.log --> <timeBasedFileNamingAndTriggeringPolicy クラス="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <最大ファイルサイズ>2MB</最大ファイルサイズ> </timeBasedFileNamingAndTriggeringPolicy> </ローリングポリシー> <!-- ログを追加 --> <append>真</append> <!-- ログファイルの形式 --> <エンコーダークラス="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger 行:%-3L - %msg%n</pattern> <charset>utf-8</charset> </エンコーダ> <!-- このログファイルは情報レベルのみを記録します --> <フィルタークラス="ch.qos.logback.classic.filter.レベルフィルター"> <level>情報</level> <onMatch>承認</onMatch> <onMismatch>拒否</onMismatch> </フィルター> </アペンダー> <アペンダー名="jsonLog" クラス="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 記録されるログ ファイルのパスとファイル名 --> <ファイル>${LOG_PATH}/${APPDIR}/log_IPInterceptor.log</ファイル> <ローリングポリシークラス="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <ファイル名パターン>${LOG_PATH}/${APPDIR}/log_IPInterceptor.%d{yyyy-MM-dd}.log</ファイル名パターン> </ローリングポリシー> <エンコーダークラス="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder"> <jsonFactoryDecorator クラス="net.logstash.logback.decorate.CharacterEscapesJsonFactoryDecorator"> <エスケープ> <ターゲット文字コード>10</ターゲット文字コード> <エスケープシーケンス>\u2028</エスケープシーケンス> </エスケープ> </jsonファクトリデコレータ> <プロバイダー> <パターン> <パターン> { "タイムスタンプ":"%date{ISO8601}", "uid":"%mdc{uid}", "リクエストIP":"%mdc{ip}", "id":"%mdc{id}", "クライアントタイプ":"%mdc{クライアントタイプ}", "v":"%mdc{v}", "deCode":"%mdc{deCode}", "データID":"%mdc{データID}", "データ型":"%mdc{データ型}", "vid":"%mdc{vid}", "しました":"%mdc{しました}", "cid":"%mdc{cid}", "タグID":"%mdc{タグID}" } </パターン> </パターン> </プロバイダー> </エンコーダ> </アペンダー> <!-- カラーログ --> <!-- カラーログが依存するレンダリングクラス --> <変換ルール conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/> <変換ルール 変換ワード="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/> <変換ルール 変換ワード="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/> <!-- カラーログ形式 --> <プロパティ名="CONSOLE_LOG_PATTERN" 値="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){かすかな} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){マゼンタ} %clr(---){かすかな} %clr([%15.15t]){かすかな} %clr(%-40.40logger{39}){シアン} %clr(:){かすかな} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/> <アペンダー名="STDOUT" クラス="ch.qos.logback.core.ConsoleAppender"> <!--エンコーダのデフォルト設定はPatternLayoutEncoderです--> <エンコーダ> <パターン>${CONSOLE_LOG_PATTERN}</パターン> <charset>utf-8</charset> </エンコーダ> <!-- このログ アペンダーは開発用です。最低レベルのみ設定されています。コンソールによって出力されるログ レベルは、このレベルのログ情報以上です --> <フィルタークラス="ch.qos.logback.classic.filter.ThresholdFilter"> <level>デバッグ</level> </フィルター> </アペンダー> <!-- ログ操作動作がある場合にプロジェクト内のパッケージのログ レベルを指定します --> <!-- rmjk.dao.mappe はルート パッケージです。つまり、このルート パッケージの下にあるすべてのログ操作には DEBUG 権限があります --> <!-- レベルは [高から低の順] FATAL > ERROR > WARN > INFO > DEBUG > TRACE --> <ロガー名="rmjk.dao.mapper" レベル="DEBUG"/> <ロガー名="rmjk.service" レベル="DEBUG"/> <!--ログを表示--> <ロガー名="org.springframework.jdbc.core" 加法性="false" レベル="DEBUG"> <アペンダー参照 ref="STDOUT"/> <appender-ref ref="FILEINFO"/> </ロガー> <!-- json ログを印刷 --> <logger name="IPInterceptor" レベル="info" 付加性="false"> <appender-ref ref="jsonLog"/> </ロガー> <!-- 実稼働環境では、ログ ファイルが多すぎることやプログラムのパフォーマンスに影響が及ばないように、このレベルを適切なレベルに設定してください --> <ルートレベル="INFO"> <アペンダー参照 ref="FILEERROR"/> <appender-ref ref="FILEWARN"/> <appender-ref ref="FILEINFO"/> <!-- 本番環境では stdout と testfile を削除してください --> <アペンダー参照 ref="STDOUT"/> </ルート> </構成> 重要なポイントは次のとおりです。 <logger name="IPInterceptor" レベル="info" 付加性="false"> <appender-ref ref="jsonLog"/> </ロガー> 印刷する必要があるファイルに slf4j を導入します。 プライベート静的最終ロガー LOG = LoggerFactory.getLogger("IPInterceptor"); 印刷する情報をMDCに入力します。 MDC.put("ip", ipアドレス); MDC.put("path", servletPath); MDC.put("uid", paramMap.get("uid") == null ? "" : paramMap.get("uid").toString()); このとき、 Logstash構成の変更
入力{ ビート { ポート => 5044 コーデック => "json" } } 設定が変更されたので、elk を再起動します。 このように、ログが生成されると、Filebeat を使用して elk にインポートし、Kibana を使用してログを分析できます。 以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。 以下もご興味があるかもしれません:
|
1. vertical-align プロパティは次の効果を実現します。 vertical-alig...
序文一部の CSS 相互作用の影響により、要素に設定されたz-index実際のサイズに応じて重ね合わ...
私が最も頻繁に使用するコマンドは次の通りです:選択肢CDギットls ssh須藤数週間前、私はこの R...
シナリオ会社のプロジェクトはDockerでデプロイされています。原因不明ですが、コンテナが時々停止し...
一部の障害コード テーブルでは、履歴またはパフォーマンス上の理由から、次の設計パターンが使用されます...
1. 前提条件1. プロジェクトが展開されました2. Dockerはすでにインストールされている2...
mysql の IN はインデックスを無効にしますか?しませんよ! 結果をご覧ください: mysq...
Nextcloud は、オープンソースで無料のプライベート クラウド ストレージ ネットワーク ディ...
目次序文ブラウザコンパイル版ローカルプリコンパイルバージョン要約する参照する序文vue3サンドボック...
並べ替えクエリ (order by)電子商取引の場合: 今日完了したすべての注文を表示し、取引金額に...
目次1. はじめに2. プロトタイプチェーン継承3. コンストラクタの継承4. 組み合わせ継承1. ...
My97DatePicker は非常に柔軟で使いやすい日付コントロールです。使い方はとても簡単です。...
では、ドメイン名を登録して仮想ホストを購入した後、IE でドメイン名を入力して Web サイトを開く...
目次MySQL フェデレーテッド クエリ実行戦略。実行計画フェデレーテッドクエリオプティマイザーMy...
目次1. ブリッジを設定し、検証のためにパケットをキャプチャする1. ブリッジデバイスとセッションを...