6. Syslog メッセージフォーマット (Syslog Message Format)
syslog メッセージは以下の ABNF 定義を持ちます:
SYSLOG-MSG = HEADER SP STRUCTURED-DATA [SP MSG]
HEADER = PRI VERSION SP TIMESTAMP SP HOSTNAME
SP APP-NAME SP PROCID SP MSGID
PRI = "<" PRIVAL ">"
PRIVAL = 1*3DIGIT ; range 0 .. 191
VERSION = NONZERO-DIGIT 0*2DIGIT
HOSTNAME = NILVALUE / 1*255PRINTUSASCII
APP-NAME = NILVALUE / 1*48PRINTUSASCII
PROCID = NILVALUE / 1*128PRINTUSASCII
MSGID = NILVALUE / 1*32PRINTUSASCII
TIMESTAMP = NILVALUE / FULL-DATE "T" FULL-TIME
FULL-DATE = DATE-FULLYEAR "-" DATE-MONTH "-" DATE-MDAY
DATE-FULLYEAR = 4DIGIT
DATE-MONTH = 2DIGIT ; 01-12
DATE-MDAY = 2DIGIT ; 01-28, 01-29, 01-30, 01-31
FULL-TIME = PARTIAL-TIME TIME-OFFSET
PARTIAL-TIME = TIME-HOUR ":" TIME-MINUTE ":" TIME-SECOND
[TIME-SECFRAC]
TIME-HOUR = 2DIGIT ; 00-23
TIME-MINUTE = 2DIGIT ; 00-59
TIME-SECOND = 2DIGIT ; 00-59
TIME-SECFRAC = "." 1*6DIGIT
TIME-OFFSET = "Z" / TIME-NUMOFFSET
TIME-NUMOFFSET = ("+" / "-") TIME-HOUR ":" TIME-MINUTE
STRUCTURED-DATA = NILVALUE / 1*SD-ELEMENT
SD-ELEMENT = "[" SD-ID *(SP SD-PARAM) "]"
SD-PARAM = PARAM-NAME "=" %d34 PARAM-VALUE %d34
SD-ID = SD-NAME
PARAM-NAME = SD-NAME
PARAM-VALUE = UTF-8-STRING
SD-NAME = 1*32PRINTUSASCII
MSG = MSG-ANY / MSG-UTF8
MSG-ANY = *OCTET
MSG-UTF8 = BOM UTF-8-STRING
BOM = %xEF.BB.BF
UTF-8-STRING = *OCTET
OCTET = %d00-255
SP = %d32
PRINTUSASCII = %d33-126
NONZERO-DIGIT = %d49-57
DIGIT = %d48 / NONZERO-DIGIT
NILVALUE = "-"
メッセージは以下で構成されます:
- HEADER: メッセージに関するメタデータ (優先度、バージョン、タイムスタンプ、送信元情報) を含む
- STRUCTURED-DATA: 名前と値のペアでのオプションの構造化情報
- MSG: オプションの自由形式メッセージコンテンツ
6.1. メッセージ長 (Message Length)
Syslog メッセージは UDP トランスポートで 480 オクテットを超えてはなりません。これにより、制限されたネットワーク実装との互換性が保証されます。
Syslog 受信者は、最大 480 オクテットのメッセージを受け入れることができなければなりません。受信者は、最大 2048 オクテットのメッセージを受け入れることができるべきです (SHOULD)。
Syslog 送信者は、480 オクテットより長いメッセージを送信してもかまいません (MAY)。ただし、必要に応じてメッセージの切り捨てまたは分割メカニズムを実装すべきです (SHOULD)。
トランスポートマッピングは、異なる最大メッセージサイズを指定してもかまいません (MAY)。例えば、TLS トランスポートは通常、はるかに大きなメッセージを許可します。
メッセージ長はオクテットで測定され、文字ではありません。UTF-8 エンコーディングでは、1 文字あたり複数のオクテットになる場合があります。
6.2. HEADER
HEADER には、この正確な順序で以下のフィールドが含まれます:
6.2.1. PRI
PRI 部分には、角括弧で囲まれた Priority 値が含まれます。Priority 値は Facility と Severity の値から計算されます:
Priority = Facility * 8 + Severity
Facility 値:
| 値 | Facility |
|---|---|
| 0 | kernel messages |
| 1 | user-level messages |
| 2 | mail system |
| 3 | system daemons |
| 4 | security/authorization messages |
| 5 | messages generated internally by syslogd |
| 6 | line printer subsystem |
| 7 | network news subsystem |
| 8 | UUCP subsystem |
| 9 | clock daemon |
| 10 | security/authorization messages |
| 11 | FTP daemon |
| 12 | NTP subsystem |
| 13 | log audit |
| 14 | log alert |
| 15 | clock daemon |
| 16-23 | local use 0-7 (local0 - local7) |
Severity 値:
| 値 | Severity | 説明 |
|---|---|---|
| 0 | Emergency | システムは使用不可 |
| 1 | Alert | 即座にアクションを取る必要がある |
| 2 | Critical | 重大な状態 |
| 3 | Error | エラー状態 |
| 4 | Warning | 警告状態 |
| 5 | Notice | 通常だが重要な状態 |
| 6 | Informational | 情報メッセージ |
| 7 | Debug | デバッグレベルメッセージ |
例: Facility 4 (security/authorization) と Severity 2 (Critical) を持つメッセージの Priority 値:
Priority = 4 * 8 + 2 = 34
PRI = "<34>"
PRI 値は 0 から 191 の間でなければなりません。
6.2.2. VERSION
VERSION フィールドは syslog プロトコルのバージョンを示します。本文書はバージョン 1 を定義します。VERSION 値は 1-999 の範囲の非ゼロ整数でなければなりません。
6.2.3. TIMESTAMP
TIMESTAMP フィールドは、メッセージが生成された時刻を示すフォーマットされたタイムスタンプです。記述されているイベントが発生した時刻を表すべきです (SHOULD)。
タイムスタンプフォーマットは、以下の要件を持つ RFC 3339 に基づいています:
- YYYY-MM-DD 形式の日付
- 時刻セパレーター "T"
- HH:MM:SS 形式 (24 時間制) の時刻
- オプションの小数秒 (最大 6 桁)
- タイムゾーンオフセット (UTC の場合は "Z"、または "+/-HH:MM")
例:
2003-10-11T22:14:15.003Z
2003-08-24T05:14:15.000003-07:00
2009-03-12T18:53:01+00:00
発信元が時刻を知らない場合、NILVALUE ("-") を使用しなければなりません (MUST)。
ベストプラクティス:
- 可能な場合は一貫性のために UTC タイムゾーン (Z) を使用
- 精度が重要な場合は小数秒を含める
- 正確なタイムスタンプのための時刻同期 (NTP) を確保
6.2.4. HOSTNAME
HOSTNAME フィールドは、syslog メッセージを最初に生成したマシンを識別します。以下のいずれかを含むべきです (SHOULD):
- 完全修飾ドメイン名 (FQDN) - 推奨 (RECOMMENDED)
- 静的 IP アドレス
- ホスト名
- 動的 IP アドレス
- 不明な場合は NILVALUE ("-")
FQDN は最も正確な識別を提供するため、推奨されるフォーマットです。
IPv6 アドレスを使用する場合、角括弧で囲むべきです (SHOULD)。
最大長: 255 ASCII 印刷可能文字。
6.2.5. APP-NAME
APP-NAME フィールドは、メッセージを生成したデバイスまたはアプリケーションを識別します。スペースのない自由形式の文字列です。
例:
myapp
su
postfix/smtpd
最大長: 48 ASCII 印刷可能文字。
APP-NAME が不明な場合は、NILVALUE ("-") を使用します。
6.2.6. PROCID
PROCID フィールドは、プロセスが開始または再起動されるたびに変更される値です。通常、以下が含まれます:
- Unix ライクシステムのプロセス ID (PID)
- スレッド ID
- プロセス名
- その他の一意識別子
例:
12345
thread1
-
最大長: 128 ASCII 印刷可能文字。
PROCID が使用されない場合は、NILVALUE ("-") に設定します。
6.2.7. MSGID
MSGID フィールドは、メッセージのタイプを識別します。自動解析とルーティングに使用できる、スペースのない自由形式の文字列です。
例:
ID47
TCPIN
login-failure
config-change
最大長: 32 ASCII 印刷可能文字。
MSGID が使用されない場合は、NILVALUE ("-") に設定します。
6.3. STRUCTURED-DATA
STRUCTURED-DATA は、情報を構造化された、容易に解析可能な形式で表現するメカニズムを提供します。1 つ以上の SD-ELEMENT で構成されます。
6.3.1. SD-ELEMENT
SD-ELEMENT は以下で構成されます:
- SD-ID (識別子)
- 0 個以上の SD-PARAM (パラメーター)
フォーマット: [SD-ID PARAM1="value1" PARAM2="value2" ...]
6.3.2. SD-ID
SD-ID は、要素のタイプと目的を一意に識別します。
IANA 登録 SD-ID: =、]、"、およびスペースを除く印刷可能な ASCII 文字で構成されます。
プライベートエンタープライズ SD-ID: name@<private enterprise number> の形式でなければなりません。ここで、エンタープライズ番号は IANA に登録されています。
例:
timeQuality
origin
myCompany@32473
6.3.3. SD-PARAM
各 SD-PARAM は名前と値のペアです:
PARAM-NAME="PARAM-VALUE"
PARAM-VALUE は UTF-8 を使用してエンコードされなければなりません (MUST)。特殊文字はエスケープする必要があります:
"は\"になる\は\\になる]は\]になる
例:
[exampleSDID@32473 iut="3" eventSource="Application" eventID="1011"]
同じパラメーター名に対して複数の値を許可するには、パラメーターを繰り返します:
[example ip="192.0.2.1" ip="192.0.2.2"]
6.3.4. 変更管理 (Change Control)
新しい SD-ID は IANA を通じて登録できます。詳細についてはセクション 9 を参照してください。
プライベートエンタープライズは、登録されたエンタープライズ番号を使用して、登録なしでプライベート SD-ID を作成できます。
6.3.5. 例
単一 SD-ELEMENT:
[exampleSDID@32473 iut="3" eventSource="Application" eventID="1011"]
複数 SD-ELEMENT:
[exampleSDID@32473 iut="3"][examplePriority@32473 class="high"]
構造化データなし:
-
6.4. MSG
MSG 部分には自由形式のメッセージテキストが含まれます。2 つの可能なフォーマットがあります:
- MSG-ANY: オクテットの任意のシーケンス
- MSG-UTF8: BOM (Byte Order Mark: 0xEF 0xBB 0xBF) で始まる UTF-8 文字列
MSG が UTF-8 BOM で始まる場合、コレクターまたはリレーは MSG が UTF-8 でエンコードされていると仮定すべきです (SHOULD)。それ以外の場合、エンコーディングは指定されていません。
MSG 部分はオプションです。存在しない場合、メッセージの終わりの前に SP はありません。
ベストプラクティス:
- 一貫した国際文字サポートのために BOM 付き UTF-8 エンコーディングを使用
- 改行やその他の制御文字を含めることを避ける
- 重要な情報をメッセージの早い段階に保つ (最初の 480 オクテット内)
6.5. 例
例 1: すべてのフィールドと構造化データを持つ完全なメッセージ
<34>1 2003-10-11T22:14:15.003Z mymachine.example.com su - ID47 [exampleSDID@32473 iut="3" eventSource="Application" eventID="1011"] BOMsystem crashed
例 2: NILVALUE フィールドを持つメッセージ
<165>1 2003-08-24T05:14:15.000003-07:00 192.0.2.1 myproc 8710 - - %% It's time to make the do-nuts.
例 3: UTF-8 コンテンツと複数の SD-ELEMENT を持つメッセージ
<165>1 2003-10-11T22:14:15.003Z mymachine.example.com evntslog - ID47 [exampleSDID@32473 iut="3" eventSource="Application" eventID="1011"][examplePriority@32473 class="high"] BOMAn application event log entry...
例 4: 最小限のメッセージ (緊急カーネルメッセージ)
<0>1 2009-03-12T18:53:01+00:00 server1 kernel - - - System will shutdown