ビッグデータや高同時実行のシナリオで Java エラーログを分析することは、O&M コストの削減に役立ちます。Simple Log Service (SLS) は、Alibaba Cloud サービスから Java エラーログを収集し、データ変換を使用して解析します。
前提条件
SLS、OSS、SLB、および ApsaraDB RDS からの Java エラーログが収集され、`cloud_product_error_log` という名前の Logstore に保存されていること。詳細については、「Logtail を使用したログの収集」をご参照ください。
利用シーン
例えば、OSS や SLS などの複数の Alibaba Cloud サービスを使用して、アプリケーション A という名前の Java アプリケーションを開発したとします。これらのサービスへの API 呼び出しによって生成された Java エラーログを保存するために、中国 (杭州) リージョンに `cloud_product_error_log` という名前の Logstore を作成しました。Java のエラーを効率的に修正するには、SLS を使用して定期的にエラーログを分析する必要があります。
これらの要件を満たすために、収集されたログからログ時刻、エラーコード、ステータスコード、サービス情報、エラーメッセージ、リクエストメソッド、およびエラー行番号を解析します。その後、解析されたログを各サービスの 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)
ワークフロー
Logtail はアプリケーション A からエラーログを収集し、`cloud_product_error_log` という名前の Logstore に送信します。その後、ログはデータ変換を使用して処理され、分析のためにそれぞれの Logstore に配信されます。全体的なワークフローは次のとおりです:
-
データ変換文の設計:データを分析し、変換文を作成します。
-
データ変換ジョブの作成:エラー分析のために、サービスに基づいて Logstore にログを配信します。
-
データのクエリと分析:各サービスの Logstore でエラーログを分析します。
ステップ 1:データ変換文の設計
変換プロセス
エラーログを分析するには:
-
`message` フィールドからタイムスタンプ、エラーコード、ステータスコード、サービス情報、エラーメッセージ、リクエストメソッド、およびエラー行番号を抽出します。
-
エラーログを各サービスの Logstore に保存します。

変換ロジック
生ログ内のタイムスタンプ、エラーコード、ステータスコード、サービス情報、エラーメッセージ、リクエストメソッド、およびエラー行番号を分析します。次に、これらのフィールドを抽出するための正規表現を設計します。
構文リファレンス
-
`regex_match` 関数を使用して、ログエントリに `LogException` が含まれているかどうかを確認します。詳細については、「regex_match」をご参照ください。
-
ログが `LogException` に一致する場合、SLS エラーログの解析ルールに従って処理されます。`OSSException` に一致する場合、OSS エラーログのルールに従って処理されます。詳細については、「e_switch」をご参照ください。
-
`e_regex` 関数を使用して、対応するエラーログを正規表現で解析します。詳細については、「e_regex」をご参照ください。
-
元の `message` フィールドを削除し、解析されたデータを適切なサービスの Logstore に配信します。詳細については、「e_drop_fields」および「e_output」をご参照ください。
-
詳細については、「正規表現のグループ」をご参照ください。
構文分析
次の例は、正規表現を使用して SLS エラーログを解析する方法を示しています:
完全な変換構文は次のとおりです:
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:データ変換ジョブの作成
-
データ変換ページに移動します。
プロジェクトセクションで、目的のプロジェクトをクリックします。
[] タブで、目的の Logstore をクリックします。
-
クエリと分析ページで、[データ処理] をクリックします。
-
ページの右上隅で、ログデータの時間範囲を選択します。
[Rawデータ] タブでログが利用可能であることを確認してください。
-
エディターに、データ変換文を入力します。
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"), ), ) -
[データのプレビュー] をクリックします。
__source__: xxx __tag__:__client_ip__: xxx __tag__:__receive_time__: 1590978615 __topic__: data_time: 2020-05-16 18:30:06 error_code: AccessDenied error_line: 399 error_message: You are forbidden to list buckets host_id: xxx.oss-cn-hangzhou.aliyuncs.com method: getBucket product_exception: OSSException request_id: YGYLUM9LG2USA6M7HYUBT1L0 -
データ変換ジョブを作成します。
-
[データ処理の保存] をクリックします。
-
[データ処理タスクの作成] パネルで、次のパラメーターを設定し、[OK] をクリックします。
パラメーター
説明
ジョブ名
データ変換ジョブの名前。例えば、`test` と入力します。
認証方式
[Default Role] を選択して、ソース Logstore からデータを読み取る権限を付与します。
ストレージターゲット
ターゲット名
ストレージターゲットの名前。例えば、`sls-error` と `oss-error` を入力します。
ターゲットリージョン
送信先プロジェクトのリージョンを選択します。例えば、中国 (杭州) を選択します。
ターゲットプロジェクト
変換されたデータの送信先プロジェクト。
ターゲットストア
変換されたデータの送信先 Logstore。例えば、`sls-error` と `oss-error` を入力します。
認証方式
[デフォルトロール] を選択して、データ変換結果を送信先 Logstore に書き込む権限を付与します。
処理範囲
時間範囲
時間範囲として [すべて] を選択します。
データ変換ジョブを作成すると、SLS はデフォルトでジョブのダッシュボードを作成します。ダッシュボードでジョブのメトリックを表示できます。
[例外詳細] チャートには、解析に失敗したログエントリが表示され、正規表現の改良に役立ちます。
-
WARNING レベルのログは、ジョブを中断しない解析の失敗を示します。
-
ERROR レベルのログはジョブを中断します。問題を特定して解決し、ジョブがすべての種類のエラーログを解析できるようになるまで正規表現を修正してください。
-
ステップ 3:エラーログデータの分析
生のエラーログが変換された後、構造化データを分析できます。このセクションでは、SLS の Java エラーログを例として使用します。
プロジェクトセクションで、目的のプロジェクトをクリックします。

[] タブで、目的の Logstore をクリックします。

-
検索ボックスに、クエリ文を入力します。
-
各メソッドのエラー数をカウントします。
* | SELECT COUNT(method) as m_ct, method GROUP BY method -
`PutLogs` メソッドで最も一般的なエラーメッセージを検索します。
* | 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 -
エラーのタイムラインを作成して、API 呼び出しのエラー情報をリアルタイムで表示します。
* | 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 分の誤差が生じる場合があります。
-
[検索と分析] をクリックして、クエリと分析の結果を表示します。