高い同時実行性を必要とするビッグデータシナリオでは、Javaエラーログを効果的に分析することで、JavaアプリケーションのO&Mコストを削減できます。 Simple Log Serviceを使用して、Alibaba CloudサービスからJavaエラーログを収集し、データ変換機能を使用して収集したログを解析できます。
前提条件
Simple Log Service、Object Storage Service (OSS) 、Server Load Balancer (SLB) 、およびApsaraDB RDSのJavaエラーログが収集され、cloud_product_error_logという名前のLogstoreに保存されます。 詳細については、「Logtailを使用したログの収集」をご参照ください。
シナリオ
たとえば、OSSやSimple Log Serviceなどの複数のAlibaba Cloudサービスを使用して、application aという名前のJavaアプリケーションを開発したとします。 中国 (杭州) リージョンにcloud_product_erro_logという名前のLogstoreを作成し、Alibaba CloudサービスのAPI操作を呼び出したときに生成されるJavaエラーログを保存している必要があります。 Javaエラーを効率的に修正するには、Simple Log Serviceを使用して定期的にJavaエラーログを分析する必要があります。
上記の要件を満たすには、収集したログからログ時間、エラーコード、ステータスコード、サービス名、エラーメッセージ、リクエスト方法、およびエラー行番号を解析し、解析したログをエラー分析のために各クラウドサービスのLogstoreに送信する必要があります。
次の例は、生ログを示しています。
__source__:192.0.2.10
__tag__:__client_ip__:203.0.113.10
__tag__:__receive_time__:1591957901
__topic__:
message: 2021-05-15 16:43:35 ParameterInvalid 400
com.aliyun.openservices.log.exception.LogException:The body is not valid json string.
at com.aliyun.openservice.log.Client.ErrorCheck(Client.java:2161)
at com.aliyun.openservice.log.Client.SendData(Client.java:2312)
at com.aliyun.openservice.log.Client.PullLogsk(Client.java:1397)
at com.aliyun.openservice.log.Client.SendData(Client.java:2265)
at com.aliyun.openservice.log.Client.GetCursor(Client.java:1123)
at com.aliyun.openservice.log.Client.PullLogs(Client.java:2161)
at com.aliyun.openservice.log.Client.ErrorCheck(Client.java:2426)
at transformEvent.main(transformEvent.java:2559)
手順
アプリケーションAのエラーログは、Logtailを使用して収集され、cloud_product_error_log Logstoreに保存されます。 次に、エラーログが変換され、変換されたログがエラー分析のために各クラウドサービスのLogstoreに送信されます。 手順は次の手順で構成されています。
データ変換ステートメントを設計する: このステップでは、変換ロジックを分析し、変換ステートメントを記述します。
データ変換ジョブを作成する: このステップでは、エラー分析のためにクラウドサービスの異なるログストアにログを送信します。
データの照会と分析: このステップでは、各クラウドサービスのLogstoreでエラーログを分析します。
ステップ1: データ変換ステートメントを設計する
変換プロシージャ
エラーログを簡単に分析するには、次の操作を完了する必要があります。
ログ時間、エラーコード、ステータスコード、サービス名、エラーメッセージ、リクエストメソッド、およびエラー行番号をメッセージフィールドから抽出します。
各クラウドサービスのLogstoreにエラーログを送信します。
変換ロジック
この場合、生ログフィールドのログ時間、エラーコード、ステータスコード、サービス名、エラーメッセージ、リクエストメソッド、エラー行番号を分析し、抽出する各フィールドの正規表現を設計する必要があります。
構文の説明
regex_match関数を使用して、LogExceptionを含むログを照合します。 詳細については、「regex_match」をご参照ください。
ログにLogExceptionが含まれている場合、ログはSimple log Serviceエラーログの変換ルールに基づいて変換されます。 ログにOSSExceptionが含まれている場合、ログはOSSエラーログの変換ルールに基づいて変換されます。 詳細については、「e_switch」をご参照ください。
e_regex関数を使用して、各クラウドサービスのエラーログを解析します。 詳細については、「e_regex」をご参照ください。
メッセージフィールドを削除し、対応するクラウドサービスのLogstoreにエラーログを送信します。 詳細については、「e_drop_fields」および「e_outputおよびe_coutput」をご参照ください。
詳細については、正規表現のグループセクションをご参照ください。
Transformationステートメントの構文
次の例は、データ変換ステートメントの特定の構文を示しています。
e_switch(
regex_match(v("message"), r"LogException"),
e_compose(
e_regex(
"message",
"(?P<data_time>\S+\s\S+)\s(?P<error_code>[a-zA-Z]+)\s(?P<status>[0-9]+)\scom\.aliyun\.openservices\.log\.exception\.(?P<product_exception>[a-zA-Z]+)\:(?P<error_message>[a-zA-Z0-9:,\-\s]+)\.(\s+\S+\s\S+){5}\s+\S+\scom\.aliyun\.openservices\.log\.Client\.(?P<method>[a-zA-Z]+)\S+\s+\S+\stransformEvent\.main\(transformEvent\.java\:(?P<error_line>[0-9]+)\)",
),
e_drop_fields("message"),
e_output("sls-error"),
),
regex_match(v("message"), r"OSSException"),
e_compose(
e_regex(
"message",
"(?P<data_time>\S+\s\S+)\scom\.aliyun\.oss\.(?P<product_exception>[a-zA-Z]+)\:(?P<error_message>[a-zA-Z0-9,\s]+)\.\n\[ErrorCode\]\:\s(?P<error_code>[a-zA-Z]+)\n\[RequestId\]\:\s(?P<request_id>[a-zA-Z0-9]+)\n\[HostId\]\:\s(?P<host_id>[a-zA-Z-.]+)\n\S+\n\S+(\s\S+){3}\n\s+\S+\s+(.+)(\s+\S+){24}\scom\.aliyun\.oss\.OSSClient\.(?P<method>[a-zA-Z]+)\S+\s+\S+\stransformEvent\.main\(transformEvent\.java:(?P<error_line>[0-9]+)\)",
),
e_drop_fields("message"),
e_output("oss-error"),
),
)
ステップ2: データ変換ジョブを作成する
データ変換ページに移動します。
[プロジェクト] セクションで、管理するプロジェクトをクリックします。
On the タブで、管理するLogstoreをクリックします。
クエリと分析ページで、データ変換.
ページの右上隅で、必要なログデータの時間範囲を指定します。
[生ログ] タブにログデータが存在することを確認します。
コードエディターで、次のデータ変換ステートメントを入力します。
e_switch( regex_match(v("message"), r"LogException"), e_compose( e_regex( "message", "(?P<data_time>\S+\s\S+)\s(?P<error_code>[a-zA-Z]+)\s(?P<status>[0-9]+)\scom\.aliyun\.openservices\.log\.exception\.(?P<product_exception>[a-zA-Z]+)\:(?P<error_message>[a-zA-Z0-9:,\-\s]+)\.(\s+\S+\s\S+){5}\s+\S+\scom\.aliyun\.openservices\.log\.Client\.(?P<method>[a-zA-Z]+)\S+\s+\S+\stransformEvent\.main\(transformEvent\.java\:(?P<error_line>[0-9]+)\)", ), e_drop_fields("message"), e_output("sls-error"), ), regex_match(v("message"), r"OSSException"), e_compose( e_regex( "message", "(?P<data_time>\S+\s\S+)\scom\.aliyun\.oss\.(?P<product_exception>[a-zA-Z]+)\:(?P<error_message>[a-zA-Z0-9,\s]+)\.\n\[ErrorCode\]\:\s(?P<error_code>[a-zA-Z]+)\n\[RequestId\]\:\s(?P<request_id>[a-zA-Z0-9]+)\n\[HostId\]\:\s(?P<host_id>[a-zA-Z-.]+)\n\S+\n\S+(\s\S+){3}\n\s+\S+\s+(.+)(\s+\S+){24}\scom\.aliyun\.oss\.OSSClient\.(?P<method>[a-zA-Z]+)\S+\s+\S+\stransformEvent\.main\(transformEvent\.java:(?P<error_line>[0-9]+)\)", ), e_drop_fields("message"), e_output("oss-error"), ), )
クリックデータのプレビュー.
データ変換ジョブを作成します。
クリック変換ジョブとして保存.
[データ変換ジョブの作成] パネルでパラメーターを設定し、[OK] をクリックします。 下表にパラメーターを示します。
パラメーター
説明
ジョブ名
データ変換ジョブの名前。 例: テスト
権限付与方法
[デフォルトロール] を選択して、ソースLogstoreからデータを読み取ります。
ストレージターゲット
ターゲット名
保存先の名前。 例: sls-errorまたはoss-error。
対象リージョン
ターゲットプロジェクトが存在するリージョン。 例: 中国 (杭州) 。
対象プロジェクト
ターゲットLogstoreが属するプロジェクトの名前。
ターゲットストア
宛先Logstoreの名前。 例: sls-errorまたはoss-error。
権限付与方法
[デフォルトロール] を選択して、変換結果を宛先Logstoreに書き込みます。
処理範囲
時間範囲
[すべて] を選択します。
データ変換ジョブを作成した後、Simple Log Serviceはデフォルトでジョブのダッシュボードを作成します。 ダッシュボードでジョブのメトリックを表示できます。
[例外の詳細] グラフで、解析に失敗したログを表示し、正規表現を変更できます。
ログの解析に失敗した場合は、ログの重大度を警告として指定してログを報告できます。 データ変換ジョブは引き続き実行されます。
ログの重大度をERRORに指定してログをレポートすると、データ変換ジョブの実行が停止します。 この場合、データ変換ジョブが必要なすべてのタイプのエラーログを解析できるようになるまで、エラーの原因を特定し、正規表現を変更する必要があります。
ステップ3: エラーログの分析
生のエラーログが変換された後、エラーログを分析できます。 この例では、Simple Log ServiceのJavaエラーログのみが分析されます。
[プロジェクト] セクションで、管理するプロジェクトをクリックします。
左側のナビゲーションウィンドウで、[ログストレージ] をクリックします。 Logstoreリストで、管理するLogstoreをクリックします。
検索ボックスにクエリ文を入力します。
各リクエストメソッドのエラー数を計算するには、次のクエリステートメントを実行します。
* | SELECT COUNT(method) as m_ct, method GROUP BY method
PutLogs API操作の各エラーメッセージの発生回数を計算するには、次のクエリ文を実行します。
* | SELECT error_message,COUNT(error_message) as ct_msg, method WHERE method LIKE 'PutLogs' GROUP BY error_message,method
各エラーコードの発生回数を計算するには、次のクエリ文を実行します。
* | SELECT error_code,COUNT(error_code) as count_code GROUP BY error_code
各リクエストメソッドのエラー情報をログ時間で照会するには、次のクエリステートメントを実行します。
* | SELECT date_format(data_time, '%Y-%m-%d %H:%m:%s') as date_time,status,product_exception,error_line, error_message,method ORDER BY date_time desc
15分 (相対)時間範囲を指定します。
相対時間または時間枠を選択できます。 カスタムの時間範囲を指定することもできます。
説明クエリ結果には、指定された時間範囲より1分前または後に生成されたログが含まれる場合があります。
検索&分析クエリと分析の結果を表示します。