高同時実行数・ビッグデータを扱うシナリオにおいて、Java エラーログを効果的に解析することで、Java アプリケーションの運用・保守(O&M)コストを削減できます。Simple Log Service は、Alibaba Cloud サービスから Java エラーログを収集し、データ変換機能を用いて収集されたログを解析します。
前提条件
SLS、OSS、SLB、RDS の Java エラーログを収集し、Logstore 名 `cloud_product_error_log` に格納済みである必要があります。詳細については、「Logtail を使用したログの収集」をご参照ください。
シナリオ
たとえば、OSS や Simple Log Service などの複数の Alibaba Cloud サービスを利用する Java アプリケーション「Application A」を開発したとします。このアプリケーションが Alibaba Cloud サービスの API オペレーションを呼び出した際に生成される Java エラーログを、中国 (杭州) リージョンの Logstore `cloud_product_error_log` に格納しています。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)
全体手順
Logtail が Application A のエラーログを収集し、Logstore `cloud_product_error_log` に格納します。その後、エラーログをデータ変換し、変換後のログを各クラウドサービスに対応する Logstore へ送信してエラー分析を行います。全体の手順は以下のとおりです:
-
データ変換ステートメントの設計:変換ロジックを分析し、変換ステートメントを作成します。
-
データ変換ジョブの作成:ログを各クラウドサービスの Logstore へ送信し、エラー分析を行います。
-
データのクエリと分析:各クラウドサービスの Logstore でエラーログを分析します。
ステップ 1:データ変換ステートメントの設計
変換手順
エラーログを容易に分析するため、以下の操作を行います:
-
`message` フィールドからログ時刻、エラーコード、状態コード、サービス名、エラーメッセージ、リクエストメソッド、エラー発生行番号を抽出します。
-
エラーログを各クラウドサービスに対応する Logstore へ送信します。

変換ロジックの分析
生ログフィールドからログ時刻、エラーコード、状態コード、サービス名、エラーメッセージ、リクエストメソッド、エラー発生行番号を分析できます。その後、各抽出対象フィールドに対して正規表現を設計します。
構文の詳細
-
`regex_match` 関数を使用して、`LogException` を含むログをマッチさせます。詳細については、「regex_match」をご参照ください。
-
ログが `LogException` にマッチした場合は、Simple Log Service のエラーログ解析ルールで処理します。ログが `OSSException` にマッチした場合は、OSS のエラーログ解析ルールで処理します。詳細については、「e_switch」をご参照ください。
-
`e_regex` 関数を使用して、各クラウドサービスのエラーログを解析します。詳細については、「e_regex」をご参照ください。
-
メッセージフィールドを削除し、対応するプロダクトの Logstore にログを配信します。詳細については、「e_drop_fields」と「e_outputLogStoreut」をご参照ください。
-
詳細については、「正規表現 - グループ」をご参照ください。
変換構文の分析
以下に、正規表現を用いた 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 をクリックします。
-
クエリと分析ページで、データ変換 をクリックします。
-
ページ右上隅で、時間範囲を選択します。
[生ログ] タブにログデータが存在することを確認してください。
-
コードエディタに、以下のデータ変換ステートメントを入力します:
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 をクリックします。パラメーターの説明は以下の表をご覧ください。
パラメーター
説明
ジョブ名
データ変換ジョブの名前です。例:`test`。
認証方法
ソース Logstore からデータを読み取るには、デフォルトロール を選択します。
ストレージターゲット
ターゲット名
ストレージ送信先の名前です。例:`sls-error` または `oss-error`。
送信先リージョン
送信先プロジェクトが存在するリージョンです。例:中国 (杭州)。
対象プロジェクト
データ変換結果を格納する対象プロジェクトの名前です。
対象 Logstore
データ変換結果を格納する送信先 Logstore の名前です。例:`sls-error` または `oss-error`。
認証方法
送信先 Logstore へ変換結果を書き込むには、デフォルトロール を選択します。
処理範囲
時間範囲
すべて を選択します。
データ変換ジョブを作成すると、Simple Log Service はデフォルトでそのジョブ専用のダッシュボードを作成します。ダッシュボード上でジョブのメトリックを確認できます。
[例外詳細] チャートで、解析に失敗したログを表示できます。その後、正規表現を修正できます。
-
ログの解析に失敗した場合、ログの重大度を `WARNING` に設定してレポートできます。この場合、データ変換ジョブは継続して実行されます。
-
ログの重大度を `ERROR` に設定してレポートした場合、データ変換ジョブは停止します。この場合、エラーの原因を特定し、正規表現を修正して、すべての種類のエラーログを解析できるようにする必要があります。
-
ステップ 3:エラーログデータの分析
生のエラーログが変換された後、分析を行うことができます。本例では、Simple Log Service の 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 分です。
-
クエリ/分析 をクリックして、クエリおよび分析結果を表示します。