1
1
---
2
2
title : ログ
3
- weight : 3
4
3
description : イベントの記録
5
- default_lang_commit : 9b5e318
4
+ weight : 3
5
+ default_lang_commit : e851eb6903ed768e9cf3f427df74a5ccd7739114
6
+ cSpell:ignore : filelogreceiver semistructured transformprocessor
6
7
---
7
8
8
- ** ログ** は、構造化(推奨)または非構造化された、メタデータを含む 、タイムスタンプ付きのテキストレコードです。
9
+ ** ログ** は、構造化(推奨)または非構造化された、任意のメタデータを含む 、タイムスタンプ付きのテキストレコードです。
9
10
すべてのテレメトリーシグナルの中で、ログは最も大きな遺産を持っています。
10
11
ほとんどのプログラミング言語には、組み込みのログ機能があるか、もしくはよく知られ、広く使われているログライブラリがあります。
11
- ログは独立したデータソースですが、スパンに添付することもできます。
12
- OpenTelemetryでは、分散トレースやメトリクスの一部でないデータはすべてログです。
13
- たとえば、_ イベント_ は特定の種類のログです。
14
- ログは多くの場合、操作への入力、操作の結果、その操作をサポートするメタデータなどの詳細なデバッグ/診断情報を含んでいます。
15
12
16
- トレースとメトリクスに関して、OpenTelemetryはゼロから設計するアプローチを取り、新しいAPIを指定し、このAPIの完全な実装を複数の言語SDKで提供します。
13
+ ## OpenTelemetry のログ {#opentelemetry-logs}
14
+
15
+ OpenTelemetry はログを作成するための独自の API や SDK を定義しません。
16
+ 代わりに、OpenTelemetry のログは、ログフレームワークやインフラコンポーネントから得られるログを指します。
17
+ OpenTelemetry SDK と自動計装は、複数のコンポーネントを活用しログを[ トレース] ( ../traces ) と関連付けます。
18
+
19
+ OpenTelemetry のログサポートは、既存のログと完全に互換性を持つように設計されており、追加のコンテキストを付与したり、さまざまなソースからのログを共通のフォーマットに解析・変換するための統一ツールキットを提供します。
20
+
21
+ ### OpenTelemetry コレクターの OpenTelemetry のログ {#opentelemetry-logs-in-the-opentelemetry-collector}
22
+
23
+ [ OpenTelemetry コレクター] ( /docs/collector/ ) はログを作業するための複数のツールを提供します。
24
+
25
+ - 既知の特定のログデータソースを解析する複数のレシーバー
26
+ - 任意のファイルからログを読み取り、異なるフォーマットの解析や正規表現の解析が可能な ` filelogreceiver `
27
+ - ネストされたデータの解析、構造のフラット化、値の追加/削除/更新などを実行できる ` transformprocessor ` などのプロセッサー
28
+ - OpenTelemetry のフォーマットでログデータを送信できるエクスポーター
29
+
30
+ OpenTelemetry を採用する最初のステップとして、汎用的なログエージェントとしてコレクターをデプロイがよく含まれます。
31
+
32
+ ### アプリケーションの OpenTelemetry {#opentelemetry-logs-for-applications}
33
+
34
+ アプリケーションにおいて、OpenTelemetry のログは任意のログライブラリやビルトインのログ機能を仕様して作成されます。
35
+ 自動計装を追加したりSDKを活用したりすると、OpenTelemetry は既存のログをアクティブなトレースやスパンと自動的に関連付け、それらの ID をログの本体に含めます。
36
+ つまり、OpenTelemetry はログとトレースを自動的に関連付けます。
37
+
38
+ ### 言語サポート {#language-support}
39
+
40
+ ログは OpenTelemetry 仕様の [ stable] ( /docs/specs/otel/versioning-and-stability/#stable ) シグナルです。
41
+ ログAPIとSDKの各言語固有の実装については、ステータスは以下の通りです。
42
+
43
+ {{% signal-support-table "logs" %}}
44
+
45
+ ## 構造化、非構造化、半構造化ログ {#structured-unstructured-and-semistructured-logs}
46
+
47
+ OpenTelemetry は構造化ログと非構造化ログを技術的に区別していません。
48
+ OpenTelemetry では既存のどのようなログも利用できます。
49
+ しかし、すべてのログフォーマットは等しく有用ではありません!
50
+ 特に、構造化ログは大規模な解析や分析がしやすいため、本番環境のオブザーバビリティに推奨されます。
51
+ 後述するセクションは構造化、非構造化、半構造化ログの違いを説明します。
52
+
53
+ ### 構造化ログ {#structured-logs}
54
+
55
+ 構造化ログは、一貫性のある機械が読みやすいフォーマットに従ったテキスト形式のログです。
56
+ アプリケーションにおいて、最も一般的なフォーマットの 1 つは JSON です。
57
+
58
+ ``` json
59
+ {
60
+ "timestamp" : " 2024-08-04T12:34:56.789Z" ,
61
+ "level" : " INFO" ,
62
+ "service" : " user-authentication" ,
63
+ "environment" : " production" ,
64
+ "message" : " User login successful" ,
65
+ "context" : {
66
+ "userId" : " 12345" ,
67
+ "username" : " johndoe" ,
68
+ "ipAddress" : " 192.168.1.1" ,
69
+ "userAgent" : " Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36"
70
+ },
71
+ "transactionId" : " abcd-efgh-ijkl-mnop" ,
72
+ "duration" : 200 ,
73
+ "request" : {
74
+ "method" : " POST" ,
75
+ "url" : " /api/v1/login" ,
76
+ "headers" : {
77
+ "Content-Type" : " application/json" ,
78
+ "Accept" : " application/json"
79
+ },
80
+ "body" : {
81
+ "username" : " johndoe" ,
82
+ "password" : " ******"
83
+ }
84
+ },
85
+ "response" : {
86
+ "statusCode" : 200 ,
87
+ "body" : {
88
+ "success" : true ,
89
+ "token" : " jwt-token-here"
90
+ }
91
+ }
92
+ }
93
+ ```
94
+
95
+ そして、インフラストラクチャーのコンポーネントには、Common Log Format(CLF) が一般的に利用されます。
17
96
18
- OpenTelemetryのログに対するアプローチは異なります。
19
- 既存のロギングソリューションは、言語や運用のエコシステムに広く普及しているので、OpenTelemetryは、それらのログ、トレースやメトリクスシグナル、そして、他のOpenTelemetryコンポーネント間の「ブリッジ」として機能します。
20
- 実際、ログのためのAPIは、この理由から「Logs Bridge API」と呼ばれています。
97
+ ``` text
98
+ 127.0.0.1 - johndoe [04/Aug/2024:12:34:56 -0400] "POST /api/v1/login HTTP/1.1" 200 1234
99
+ ```
21
100
22
- [ ログ仕様] [ logs specification ] には、この哲学の詳細が記載されています。
101
+ 異なる構造化ログのフォーマットが混在することも一般的です。
102
+ たとえば、Extended Log Format (ELF) は JSON と 共に CLF ログの空白区切りのデータが混在することがあります。
23
103
24
- OpenTelemetry でのロギングの仕組みを理解するために、コードの計装の一翼を担うコンポーネントのリストを見てみましょう。
104
+ ``` text
105
+ 192.168.1.1 - johndoe [04/Aug/2024:12:34:56 -0400] "POST /api/v1/login HTTP/1.1" 200 1234 "http://example.com" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36" {"transactionId": "abcd-efgh-ijkl-mnop", "responseTime": 150, "requestBody": {"username": "johndoe"}, "responseHeaders": {"Content-Type": "application/json"}}
106
+ ```
25
107
26
- ## ログアペンダー(Log Appender)/ブリッジ(Bridge) {#log-appender--bridge}
108
+ このログを最大限に活用するには、オブザーバビリティバックエンドの分析を簡単にするために、JSON と ELF に関連する部分の両方を共通したフォーマットに解析します。
109
+ [ OpenTelemetry コレクター] ( /docs/collector ) の ` filelogreceiver ` はこのようにログを分析する標準化された方法が含まれています。
110
+
111
+ 構造化ログはログの利用において推奨される方法です。
112
+ 構造化ログは一貫したフォーマットで出力されるため、解析が率直であり、OpenTelemetry コレクターでの前処理や他のデータとの関連付けがしやすく、そして最終的に Observability バックエンドでの解析が容易になります。
113
+
114
+ ### 非構造化ログ {#unstructured-logs}
115
+
116
+ 非構造化ログは一貫した構造に従わないログです。
117
+ 人が読みやすい場合が多く、開発において頻繁に利用されます。
118
+ しかし、大規模な分析と解析が非常に困難なため、本番環境のオブザーバビリティの目的に対して、非構造化ログの使用は推奨されません。
119
+
120
+ 以下は非構造化ログの例です。
121
+
122
+ ``` text
123
+ [ERROR] 2024-08-04 12:45:23 - Failed to connect to database. Exception: java.sql.SQLException: Timeout expired. Attempted reconnect 3 times. Server: db.example.com, Port: 5432
124
+
125
+ System reboot initiated at 2024-08-04 03:00:00 by user: admin. Reason: Scheduled maintenance. Services stopped: web-server, database, cache. Estimated downtime: 15 minutes.
126
+
127
+ DEBUG - 2024-08-04 09:30:15 - User johndoe performed action: file_upload. Filename: report_Q3_2024.pdf, Size: 2.3 MB, Duration: 5.2 seconds. Result: Success
128
+ ```
129
+
130
+ 本番環境において非構造化ログの蓄積と分析は可能ですが、機械が読みやすくするために大幅な分析や前処理が必要にある場合があります。
131
+ たとえば、上述した 3 つのログを解析するには、タイムスタンプを抽出するための正規表現やログメッセージの本文を一貫して抽出するためのカスタムパーサーが必要になります。
132
+ 通常、ログのバックエンドがタイムスタンプを基にログを並び替えたり整理したりするには、このような処理がもとめられます。
133
+ 非構造化ログを解析して分析に活用することは可能ですが、アプリケーションの標準ログフレームワークを経由して構造化ログに切り替えるよりも作業量が多くなる可能性があります。
134
+
135
+ ### 半構造化ログ {#semistructured-logs}
136
+
137
+ 半構造化ログとは、データを識別するために一定の一貫したパターンを使用し、機械が読みやすくしているものの、異なるシステム間でデータのフォーマットや区切り文字が統一されていないログのことを指します。
138
+
139
+ 以下は、準構造かログの例です。
140
+
141
+ ``` text
142
+ 2024-08-04T12:45:23Z level=ERROR service=user-authentication userId=12345 action=login message="Failed login attempt" error="Invalid password" ipAddress=192.168.1.1 userAgent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36"
143
+ ```
144
+
145
+ 機会が読みやすいですが、半構造化ログは大規模に分析を可能にするには、複数の異なるパーサーを必要になる場合があります。
146
+
147
+ ## OpenTelemetry ログコンポーネント {#opentelemetry-logging-components}
148
+
149
+ 以下の概念とコンポーネントのリストは、OpenTelemetry のロギングサポートを支えています。
150
+
151
+ ### ログアペンダー(Log Appender)/ブリッジ(Bridge) {#log-appender--bridge}
27
152
28
153
アプリケーション開発者としては、** Log Bridge API** はログアペンダー/ブリッジを構築するためのロギングライブラリ作者のために提供されているので、直接呼び出すべきではありません。
29
154
かわりに、好みのロギングライブラリを使い、OpenTelemetryのログレコードエクスポーターにログを出力できるログアペンダー(またはログブリッジ)を使うように設定するだけです。
30
155
31
156
OpenTelemetry言語SDKはこの機能を提供します。
32
157
33
- ## ロガープロバイダー {#logger-provider}
158
+ ### ロガープロバイダー {#logger-provider}
34
159
35
160
> ** Logs Bridge API** の一部であり、ロギングライブラリの作者である場合にのみ使用すべきです。
36
161
37
162
ロガープロバイダー( ` LoggerProvider ` と呼ばれることもある)は ` ロガー ` のファクトリーです。
38
163
ほとんどの場合、ロガープロバイダは一度初期化され、そのライフサイクルはアプリケーションのライフサイクルと一致します。
39
164
ロガープロバイダーの初期化には、リソースとエクスポーターの初期化も含まれます。
40
165
41
- ## ロガー {#logger}
166
+ ### ロガー {#logger}
42
167
43
168
> ** Logs Bridge API** の一部であり、ロギングライブラリの作者である場合にのみ使用すべきです。
44
169
45
170
ロガーはログレコードを作成します。ロガーはログプロバイダーから作成されます。
46
171
47
- ## ログレコードエクスポーター {#log-record-exporter}
172
+ ### ログレコードエクスポーター {#log-record-exporter}
48
173
49
174
ログレコードエクスポーターは、ログレコードをコンシューマーに送信します。
50
175
このコンシューマーは、デバッグや開発時間用の標準出力、OpenTelemetryコレクター、あるいは、お好みのオープンソースやベンダーのバックエンドです。
51
176
52
- ## ログレコード {#log-record}
177
+ ### ログレコード {#log-record}
53
178
54
179
ログレコードはイベントの記録を表します。
55
180
OpenTelemetryでは、ログレコードには2種類のフィールドがあります。
@@ -75,14 +200,7 @@ OpenTelemetryでは、ログレコードには2種類のフィールドがあり
75
200
76
201
ログレコードとログフィールドの詳細については、[ ログデータモデル] ( /docs/specs/otel/logs/data-model/ ) を参照してください。
77
202
78
- ## 言語サポート {#language-support}
79
-
80
- ログは OpenTelemetry 仕様の [ stable] ( /docs/specs/otel/versioning-and-stability/#stable ) シグナルです。
81
- ログAPIとSDKの各言語固有の実装については、ステータスは以下の通りです。
82
-
83
- {{% signal-support-table "logs" %}}
84
-
85
- ## 仕様 {#specification}
203
+ ### 仕様 {#specification}
86
204
87
205
OpenTelemetryのログについての詳細は、[ ログ仕様] [ logs specification ] を参照してください。
88
206
0 commit comments