これまでの導入事例を通じて、trace-1、trace-2にSpring Cloud Sleuthの基本モジュールspring-cloud-starter-sleuthを導入し、各マイクロサービスのログ情報にトレース情報を追加する機能を実現しました。ただし、ログ ファイルは各サービス インスタンスのファイル システムに個別に保存されるため、ログ ファイルを表示するだけでリクエスト リンクを分析するのは依然として面倒な作業です。そのため、これらの追跡情報を一元的に収集、保存、検索するのに役立つツールも必要です。これらのトレースログを簡単に収集して保存できる、ELK プラットフォームなどのログベースの分析システムを導入することは良い選択です。同時に、必要に応じて、Trace ID に基づいて、対応するリクエスト リンクに関連する詳細なログを簡単に検索することもできます。 [[224659]] ELK プラットフォームは、主に ElasticSearch、Logstash、Kiabana という 3 つのオープンソースの無料ツールで構成されています。 - Elasticsearch は、分散、ゼロ構成、自動検出、自動インデックス シャーディング、インデックス複製メカニズム、RESTful インターフェイス、複数のデータ ソース、自動検索ロードなどの機能を備えたオープン ソースの分散検索エンジンです。
- Logstash は、ログを収集、フィルタリングし、後で使用するために保存できる完全にオープン ソースのツールです。
- Kibana もオープンソースの無料ツールです。 Logstash および ElasticSearch 用のログ分析に適した Web インターフェイスを提供し、重要なデータ ログの集約、分析、検索に役立ちます。
Spring Cloud Sleuth を ELK プラットフォームに統合する場合、ログ収集を担当する Logstash とのデータドッキングを実現するだけでよいため、Logstash 用に json 形式のログ出力を準備する必要があります。 Spring Boot アプリケーションはデフォルトで logback を使用してログを記録し、Logstash 自体にも logback ログ記録ツールのサポート ツールがあるため、logback 構成に logstash のアペンダーを直接追加して、ログを json 形式に簡単に変換して保存および出力することができます。 次に、クイックスタートの例に基づいて、Logstash のログ出力構成を実装する方法を詳しく紹介します。 - 次のように、pom.xml 依存関係に logstash-logback-encoder 依存関係を導入します。
- <依存関係>
- <groupId>net.logstash.logback</groupId>
- <artifactId>logstash-logback-encoder</artifactId>
- <バージョン>4.6</バージョン>
- </依存関係>
- project/resource ディレクトリに bootstrap.properties 構成ファイルを作成し、spring.application.name=trace-1 構成をこのファイルに移動します。 logback-spring.xml は application.properties の前にロードされるため、以前の構成 logback-spring.xml は spring.application.name プロパティを取得できません。そのため、このプロパティは最初にロードされる bootstrap.properties 構成ファイルに移動されます。
- project/resource ディレクトリに logback 構成ファイル logback-spring.xml を作成します。具体的な内容は以下のとおりです。
- <?xml バージョン = "1.0"エンコーディング = "UTF-8" ?>
- <構成>
- <include リソース = "org/springframework/boot/logging/logback/defaults.xml" />
-
- <springProperty スコープ = "コンテキスト" 名前= "springAppName"ソース = "spring.application.name" />
- <!
- <プロパティ名= "LOG_FILE"値 = "${BUILD_FOLDER:-build}/${springAppName}" />
- <!
- <プロパティ名= "CONSOLE_LOG_PATTERN"
- 値 = "%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){かすかな} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr([${springAppName:-},%X{X-B3-TraceId:-},%X{X-B3-SpanId:-},%X{X-Span-Export:-}]){黄色} %clr(${PID:- }){マゼンタ} %clr(---){かすかな} %clr([%15.15t]){かすかな} %clr(%-40.40logger{39}){シアン} %clr(:){かすかな} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}" />
-
- <!
- <アペンダー名= "console"クラス = "ch.qos.logback.core.ConsoleAppender" >
- <フィルタークラス= "ch.qos.logback.classic.filter.ThresholdFilter" >
- <レベル>情報</レベル>
- </フィルター>
- <エンコーダ>
- <パターン>${CONSOLE_LOG_PATTERN}</パターン>
- <charset>utf8</charset>
- </エンコーダ>
- </アペンダー>
-
- <!
- <アペンダー名= "logstash"クラス = "ch.qos.logback.core.rolling.RollingFileAppender" >
- <ファイル>${LOG_FILE}.json</ファイル>
- <rollingPolicy クラス = "ch.qos.logback.core.rolling.TimeBasedRollingPolicy" >
- <ファイル名パターン>${LOG_FILE}.json.%d{yyyy-MM-dd}.gz</ファイル名パターン>
- <maxHistory>7</maxHistory>
- </ローリングポリシー>
- <エンコーダクラス= "net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder" >
- <プロバイダー>
- <タイムスタンプ>
- <timeZone>UTC</timeZone>
- </タイムスタンプ>
- <パターン>
- <パターン>
- {
- 「重大度」 : 「%レベル」 、
- "サービス" : "${springAppName:-}" 、
- 「トレース」 : 「%X{X-B3-TraceId:-}」 、
- "スパン" : "%X{X-B3-スパンId:-}" ,
- "エクスポート可能" : "%X{X-Span-Export:-}" ,
- "pid" : "${PID:-}" 、
- "スレッド" : "%スレッド" ,
- 「クラス」 : 「%logger{40}」 、
- "残り" : "%メッセージ"
- }
- </パターン>
- </パターン>
- </プロバイダー>
- </エンコーダ>
- </アペンダー>
-
- <ルートレベル= "INFO" >
- <appender-ref ref= "コンソール" />
- <appender-ref ref= "logstash" />
- </ルート>
- </構成>
logstash のサポートは、主に logstash という名前のアペンダーを通じて実装されます。内容は複雑ではありません。主にログ情報をフォーマットします。デバッグと表示を容易にするために、まず json ログをファイルに出力します。 上記の変換が完了したら、クイック スタートの例を実行し、trace-1 へのインターフェイス アクセスを開始します。この時点で、trace-1 と trace-2 のプロジェクト ディレクトリの下にビルド ディレクトリが見つかります。それぞれのアプリケーションにちなんで名付けられた JSON ファイルが以下に作成されます。これらのファイルは、logback-spring.xml で設定された logstash という名前のアペンダーによって出力されるログ ファイルであり、次の形式で JSON ログを記録します。 - { "@timestamp" : "2016-12-04T06:57:58.970+00:00" 、 "severity" : "INFO" 、 "service" : "trace-1" 、 "trace" : "589ee5f7b860132f" 、 "span" : "a9e891273affb7fc" 、 "exportable" : "false" 、 "pid" : "19756" 、 "thread" : "http-nio-9101-exec-1" 、 "class" : "cdTraceApplication$$EnhancerBySpringCGLIB$$a9604da6" 、 "rest" : "===<call trace-1>===" }
- { "@timestamp" : "2016-12-04T06:57:59.061+00:00" 、 "severity" : "INFO" 、 "service" : "trace-1" 、 "trace" : "589ee5f7b860132f" 、 "span" : "2df8511ddf3d79a2" 、 "exportable" : "false" 、 "pid" : "19756" 、 "thread" : "http-nio-9101-exec-1" 、 "class" : "oscaAnnotationConfigApplicationContext" 、 "rest" : "org.springframework.context.annotation.AnnotationConfigApplicationContext@64951f38 を更新しています: 起動日 [Sun Dec 04 14:57:59 CST 2016]; 親: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@4b8c8f15" }
上記の方法で json ファイルを生成することに加えて、LogstashTcpSocketAppender を使用して、ログ コンテンツを TCP ソケット経由で logstash サーバーに直接出力することもできます。次に例を示します。 - <アペンダー名= "logstash"クラス = "net.logstash.logback.appender.LogstashTcpSocketAppender" >
- <宛先>127.0.0.1:9250</宛先>
- ...
- </アペンダー>
この記事の完全な例: 読者は、自分の好みに応じて、次の 2 つのリポジトリで trace-1 プロジェクトと trace-2 プロジェクトを表示することを選択できます。 - Github: https://github.com/dyc87112/SpringCloud-Learning/
- gitee: https://gitee.com/didispace/SpringCloud-Learning/
【この記事は51CTOコラムニスト「Zhai Yongchao」によるオリジナル記事です。転載の許可を得るには、51CTO を通じて著者に連絡してください。 この著者の他の記事を読むにはここをクリックしてください |