> Source: https://www.ymotongpoo.com/works/oteps/logs/otep-0097/


# OTEP-0097: ログのデータモデル

OpenTelemetryが理解するログレコードのためのデータモデルを導入します。

## 目次 {#table-of-contents}

* [動機](#motivation)
* [設計上の注記](#design-notes)
  * [要件](#requirements)
  * [フィールドの種類](#field-kinds)
* [ログおよびイベントレコードの定義](#log-and-event-record-definition)
  * [フィールド: `Timestamp`](#field-timestamp)
  * [トレースコンテキストフィールド](#trace-context-fields)
    * [フィールド: `TraceId`](#field-traceid)
    * [フィールド: `SpanId`](#field-spanid)
    * [フィールド: `TraceFlags`](#field-traceflags)
  * [重大度フィールド](#severity-fields)
    * [フィールド: `SeverityText`](#field-severitytext)
    * [フィールド: `SeverityNumber`](#field-severitynumber)
    * [`SeverityNumber` のマッピング](#mapping-of-severitynumber)
    * [逆マッピング](#reverse-mapping)
    * [エラーのセマンティクス](#error-semantics)
    * [重大度の表示](#displaying-severity)
    * [重大度の比較](#comparing-severity)
  * [フィールド: `Name`](#field-name)
  * [フィールド: `Body`](#field-body)
  * [フィールド: `Resource`](#field-resource)
  * [フィールド: `Attributes`](#field-attributes)
* [ログレコードの例](#example-log-records)
* [OTEPの議論中に解決された疑問](#questions-resolved-during-otep-discussion)
  * [`TraceFlags` 対 `TraceParent` と `TraceState`](#traceflags-vs-traceparent-and-tracestate)
  * [重大度フィールド](#severity-fields-1)
  * [`Timestamp` の要件](#timestamp-requirements)
  * [セキュリティログ](#security-logs)
* [代替設計](#alternate-design)
* [先行技術](#prior-art)
  * [RFC5424 Syslog](#rfc5424-syslog)
  * [Fluentd Forwardプロトコルモデル](#fluentd-forward-protocol-model)
* [付録A. マッピング例](#appendix-a-example-mappings)
  * [RFC5424 Syslog](#rfc5424-syslog-1)
  * [Windowsイベントログ](#windows-event-log)
  * [SignalFxイベント](#signalfx-events)
  * [Splunk HEC](#splunk-hec)
  * [Log4j](#log4j)
  * [Zap](#zap)
  * [Apache HTTPサーバーアクセスログ](#apache-http-server-access-log)
  * [CloudTrailログイベント](#cloudtrail-log-event)
  * [Google Cloud Logging](#google-cloud-logging)
* [Elastic Common Schema](#elastic-common-schema)
* [付録B: `SeverityNumber` のマッピング例](#appendix-b-severitynumber-example-mappings)
* [参考文献](#references)

## 動機 {#motivation}

これは、アプリケーションのログファイル、機械生成のイベント、システムログなど、さまざまなソースからのログを表現できるデータモデルとセマンティック規約の提案です。
既存のログ形式は、このデータモデルに一意にマッピングできます。
このデータモデルからの逆マッピングも、対象のログ形式が同等の機能を持つ範囲において可能です。

このデータモデルの目的は、ログレコードとは何か、ロギングシステムによって記録、転送、保存、解釈される必要があるデータは何かについて、共通の理解を持つことです。

この提案は、[Standalone Log](https://github.com/open-telemetry/oteps/blob/main/text/logs/0091-logs-vocabulary.md#standalone-log) のためのデータモデルを定義します。
その関連する部分は、将来のOTEPで[Embedded Log](https://github.com/open-telemetry/oteps/blob/main/text/logs/0091-logs-vocabulary.md#embedded-log)のために採用されることがあります。

## 設計上の注記 {#design-notes}

### 要件 {#requirements}

このデータモデルは、以下の要件を満たすように設計されました。

- 既存のログ形式をこのデータモデルに一意にマッピングできる必要があります。
  任意のログ形式からこのデータモデルへ、そして元のログ形式に戻すログデータの変換は、理想的には同一のデータになるべきです。

- 他のログ形式からこのデータモデルへのマッピングは、意味的に妥当であるべきです。
  このデータモデルは、既存のログ形式の特定の要素のセマンティクスを保持しなければなりません。

- 任意のログ形式Aからこのデータモデルへログデータを変換し、さらにこのデータモデルから別のログ形式Bへ変換した場合、理想的には、ログ形式Aからログ形式Bへの妥当な直接変換に劣らない意味のあるログデータの変換になるべきです。

- データを保存または送信する必要がある具体的な実装において、このデータモデルを効率的に表現できる必要があります。
  私たちが主に関心を持つのは、効率性の2つの側面です。
  シリアライズ／デシリアライズにかかるCPU使用率と、シリアライズされた形式での容量要件です。
  これは、データモデルそのものではなくデータモデルの具体的な表現方法によって左右される間接的な要件ですが、それでも留意しておく価値があります。

このデータモデルは、次の3種類のログとイベントをうまく表現することを目指しています。

- システム形式です。
  これらは、オペレーティングシステムによって生成される、私たちが制御できないログとイベントです。
  （私たちが変更できるアプリケーションによってデータが生成される場合を除いて）形式を変更したり、含まれる情報に影響を与えたりすることはできません。
  システム形式の例としてはSyslogがあります。

- サードパーティアプリケーションです。
  これらはサードパーティのアプリケーションによって生成されます。
  含まれる情報について、たとえば形式をカスタマイズするなど、ある程度の制御ができる場合があります。
  例としてはApacheのログファイルがあります。

- ファーストパーティアプリケーションです。
  これらは私たちが開発するアプリケーションであり、ログやイベントがどのように生成され、ログにどのような情報を含めるかについて、ある程度の制御ができます。
  必要であれば、アプリケーションのソースコードを変更できる可能性が高いです。

### フィールドの種類 {#field-kinds}

このデータモデルは、（レコードの物理的な形式やエンコーディングに関わらず）ログレコードの論理モデルを定義します。
各レコードには、2種類のフィールドが含まれます。

- 特定の型と意味を持つ、名前付きのトップレベルフィールド。

- キーと値のペアのリストに格納されるフィールドで、さまざまな型の任意の値を含むことができます。
  よく知られたフィールドのキーと値は、そのフィールドを扱うすべての関係者がデータについて同じ解釈を持てるように、キー名と可能な値についてのセマンティック規約に従います。
  `Resource` フィールドと `Attributes` フィールドのセマンティック規約への参照、および[付録A](#appendix-a-example-mappings)の例を参照してください。

この2種類のフィールドを持つ理由は次のとおりです。

- 名前付きのトップレベルフィールドを効率的に表現できることです。
  これらのフィールドはほぼ常に存在します（たとえば、フィールドが列挙されるもののワイヤー上では名前を持たないProtocol Buffersのようなエンコーディングを使用する場合など）。

- 名前付きフィールドの型を強制できることです。
  これは、型チェックを行うコンパイル言語にとって非常に有用です。

- キーと値のペアのリストを介して、頻度の低いデータを表現できる柔軟性です。
  これには、標準化されたセマンティクスを持つよく知られたデータだけでなく、アプリケーションがログに含めたい任意のカスタムデータも含まれます。

このデータモデルを設計する際、トップレベルの名前付きフィールドをいつ使用するかを決定するために、以下の考え方に従いました。

- そのフィールドは、すべてのレコードにとって必須であるか、よく知られたログおよびイベント形式で頻繁に存在する（`Timestamp` など）か、今後登場するロギングシステムのログレコードで頻繁に存在すると期待される（`TraceId` など）必要があります。

- そのフィールドのセマンティクスは、既知のすべてのログおよびイベント形式で同一であり、このデータモデルに直接かつ一意にマッピングできる必要があります。

上記の両方の条件が、そのフィールドにレコードのトップレベル構造の中の場所を与えるために必要でした。

## ログおよびイベントレコードの定義 {#log-and-event-record-definition}

注記: 以下では型 `any` を使用します。
これはスカラー値（数値、文字列、真偽値）、または値の配列やマップになり得ます。
配列やマップの値については任意の深さのネストが許可されます（本質的にはJSONオブジェクトと同等のものを表現できます）。

[付録A](#appendix-a-example-mappings)には、既存のログ形式が以下で定義されるフィールドにどのようにマッピングされるかを示す多くの例が含まれています。
フィールドの意味について疑問がある場合は、これらの例を確認すると役立つでしょう。

ログレコードのフィールドの一覧は以下のとおりです。

| Field Name     | Description                                  |
| -------------- | -------------------------------------------- |
| Timestamp      | イベントが発生した時刻です。                |
| TraceId        | リクエストのトレースIDです。                            |
| SpanId         | リクエストのスパンIDです。                            |
| TraceFlags     | W3Cのトレースフラグです。                       |
| SeverityText   | 重大度のテキストです（ログレベルとも呼ばれます）。 |
| SeverityNumber | 重大度の数値です。             |
| Name           | 短いイベント識別子です。                      |
| Body           | ログレコードの本文です。                  |
| Resource       | ログのソースを説明します。             |
| Attributes     | イベントに関する追加情報です。      |

以下は各フィールドの詳細な説明です。

### フィールド: `Timestamp` {#field-timestamp}

型: Timestamp、UNIXエポックからのナノ秒を表すuint64。

説明: 発生元のクロックで計測された、イベントが発生した時刻です。
このフィールドは省略可能で、タイムスタンプが不明な場合は存在しないことがあります。

### トレースコンテキストフィールド {#trace-context-fields}

#### フィールド: `TraceId` {#field-traceid}

型: バイト列。

説明: [W3C Trace Context](https://www.w3.org/TR/trace-context/#trace-id) で定義されているリクエストのトレースIDです。
リクエスト処理の一部であり、トレースIDが割り当てられているログに対して設定できます。
このフィールドは省略可能です。

#### フィールド: `SpanId` {#field-spanid}

型: バイト列。

説明: スパンIDです。
特定の処理スパンの一部であるログに対して設定できます。
SpanIdが存在する場合、TraceIdも存在すべきです（SHOULD）。
このフィールドは省略可能です。

#### フィールド: `TraceFlags` {#field-traceflags}

型: バイト。

説明: [W3C Trace Context](https://www.w3.org/TR/trace-context/#trace-flags) 仕様で定義されているトレースフラグです。
本ドキュメントの執筆時点では、この仕様はSAMPLEDフラグという1つのフラグのみを定義しています。
このフィールドは省略可能です。

### 重大度フィールド {#severity-fields}

#### フィールド: `SeverityText` {#field-severitytext}

型: 文字列。

説明: 重大度のテキストです（ログレベルとも呼ばれます）。
これは、発生元で知られているとおりの、重大度の元の文字列表現です。
このフィールドが存在せず `SeverityNumber` が存在する場合、`SeverityNumber` に対応する短い名前が代替として使用されることがあります。
このフィールドは省略可能です。

#### フィールド: `SeverityNumber` {#field-severitynumber}

型: 数値。

説明: このドキュメントで説明されている値に正規化された、重大度の数値です。
このフィールドは省略可能です。

`SeverityNumber` は整数値です。
小さい数値はより重大度の低いイベント（デバッグイベントなど）に対応し、大きい数値はより重大度の高いイベント（エラーやクリティカルなイベントなど）に対応します。
次の表は `SeverityNumber` の値の意味を定義します。

| SeverityNumber range | Range name | Meaning                                                                                |
| -------------------- | ---------- | ---------------------------------------------------------------------------------------|
| 1-4                  | TRACE      | きめ細かいデバッグイベントです。デフォルト設定では通常無効になっています。          |
| 5-8                  | DEBUG      | デバッグイベントです。                                                                     |
| 9-12                 | INFO       | 情報イベントです。イベントが発生したことを示します。                              |
| 13-16                | WARN       | 警告イベントです。エラーではありませんが、情報イベントよりも重要である可能性が高いです。|
| 17-20                | ERROR      | エラーイベントです。何か問題が発生しました。                                                  |
| 21-24                | FATAL      | アプリケーションやシステムのクラッシュなど、致命的なエラーです。                                     |

各範囲内で小さい数値は重要度の低い（重大度の低い）イベントを表します。
各範囲内で大きい数値は重要度の高い（重大度の高い）イベントを表します。
たとえば `SeverityNumber=17` は、`SeverityNumber=20` のエラーよりも重大度の低いエラーを表します。

#### `SeverityNumber` のマッピング {#mapping-of-severitynumber}

既存のロギングシステムおよび形式（略して**ソース形式**）からのマッピングは、上の表で各範囲に与えられた意味に基づいて、その特定の形式の重大度（またはログレベル）がこのデータモデルの `SeverityNumber` にどのように対応するかを定義しなければなりません。

ソース形式にこの表の単一の範囲に一致する重大度が複数存在する場合、ソース形式の重大度は、そのソースの重大度がどれだけ重大（重要）であるかに応じて、その範囲内の数値が割り当てられなければなりません。

たとえば、ソース形式が「Error」と「Critical」をエラーイベントとして定義しており、「Critical」がより重要かつより重大な状況を表す場合、マッピングとして次の `SeverityNumber` の値を選択できます。「Error」→17、「Critical」→18。

ソース形式にその範囲の意味に一致する重大度が1つしかない場合は、その重大度にその範囲の最小値を割り当てることが推奨されます。

たとえば、ソース形式に「Informational」というログレベルがあり、類似の意味を持つ他のログレベルがない場合は、「Informational」に対して `SeverityNumber=9` を使用することが推奨されます。

重大度やログレベルの概念を定義していないソース形式は、`SeverityNumber` フィールドと `SeverityText` フィールドを省略してもよい（MAY）です。
バックエンドとUIは、重大度情報が欠落しているログレコードを区別して表現してもよいですし、`SeverityNumber` フィールドと `SeverityText` フィールドが欠落しているログレコードを、あたかも `SeverityNumber` がINFO（数値の9）に設定されているかのように解釈してもよいです。

#### 逆マッピング {#reverse-mapping}

`SeverityNumber` から特定の形式への逆マッピングを実行する際、その形式に対応するマッピングエントリが `SeverityNumber` に存在しない場合は、同じ重大度の範囲内にあり、数値的に最も近い対象の重大度を選択することが推奨されます。

たとえば、Zapには「Info」と呼ばれる、INFO範囲の重大度が1つしかありません。
逆マッピングを行う際、INFO範囲（数値9〜12）のすべての `SeverityNumber` の値は、Zapの「Info」レベルにマッピングされます。

#### エラーのセマンティクス {#error-semantics}

`SeverityNumber` が存在し、その値がERROR（数値17）以上である場合、そのログレコードはエラーの状況を表していることを示しています。
この事実をどのように利用するかを判断するのは、この値の読み手次第です（たとえば、UIはこのようなエラーを異なる色で表示したり、エラーのあるログレコードをすべて見つける機能を持たせたりしてもよいです）。

ログレコードがエラーのイベントを表しており、ソース形式が重大度やログレベルの概念を定義していない場合は、マッピング処理の間に `SeverityNumber` をERROR（数値17）に設定することが推奨されます。
ログレコードがエラーでないイベントを表す場合、`SeverityNumber` フィールドは省略してもよいですし、ERROR（数値17）未満の任意の数値に設定してもよいです。
この場合の推奨値はINFO（数値9）です。
マッピング例については[付録B](#appendix-b-severitynumber-example-mappings)を参照してください。

#### 重大度の表示 {#displaying-severity}

次の表は、各 `SeverityNumber` の値に対する推奨される短縮名を定義します。
この短縮名は、たとえばUIで `SeverityNumber` を表現するために使用できます。

| SeverityNumber | Short Name |
| -------------- | ---------- |
| 1              | TRACE      |
| 2              | TRACE2     |
| 3              | TRACE3     |
| 4              | TRACE4     |
| 5              | DEBUG      |
| 6              | DEBUG2     |
| 7              | DEBUG3     |
| 8              | DEBUG4     |
| 9              | INFO       |
| 10             | INFO2      |
| 11             | INFO3      |
| 12             | INFO4      |
| 13             | WARN       |
| 14             | WARN2      |
| 15             | WARN3      |
| 16             | WARN4      |
| 17             | ERROR      |
| 18             | ERROR2     |
| 19             | ERROR3     |
| 20             | ERROR4     |
| 21             | FATAL      |
| 22             | FATAL2     |
| 23             | FATAL3     |
| 24             | FATAL4     |

個々のログレコードを表示する際は、`SeverityText` と `SeverityNumber` の両方の値を表示することが推奨されます。
この場合に推奨される結合文字列は、短縮名で始まり、それに続けて括弧内に `SeverityText` を記載する形式です。

たとえば、「Informational」のSyslogレコードは **INFO (Informational)** として表示されます。
特定のログレコードで `SeverityNumber` は定義されているが `SeverityText` が存在しない場合は、短縮名のみを表示することが推奨されます（たとえば **INFO**）。

ドロップダウンリスト（または、取り得る値の集合を表現することを意図したその他のUI要素）を重大度の表現に使用する場合は、そのようなUI要素に短縮名を表示することが望ましいです。

たとえば、重大度でログレコードをフィルタリングできる重大度のドロップダウンリストは、システムに知られているすべての異なる `SeverityText` の値を列挙するドロップダウンリスト（要素数が多くなる可能性があり、しばしば大文字小文字や省略の違いだけで異なります。たとえば「Info」と「Information」）と比較して、`SeverityNumber` の短縮名を含む（そのため要素数の上限が限られる）方が、より使いやすい可能性が高いです。

#### 重大度の比較 {#comparing-severity}

重大度が未満／超過の比較に関わる文脈では、`SeverityNumber` フィールドを使用すべきです。
`SeverityNumber` は、別の `SeverityNumber` や、1〜24の範囲の数値（または対応する短縮名）と比較できます。

重大度が等価または不等価の比較に使用される場合（たとえばUIのフィルターなど）、マッチングを行う際には `SeverityText` と `SeverityNumber` の短縮名の両方を使用することを試みることが推奨されます（つまり、これらいずれかのフィールドとの一致もマッチとみなすべきです）。
たとえば、`SeverityText` フィールドが「Informational」に等しく、`SeverityNumber` フィールドがINFOに等しいレコードがある場合、そのレコードについて **severity="Informational"** と **severity="INFO"** の両方の条件がTRUEになるようにすることが、ユーザー体験の観点からは望ましいでしょう。

### フィールド: `Name` {#field-name}

型: 文字列。

説明: 変動する部分を含まない、短いイベント識別子です。
`Name` は何が起きたかを表します（たとえば「ProcessStarted」）。
50文字以内にすることが推奨されます。
一意性は一切保証されません。
通常、バックエンドでのフィルタリングやグルーピングの目的で使用されます。
このフィールドは省略可能です。

### フィールド: `Body` {#field-body}

型: any。

説明: ログレコードの本文を含む値です（上記の `any` 型の説明を参照）。
たとえば、イベントを自由形式で説明する（複数行を含む）人間可読な文字列メッセージであってもよいですし、他の値の配列やマップで構成された構造化データであってもよいです。
同じソースから発生するイベントの発生ごとに異なる場合があります。
このフィールドは省略可能です。

### フィールド: `Resource` {#field-resource}

型: キーと値のペアのリスト。

説明: ログのソース、すなわち[リソース](../../specification/overview.md#resources)を説明します。
各ペアの「キー」は `string` 型で、「値」は `any` 型です。
同じイベントソースから発生する複数回のイベントは時間をまたいで発生し得ますが、それらはすべて同じ `Resource` の値を持ちます。
たとえば、レコードを発行するアプリケーションに関する情報や、アプリケーションが実行されるインフラストラクチャに関する情報を含むことができます。
このデータモデルを表現するデータ形式は、同じソースから発生するログレコードのバッチごとに `Resource` フィールドを1回だけ記録できるように設計されることがあります。
リソースの[セマンティック規約](https://github.com/open-telemetry/semantic-conventions/tree/main/docs/resource)に従うべきです（SHOULD）。
このフィールドは省略可能です。

### フィールド: `Attributes` {#field-attributes}

型: キーと値のペアのリスト。

説明: 特定のイベント発生に関する追加情報です。
各ペアの「キー」は `string` 型で、「値」は `any` 型です。
特定のソースに対して固定される `Resource` フィールドとは異なり、`Attributes` は同じソースから発生するイベントの発生ごとに異なる場合があります。
（TraceId/SpanId以外の）リクエストコンテキストに関する情報を含むことができます。
OpenTelemetryの[属性のセマンティック規約](https://github.com/open-telemetry/semantic-conventions/blob/main/docs/general/naming.md#attributes)に従うべきです（SHOULD）。
このフィールドは省略可能です。

## ログレコードの例 {#example-log-records}

以下は、ログレコードをJSONで表現する一つの可能な方法を示す例です。
これらはあくまでこのデータモデルの理解を助けるための例です。
これらの例を、このデータモデルをJSONで表現する_唯一の_方法として捉えないでください。

このドキュメントは、ログレコード表現の実際のエンコーディングと形式を定義しません。
形式の定義は、別のOTEPで行われます（たとえば、ログレコードはmsgpack、JSON、Protocol Bufferのメッセージなどとして表現される場合があります）。

例1

```javascript
{
  "Timestamp": 1586960586000, // JSON needs to make a decision about
                              // how to represent nanoseconds.
  "Attributes": {
    "http.status_code": 500,
    "http.url": "http://example.com",
    "my.custom.application.tag": "hello",
  },
  "Resource": {
    "service.name": "donut_shop",
    "service.version": "semver:2.0.0",
    "k8s.pod.uid": "1138528c-c36e-11e9-a1a7-42010a800198",
  },
  "TraceId": "f4dbb3edd765f620", // this is a byte sequence
                                 // (hex-encoded in JSON)
  "SpanId": "43222c2d51a7abe3",
  "SeverityText": "INFO",
  "SeverityNumber": 9,
  "Body": "20200415T072306-0700 INFO I like donuts"
}
```

例2

```javascript
{
  "Timestamp": 1586960586000,
  ...
  "Body": {
    "i": "am",
    "an": "event",
    "of": {
      "some": "complexity"
    }
  }
}
```

例3

```javascript
{
   "Timestamp": 1586960586000,
   "Attributes":{
      "http.scheme":"https",
      "http.host":"donut.mycie.com",
      "http.target":"/order",
      "http.method":"post",
      "http.status_code":500,
      "http.flavor":"1.1",
      "http.user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36",
   }
}
```

## OTEPの議論中に解決された疑問 {#questions-resolved-during-otep-discussion}

これらは、[OTEPのプルリクエスト](https://github.com/open-telemetry/oteps/pull/97)で議論され、解決された未解決の疑問でした。

### `TraceFlags` 対 `TraceParent` と `TraceState` {#traceflags-vs-traceparent-and-tracestate}

質問: `TraceFlags` だけでなく、`traceparent` フィールドと `tracestate` フィールドを含む[W3C Trace Context](https://www.w3.org/TR/trace-context/)全体を保存すべきでしょうか。

回答: この議論では、`traceparent` と `tracestate` が必要であるという証拠は見つかりませんでした。

### 重大度フィールド {#severity-fields-1}

質問: `SeverityText`/`SeverityNumber` フィールドの設計は十分に優れているでしょうか。

回答: 議論の結果、この設計は妥当であることが示されました。

### `Timestamp` の要件 {#timestamp-requirements}

質問: この提案の初期の草稿では、`Timestamp` は単調増加でNTP同期されたソースから設定されるべきであると規定されていました。
混乱を避けるため、この要件は削除しました。
タイムスタンプのソースについて何らかの要件が必要でしょうか。

回答: 議論の結果、そのような要件を規定することはデータモデルの責務ではないことが明らかになりました。

### セキュリティログ {#security-logs}

質問: セキュリティログに対して特別な扱いが必要でしょうか。

回答: このOTEPでの議論では、データモデルの提案という文脈においてセキュリティログを特別に扱う必要性は見出されませんでした。

## 代替設計 {#alternate-design}

エンベロープ方式を用いた代替設計も検討しましたが、総合的にこちらの設計より優れているとは判断しませんでした。

## 先行技術 {#prior-art}

### RFC5424 Syslog {#rfc5424-syslog}

[RFC5424](https://datatracker.ietf.org/doc/html/rfc5424) は、構造化されたログデータの形式とプロトコルを定義しています。
このプロトコルは広く普及していますが（残念ながら多くの実装は構造化データの推奨事項に従っていません）、Syslogをデータモデルの有力な候補としない、いくつかの欠点があります。

- 構造化された属性を許容する一方で、メッセージの本文は文字列のみです。

- 重大度は8つの数値にハードコードされており、カスタムの重大度テキストを許容しません。

- 構造化データは任意のネストを許容せず、2階層のみです。

- データソース（すなわちリソース）を指定するための明確な独立した場所がありません。
  この目的を限定的に果たすハードコードされたフィールドがいくつか存在します（HOSTNAME、APP-NAME、FACILITY）。

### Fluentd Forwardプロトコルモデル {#fluentd-forward-protocol-model}

[Forwardプロトコル](https://github.com/fluent/fluentd/wiki/Forward-Protocol-Specification-v1) は、タイムスタンプ付きレコードとしてログEntryの概念を定義しています。
このレコードは、タグと任意のキーと値のペアのマップという2つの要素で構成されます。

このモデルは、あらゆるログレコードを表現できるほど汎用的です。
しかし、いくつかの欠点があります。

- レコードのすべての属性は、（タグとタイムスタンプを除いて）汎用的なキーと値のペアで表現されます。
  これは、最適化の機会を逃しています（[設計上の注記](#design-notes)を参照）。

- データソース（すなわちリソース）を指定するための明確な独立した場所がありません。

- キーがどのように命名されるべきか、どのような値が期待されるかについての言及がありません。
  命名規則やキーと値のペアの標準化が欠如していることが、相互運用性を難しくしています。

## 付録A. マッピング例 {#appendix-a-example-mappings}

このセクションには、他のイベントおよびログの形式をこのデータモデルにマッピングする例が含まれています。

### RFC5424 Syslog {#rfc5424-syslog-1}

<table>
  <tr>
    <td>プロパティ</td>
    <td>型</td>
    <td>説明</td>
    <td>統合モデルフィールドへのマッピング</td>
  </tr>
  <tr>
    <td>TIMESTAMP</td>
    <td>Timestamp</td>
    <td>発生元のクロックで計測された、イベントが発生した時刻です。</td>
    <td>Timestamp</td>
  </tr>
  <tr>
    <td>SEVERITY</td>
    <td>enum</td>
    <td>イベントの重要度を定義します。例: `Debug`</td>
    <td>Severity</td>
  </tr>
  <tr>
    <td>FACILITY</td>
    <td>enum</td>
    <td>イベントの発生元を説明します。あらかじめ定義されたUNIXプロセスの一覧です。イベントソースの識別情報の一部です。例: `mail system`</td>
    <td>`Attributes["syslog.facility"]`</td>
  </tr>
  <tr>
    <td>VERSION</td>
    <td>number</td>
    <td>メタ情報: プロトコルのバージョンで、イベントとは直交しています。</td>
    <td>`Attributes["syslog.version"]`</td>
  </tr>
  <tr>
    <td>HOSTNAME</td>
    <td>string</td>
    <td>イベントが発生した場所を説明します。取り得る値はFQDN、IPアドレスなどです。</td>
    <td>`Resource["host.hostname"]`</td>
  </tr>
  <tr>
    <td>APP-NAME</td>
    <td>string</td>
    <td>ユーザーが定義したアプリケーション名です。イベントソースの識別情報の一部です。</td>
    <td>`Resource["service.name"]`</td>
  </tr>
  <tr>
    <td>PROCID</td>
    <td>string</td>
    <td>明確に定義されていません。プロトコル操作の目的でメタフィールドとして使われることも、イベントソースの識別情報の一部として使われることもあります。</td>
    <td>`Attributes["syslog.procid"]`</td>
  </tr>
  <tr>
    <td>MSGID</td>
    <td>string</td>
    <td>イベントの種類を定義します。イベントソースの識別情報の一部です。例: `"TCPIN"`</td>
    <td>Name</td>
  </tr>
  <tr>
    <td>STRUCTURED-DATA</td>
    <td>array of maps of string to string</td>
    <td>SD-IDによってさまざまな用途があります。
イベントソースの識別情報を説明できます。
イベントの特定の発生を説明するデータを含められます。
メタ情報（たとえばタイムスタンプ値の品質など）にもなり得ます。</td>
    <td>SD-ID origin.swVersionは `Resource["service.version"]` にマッピングされます

SD-ID origin.ipは `Attributes["net.host.ip"]` にマッピングされます

それ以外のSD-IDは `Attributes["syslog.*"]` にマッピングされます</td>
  </tr>
  <tr>
    <td>MSG</td>
    <td>string</td>
    <td>イベントに関する自由形式のテキストメッセージです。通常は人間が読める形式です。</td>
    <td>Body</td>
  </tr>
</table>

### Windowsイベントログ {#windows-event-log}

<table>
  <tr>
    <td>プロパティ</td>
    <td>型</td>
    <td>説明</td>
    <td>統合モデルフィールドへのマッピング</td>
  </tr>
  <tr>
    <td>TimeCreated</td>
    <td>Timestamp</td>
    <td>イベントがログに記録された時刻を識別するタイムスタンプです。</td>
    <td>Timestamp</td>
  </tr>
  <tr>
    <td>Level</td>
    <td>enum</td>
    <td>イベントの重大度レベルを含みます。</td>
    <td>Severity</td>
  </tr>
  <tr>
    <td>Computer</td>
    <td>string</td>
    <td>イベントが発生したコンピューターの名前です。</td>
    <td>`Resource["host.hostname"]`</td>
  </tr>
  <tr>
    <td>EventID</td>
    <td>uint</td>
    <td>プロバイダーがイベントを識別するために使用した識別子です。</td>
    <td>Name</td>
  </tr>
  <tr>
    <td>Message</td>
    <td>string</td>
    <td>メッセージ文字列です。</td>
    <td>Body</td>
  </tr>
  <tr>
    <td>それ以外のフィールド。</td>
    <td>any</td>
    <td>イベント内のその他すべてのフィールドです。</td>
    <td>`Attributes["winlog.*"]`</td>
  </tr>
</table>

### SignalFxイベント {#signalfx-events}

<table>
  <tr>
    <td>フィールド</td>
    <td>型</td>
    <td>説明</td>
    <td>統合モデルフィールドへのマッピング</td>
  </tr>
  <tr>
    <td>Timestamp</td>
    <td>Timestamp</td>
    <td>発生元のクロックで計測された、イベントが発生した時刻です。</td>
    <td>Timestamp</td>
  </tr>
  <tr>
    <td>EventType</td>
    <td>string</td>
    <td>イベントの種類を説明する、機械が理解できる短い文字列です。SignalFx固有の概念です。名前空間を持ちません。例: k8sのEvent Reasonフィールド。</td>
    <td>Name</td>
  </tr>
  <tr>
    <td>Category</td>
    <td>enum</td>
    <td>イベントの発生元と理由を説明します。SignalFx固有の概念です。例: AGENT。この属性がSignalFxのEventに存在しない場合、LogRecordではnull属性値に設定すべきです。これにより、SignalFxのイベントがLogRecordとして表現される際に一意に識別できるようになります。</td>
    <td>`Attributes["com.splunk.signalfx.event_category"]`</td>
  </tr>
  <tr>
    <td>Dimensions</td>
    <td>map of string to string</td>
    <td>EventTypeおよびCategoryと合わせて、イベントソースの識別情報を定義するのに役立ちます。同じイベントソースから発生する複数回のイベントは時間をまたいで発生し得ますが、それらはすべて同じDimensionsの値を持ちます。SignalFxでは、イベントのDimensionsはEventTypeとともに、個々のEvent Time Series（ETS）を決定します。</td>
    <td>Attributes</td>
  </tr>
  <tr>
    <td>Properties</td>
    <td>map of string to any</td>
    <td>特定のイベント発生に関する追加情報です。特定のイベントソースに対して固定されるDimensionsとは異なり、Propertiesは同じイベントソースから発生するイベントの発生ごとに異なる値を持つことができます。SignalFxでは、イベントのPropertiesはイベントに関する追加のメタデータとみなされ、Event Time Series（ETS）の識別情報には影響しません。</td>
    <td>`Attributes["com.splunk.signalfx.event_properties"]`</td>
  </tr>
</table>

### Splunk HEC {#splunk-hec}

<table>
  <tr>
    <td>フィールド</td>
    <td>型</td>
    <td>説明</td>
    <td>統合モデルフィールドへのマッピング</td>
  </tr>
  <tr>
    <td>time</td>
    <td>numeric, string</td>
    <td>秒単位のエポックタイム形式でのイベント時刻です。</td>
    <td>Timestamp</td>
  </tr>
  <tr>
    <td>host</td>
    <td>string</td>
    <td>イベントデータに割り当てるホストの値です。通常は、データの送信元となるクライアントのホスト名です。</td>
    <td>`Resource["host.hostname"]`</td>
  </tr>
  <tr>
    <td>source</td>
    <td>string</td>
    <td>イベントデータに割り当てるソースの値です。たとえば、開発中のアプリケーションからデータを送信している場合、このキーをそのアプリケーションの名前に設定できます。</td>
    <td>`Resource["service.name"]`</td>
  </tr>
  <tr>
    <td>sourcetype</td>
    <td>string</td>
    <td>イベントデータに割り当てるsourcetypeの値です。</td>
    <td>`Attributes["source.type"]`</td>
  </tr>
  <tr>
    <td>event</td>
    <td>any</td>
    <td>イベントの生の本文をJSONで表現したものです。文字列、数値、文字列配列、数値配列、JSONオブジェクト、またはJSON配列になり得ます。</td>
    <td>Body</td>
  </tr>
  <tr>
    <td>fields</td>
    <td>Map of any</td>
    <td>明示的なカスタムフィールドを含むJSONオブジェクトを指定します。</td>
    <td>Attributes</td>
  </tr>
  <tr>
    <td>index</td>
    <td>string</td>
    <td>イベントデータのインデックス作成に使用するインデックスの名前です。トークンにindexesパラメーターが設定されている場合、ここで指定するインデックスは許可されたインデックスの一覧内でなければなりません。</td>
    <td>未定、おそらくattributesに入ります</td>
  </tr>
</table>

### Log4j {#log4j}

<table>
  <tr>
    <td>フィールド</td>
    <td>型</td>
    <td>説明</td>
    <td>統合モデルフィールドへのマッピング</td>
  </tr>
  <tr>
    <td>Instant</td>
    <td>Timestamp</td>
    <td>発生元のクロックで計測された、イベントが発生した時刻です。</td>
    <td>Timestamp</td>
  </tr>
  <tr>
    <td>Level</td>
    <td>enum</td>
    <td>ログレベルです。</td>
    <td>Severity</td>
  </tr>
  <tr>
    <td>Message</td>
    <td>string</td>
    <td>人間が読めるメッセージです。</td>
    <td>Body</td>
  </tr>
  <tr>
    <td>それ以外のすべてのフィールド</td>
    <td>any</td>
    <td>構造化データです。</td>
    <td>Attributes</td>
  </tr>
</table>

### Zap {#zap}

<table>
  <tr>
    <td>フィールド</td>
    <td>型</td>
    <td>説明</td>
    <td>統合モデルフィールドへのマッピング</td>
  </tr>
  <tr>
    <td>ts</td>
    <td>Timestamp</td>
    <td>発生元のクロックで計測された、イベントが発生した時刻です。</td>
    <td>Timestamp</td>
  </tr>
  <tr>
    <td>level</td>
    <td>enum</td>
    <td>ログレベルです。</td>
    <td>Severity</td>
  </tr>
  <tr>
    <td>caller</td>
    <td>string</td>
    <td>呼び出し元関数のファイル名と行番号です。
</td>
    <td>Attributes、キーは未定</td>
  </tr>
  <tr>
    <td>msg</td>
    <td>string</td>
    <td>人間が読めるメッセージです。</td>
    <td>Body</td>
  </tr>
  <tr>
    <td>それ以外のすべてのフィールド</td>
    <td>any</td>
    <td>構造化データです。</td>
    <td>Attributes</td>
  </tr>
</table>

### Apache HTTPサーバーアクセスログ {#apache-http-server-access-log}

<table>
  <tr>
    <td>フィールド</td>
    <td>型</td>
    <td>説明</td>
    <td>統合モデルフィールドへのマッピング</td>
  </tr>
  <tr>
    <td>%t</td>
    <td>Timestamp</td>
    <td>発生元のクロックで計測された、イベントが発生した時刻です。</td>
    <td>Timestamp</td>
  </tr>
  <tr>
    <td>%a</td>
    <td>string</td>
    <td>クライアントのIPアドレスです。</td>
    <td>`Attributes["net.peer.ip"]`</td>
  </tr>
  <tr>
    <td>%A</td>
    <td>string</td>
    <td>サーバーのIPアドレスです。</td>
    <td>`Attributes["net.host.ip"]`</td>
  </tr>
  <tr>
    <td>%h</td>
    <td>string</td>
    <td>リモートホスト名です。 </td>
    <td>`Attributes["net.peer.name"]`</td>
  </tr>
  <tr>
    <td>%m</td>
    <td>string</td>
    <td>リクエストメソッドです。</td>
    <td>`Attributes["http.method"]`</td>
  </tr>
  <tr>
    <td>%v,%p,%U,%q</td>
    <td>string</td>
    <td>URLに組み合わせられる複数のフィールドです。</td>
    <td>`Attributes["http.url"]`</td>
  </tr>
  <tr>
    <td>%>s</td>
    <td>string</td>
    <td>レスポンスステータスです。</td>
    <td>`Attributes["http.status_code"]`</td>
  </tr>
  <tr>
    <td>それ以外のすべてのフィールド</td>
    <td>any</td>
    <td>構造化データです。</td>
    <td>Attributes、キーは未定</td>
  </tr>
</table>

### CloudTrailログイベント {#cloudtrail-log-event}

<table>
  <tr>
    <td>フィールド</td>
    <td>型</td>
    <td>説明</td>
    <td>統合モデルフィールドへのマッピング</td>
  </tr>
  <tr>
    <td>eventTime</td>
    <td>string</td>
    <td>協定世界時（UTC）で表された、リクエストが行われた日時です。</td>
    <td>Timestamp</td>
  </tr>
  <tr>
    <td>eventSource</td>
    <td>string</td>
    <td>リクエストの送信先となったサービスです。この名前は通常、サービス名からスペースを除いた短縮形に.amazonaws.comを付加したものです。</td>
    <td>`Resource["service.name"]`?</td>
  </tr>
  <tr>
    <td>awsRegion</td>
    <td>string</td>
    <td>リクエストの送信先となったAWSリージョンです（例: us-east-2）。</td>
    <td>`Resource["cloud.region"]`</td>
  </tr>
  <tr>
    <td>sourceIPAddress</td>
    <td>string</td>
    <td>リクエストの送信元となったIPアドレスです。</td>
    <td>`Resource["net.peer.ip"]` または `Resource["net.host.ip"]`？未定</td>
  </tr>
  <tr>
    <td>errorCode</td>
    <td>string</td>
    <td>リクエストがエラーを返した場合のAWSサービスのエラーです。</td>
    <td>Name</td>
  </tr>
  <tr>
    <td>errorMessage</td>
    <td>string</td>
    <td>リクエストがエラーを返した場合の、そのエラーの説明です。</td>
    <td>Body</td>
  </tr>
  <tr>
    <td>それ以外のすべてのフィールド</td>
    <td>*</td>
    <td></td>
    <td>`Attributes["cloudtrail.*"]`</td>
  </tr>
</table>

### Google Cloud Logging {#google-cloud-logging}

| Field | Type | Description | Maps to Unified Model Field |
| ----- | ---- | ----------- | --------------------------- |
| timestamp | string | ログエントリが説明するイベントが発生した時刻です。 | Timestamp |
| resource | MonitoredResource | このログエントリを生成した監視対象リソースです。 | Resource |
| log_name | string | このエントリがどのログストリームに属するかを識別する、log_nameフィールドのURLエンコードされたLOG_IDサフィックスです。 | Name |
| json_payload | google.protobuf.Struct | JSONオブジェクトとして表現された構造体で表されるログエントリのペイロードです。 | Body |
| proto_payload | google.protobuf.Any | プロトコルバッファーとして表されるログエントリのペイロードです。 | Body |
| text_payload | string | Unicode文字列（UTF-8）で表されるログエントリのペイロードです。 | Body |
| severity | LogSeverity | ログエントリの重大度です。 | Severity |
| trace | string | ログエントリに関連付けられたトレースです（存在する場合）。 | TraceId |
| span_id | string | ログエントリに関連付けられたトレース内のスパンIDです。 | SpanId |
| labels | map<string,string> | ログエントリに関する追加情報を提供する、ユーザー定義の（キー、値）データの集合です。 | Attributes |
| それ以外のすべてのフィールド | | | `Attributes["google.*"]` |

## Elastic Common Schema {#elastic-common-schema}

<table>
  <tr>
    <td>フィールド</td>
    <td>型</td>
    <td>説明</td>
    <td>統合モデルフィールドへのマッピング</td>
  </tr>
  <tr>
    <td>@timestamp</td>
    <td>datetime</td>
    <td>イベントが記録された時刻です。</td>
    <td>timestamp</td>
  </tr>
  <tr>
    <td>message</td>
    <td>string</td>
    <td>任意の種類のメッセージです。</td>
    <td>body</td>
  </tr>
  <tr>
    <td>labels</td>
    <td>key/value</td>
    <td>イベントに関連する任意のラベルです。</td>
    <td>attributes[*]</td>
  </tr>
  <tr>
    <td>tags</td>
    <td>array of string</td>
    <td>イベントに関連する値の一覧です。</td>
    <td>?</td>
  </tr>
  <tr>
    <td>trace.id</td>
    <td>string</td>
    <td>トレースIDです。</td>
    <td>TraceId</td>
  </tr>
  <tr>
    <td>span.id*</td>
    <td>string</td>
    <td>スパンIDです。</td>
    <td>SpanId</td>
  </tr>
  <tr>
    <td>agent.ephemeral_id</td>
    <td>string</td>
    <td>エージェントが作成したエフェメラルIDです。</td>
    <td>**resource</td>
  </tr>
  <tr>
    <td>agent.id</td>
    <td>string</td>
    <td>このエージェントの一意な識別子です。</td>
    <td>**resource</td>
  </tr>
  <tr>
    <td>agent.name</td>
    <td>string</td>
    <td>エージェントに付けられた名前です。</td>
    <td>`Resource["telemetry.sdk.name"]`</td>
  </tr>
  <tr>
    <td>agent.type</td>
    <td>string</td>
    <td>エージェントの種類です。</td>
    <td>`Resource["telemetry.sdk.language"]`</td>
  </tr>
  <tr>
    <td>agent.version</td>
    <td>string</td>
    <td>エージェントのバージョンです。</td>
    <td>`Resource["telemetry.sdk.version"]`</td>
  </tr>
  <tr>
    <td>source.ip, client.ip</td>
    <td>string</td>
    <td>リクエストの送信元となったIPアドレスです。</td>
    <td>`Attributes["net.peer.ip"]` または `Attributes["net.host.ip"]`</td>
  </tr>
  <tr>
    <td>cloud.account.id</td>
    <td>string</td>
    <td>対象のクラウドにおけるアカウントのIDです。</td>
    <td>`Resource["cloud.account.id"]`</td>
  </tr>
  <tr>
    <td>cloud.availability_zone</td>
    <td>string</td>
    <td>このホストが実行されているアベイラビリティゾーンです。</td>
    <td>`Resource["cloud.zone"]`</td>
  </tr>
  <tr>
    <td>cloud.instance.id</td>
    <td>string</td>
    <td>ホストマシンのインスタンスIDです。</td>
    <td>**resource</td>
  </tr>
  <tr>
    <td>cloud.instance.name</td>
    <td>string</td>
    <td>ホストマシンのインスタンス名です。</td>
    <td>**resource</td>
  </tr>
  <tr>
    <td>cloud.machine.type</td>
    <td>string</td>
    <td>ホストマシンのマシンタイプです。</td>
    <td>**resource</td>
  </tr>
  <tr>
    <td>cloud.provider</td>
    <td>string</td>
    <td>クラウドプロバイダーの名前です。例としてaws、azure、gcp、digitaloceanなどの値があります。</td>
    <td>`Resource["cloud.provider"]`</td>
  </tr>
  <tr>
    <td>cloud.region</td>
    <td>string</td>
    <td>このホストが実行されているリージョンです。</td>
    <td>`Resource["cloud.region"]`</td>
  </tr>
  <tr>
    <td>cloud.image.id*</td>
    <td>string</td>
    <td></td>
    <td>`Resource["host.image.name"]`</td>
  </tr>
  <tr>
    <td>container.id</td>
    <td>string</td>
    <td>一意なコンテナIDです。</td>
    <td>`Resource["container.id"]`</td>
  </tr>
  <tr>
    <td>container.image.name</td>
    <td>string</td>
    <td>コンテナのビルド元となったイメージの名前です。</td>
    <td>`Resource["container.image.name"]`</td>
  </tr>
  <tr>
    <td>container.image.tag</td>
    <td>Array of string</td>
    <td>コンテナイメージのタグです。</td>
    <td>**resource</td>
  </tr>
  <tr>
    <td>container.labels</td>
    <td>key/value</td>
    <td>イメージのラベルです。</td>
    <td>attributes[*]</td>
  </tr>
  <tr>
    <td>container.name</td>
    <td>string</td>
    <td>コンテナ名です。</td>
    <td>`Resource["container.name"]`</td>
  </tr>
  <tr>
    <td>container.runtime</td>
    <td>string</td>
    <td>このコンテナを管理するランタイムです。例: "docker"</td>
    <td>**resource</td>
  </tr>
  <tr>
    <td>destination.address</td>
    <td>string</td>
    <td>イベントの宛先アドレスです。</td>
    <td>`Attributes["destination.address"]`</td>
  </tr>
  <tr>
    <td>error.code</td>
    <td>string</td>
    <td>エラーを説明するエラーコードです。</td>
    <td>`Attributes["error.code"]`</td>
  </tr>
  <tr>
    <td>error.id</td>
    <td>string</td>
    <td>エラーの一意な識別子です。</td>
    <td>`Attributes["error.id"]`</td>
  </tr>
  <tr>
    <td>error.message</td>
    <td>string</td>
    <td>エラーメッセージです。</td>
    <td>`Attributes["error.message"]`</td>
  </tr>
  <tr>
    <td>error.stack_trace</td>
    <td>string</td>
    <td>このエラーのスタックトレースをプレーンテキストで表したものです。</td>
    <td>`Attributes["error.stack_trace]</td>
  </tr>
  <tr>
    <td>host.architecture</td>
    <td>string</td>
    <td>オペレーティングシステムのアーキテクチャです。</td>
    <td>**resource</td>
  </tr>
  <tr>
    <td>host.domain</td>
    <td>string</td>
    <td>ホストが属しているドメインの名前です。

たとえば、Windowsの場合はホストのActive Directoryドメインまたは NetBIOSドメイン名になり得ます。Linuxの場合はホストのLDAPプロバイダーのドメインになり得ます。</td>

<td>**resource</td>
  </tr>
  <tr>
    <td>host.hostname</td>
    <td>string</td>
    <td>ホストのホスト名です。

通常、ホストマシン上でhostnameコマンドが返す値が含まれます。</td>

<td>`Resource["host.hostname"]`</td>

  </tr>
  <tr>
    <td>host.id</td>
    <td>string</td>
    <td>一意なホストIDです。</td>
    <td>`Resource["host.id"]`</td>
  </tr>
  <tr>
    <td>host.ip</td>
    <td>Array of string</td>
    <td>ホストのIPです。</td>
    <td>`Resource["host.ip"]`</td>
  </tr>
  <tr>
    <td>host.mac</td>
    <td>array of string</td>
    <td>ホストのMACアドレスです。</td>
    <td>`Resource["host.mac"]`</td>
  </tr>
  <tr>
    <td>host.name</td>
    <td>string</td>
    <td>ホストの名前です。

UNIXシステムでhostnameが返す値、完全修飾名、またはユーザーが指定した名前が含まれる場合があります。 </td>

<td>`Resource["host.name"]`</td>

  </tr>
  <tr>
    <td>host.type</td>
    <td>string</td>
    <td>ホストの種類です。</td>
    <td>`Resource["host.type"]`</td>
  </tr>
  <tr>
    <td>host.uptime</td>
    <td>string</td>
    <td>ホストが稼働している秒数です。</td>
    <td>?</td>
  </tr>
  <tr>
    <td>service.ephemeral_id

</td>
    <td>string</td>
    <td>このサービスのエフェメラル識別子です。</td>
    <td>**resource</td>
  </tr>
  <tr>
    <td>service.id</td>
    <td>string</td>
    <td>実行中のサービスの一意な識別子です。サービスが多数のノードで構成されている場合、service.idはすべてのノードで同一であるべきです。</td>
    <td>**resource</td>
  </tr>
  <tr>
    <td>service.name</td>
    <td>string</td>
    <td>データの収集元となるサービスの名前です。</td>
    <td>`Resource["service.name"]`</td>
  </tr>
  <tr>
    <td>service.node.name</td>
    <td>string</td>
    <td>そのサービスを提供する特定のノードです。</td>
    <td>`Resource["service.instance.id"]`</td>
  </tr>
  <tr>
    <td>service.state</td>
    <td>string</td>
    <td>サービスの現在の状態です。</td>
    <td>`Attributes["service.state"]`</td>
  </tr>
  <tr>
    <td>service.type</td>
    <td>string</td>
    <td>データの収集元となるサービスの種類です。</td>
    <td>**resource</td>
  </tr>
  <tr>
    <td>service.version</td>
    <td>string</td>
    <td>データの収集元となるサービスのバージョンです。</td>
    <td>`Resource["service.version"]`</td>
  </tr>
  <tr>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
  </tr>
</table>

\* まだECSに正式に組み込まれていません。

\*\* [OpenTelemetryのリソースのセマンティック規約](https://github.com/open-telemetry/semantic-conventions/tree/main/docs/resource)に存在しないリソースです。

これは、最も関連性の高いフィールドを抜粋したものです。
網羅的な一覧については[完全なリファレンス](https://www.elastic.co/docs/reference/ecs/ecs-field-reference)を参照してください。

## 付録B: `SeverityNumber` のマッピング例 {#appendix-b-severitynumber-example-mappings}

| Syslog | WinEvtLog | Log4j | Zap | java.util.logging | SeverityNumber |
| ------ | --------- | ----- | --- | ----------------- | -------------- |
| | | TRACE | | FINEST | TRACE |
| Debug | Verbose | DEBUG | Debug | FINER | DEBUG |
| | | | | FINE | DEBUG2 |
| | | | | CONFIG | DEBUG3 |
| Informational | Information | INFO | Info | INFO | INFO |
| Notice | | | | | INFO2 |
| Warning | Warning | WARN | Warn | WARNING | WARN |
| Error | Error | ERROR | Error | SEVERE | ERROR |
| Critical | Critical | | Dpanic | | ERROR2 |
| Emergency | | | Panic | | ERROR3 |
| Alert | | FATAL | Fatal | | FATAL |

## 参考文献 {#references}

- [データモデルの草稿の議論](https://docs.google.com/document/d/1ASjqT4eV0JKm-a15J508HEJ2-gbqdcM1Abud_Ek86Tc/edit?tab=t.0)

