付録 A. 実装者向けガイドライン
本付録は、syslog プロトコルの実装者に非規範的な指針を提供する。
A.1. BSD Syslog との関係
RFC 3164 は、長年にわたって広く展開されてきた BSD syslog プロトコルを記述した。本書は RFC 3164 を廃止するが、重要な互換性を維持している。
主な相違点:
- VERSION フィールド: 本仕様は明示的な VERSION フィールドを追加する。旧来の実装はこのフィールドを認識しない。
- TIMESTAMP 形式: 本仕様は完全な日付、タイムゾーン、任意の小数秒を含む RFC 3339 時刻印を使用する。RFC 3164 は年およびタイムゾーンを含まないより単純な形式を用いた。
- STRUCTURED-DATA: 本仕様は構造化データ要素を導入する。RFC 3164 には同等の機構がない。
- MSG 形式: RFC 3164 の TAG フィールドは、HEADER 内の APP-NAME、PROCID、MSGID の各フィールドへ分割された。
相互運用性の考慮事項:
RFC 3164 システムと通信する場合:
- 旧来システムへの送信: 受信者が本仕様をサポートしない場合、RFC 3164 に従ってメッセージを整形する。転送送信者は、受信者の能力を検出するか、設定を可能にするべきである。
- 旧来システムからの受信: 本仕様に準拠する受信者は、RFC 3164 メッセージを解析できるべきである。受信者は、メッセージを本書で定義する形式へ変換してよい。
- リレーの動作: リレーは形式間でメッセージを変換する必要が生じる場合がある。本仕様から RFC 3164 へ変換する場合:
- VERSION フィールドを削除する。
- TIMESTAMP を
MMM DD HH:MM:SS形式に変換する。 - タイムゾーンおよび年の情報を捨てる。
- STRUCTURED-DATA を削除するか MSG に追加する。
- APP-NAME と PROCID から TAG を再構成する。
- RFC 3164 から本仕様への変換:
- VERSION を 1 に設定する。
- 時刻印に現在の年を追加する。
- リレーのタイムゾーンまたは UTC を用いる。
- TAG を APP-NAME と PROCID に解析する(可能な範囲で)。
- 決定できない場合は MSGID を NILVALUE に設定する。
A.2. メッセージ長
受信者に求められる最小容量 480 オクテットには、実用上の意味がある。
なぜ 480 オクテットか?
- 多くのネットワークでフラグメント化なしの単一 UDP パケットに収まる。
- 劣化したネットワークで配達される可能性が高い。
- 制約のある実装と互換性がある。
影響:
- 重大メッセージ: セキュリティ警報および運用上の緊急事態は 480 オクテット以内に収めるべきである。
- トラブルシューティングデータ: 診断メッセージを簡潔に保つ。
- 重要データを先に置く: 重要な情報をメッセージの先頭側に配置する。
より大きなメッセージ:
多くの現代的な展開は、はるかに大きいメッセージをサポートする。
- TLS 転送では通常、数十または数百キロバイトを許容する。
- TCP 転送には実用上のサイズ上限がない。
- 現代的な実装はしばしば 2048、8192、またはそれ以上のメッセージをサポートする。
推奨事項:
- 展開要件に基づいて最大メッセージサイズを設定する。
- 重要なメタデータには STRUCTURED-DATA を使用する(メッセージ長に数える)。
- 使用する環境で最大メッセージサイズを試験する。
- 過大なメッセージを適切に扱う処理(切詰めまたは拒否)を実装する。
- 収集器で切り詰められたメッセージを監視する。
UTF-8 に関する考慮事項:
メッセージ長は文字数ではなくオクテット数で測定する。非 ASCII 文字を含む 1000 文字の UTF-8 文字列は、3000 オクテット以上になる場合がある。実装者はメッセージサイズを決めるときにこれを考慮しなければならない。
A.3. Severity 値
Severity 値を適切に用いると、メッセージの有用性が向上する。
指針:
- Emergency (0): 真の緊急事態に限って控えめに使用する。
- システムが完全に使用不能である。
- 重要なハードウェアの障害が差し迫っている。
- データ損失が発生している。
- Alert (1): 即時の対応が必要である。
- サービス停止。
- セキュリティ侵害を検出した。
- 重要リソースの枯渇が差し迫っている。
- Critical (2): 重大な状態。
- ハードドライブ障害。
- 主ネットワーク接続の喪失。
- アプリケーションのクラッシュ。
- Error (3): エラー状態。
- 重大ではないサービス障害。
- 回復可能なエラー。
- 接続タイムアウト。
- Warning (4): 警告状態。
- リソース使用量が上限に近づいている。
- 非推奨機能の使用。
- 構成上の問題。
- Notice (5): 通常だが重要な状態。
- サービスの開始/停止。
- 構成変更。
- セキュリティに関連する通常イベント。
- Informational (6): 情報メッセージ。
- 通常運用。
- 状態メッセージ。
- 接続確立。
- Debug (7): デバッグレベルのメッセージ。
- 詳細な診断情報。
- 開発者向けメッセージ。
- 本番環境では無効にすべきである。
構成上の考慮事項:
管理者が次を実行できるようにする。
- 展開要件ごとに Severity の割当てを調整する。
- Severity によってメッセージをフィルタする。
- Severity を異なる収集器へルーティングする。
- 特定のメッセージ種別の Severity を上書きする。
Severity の乱用を避ける:
- すべてのメッセージを Emergency として記録しない。
- 本番イベントに Debug の Severity を使用しない。
- 運用者の警報疲れを考慮する。
A.4. TIME-SECFRAC の精度
TIMESTAMP フィールドは、最大 6 桁(マイクロ秒)の小数秒をサポートする。
よくある誤り:
先行するゼロを落とすこと:
誤: 2003-10-11T22:13:14.3 (300ms に見える)
正: 2003-10-11T22:13:14.003 (実際は 3ms)
精度に関する推奨事項:
- 多くのアプリケーションではミリ秒(3 桁)を使用する。
- 高精度の時刻測定にはマイクロ秒(6 桁)を使用する。
- サブ秒精度が不要なら小数秒を省略する。
- 時刻同期(NTP)が必要な精度をサポートすることを確保する。
実装上の注意:
すべてのシステムがマイクロ秒精度を提供できるわけではない。次の処理は許容される。
- 6 桁より少ない精度を提供する。
- 利用可能な精度に丸めるか切り捨てる。
- 精度を利用できない場合は TIME-SECFRAC 全体を省略する。
A.5. 名前の大文字小文字規約
本書は SD-ID および PARAM-NAME に「lower camel case」を使用する。
規約:
- 最初の文字は小文字。
- 後続する各単語の先頭文字は大文字。
- ハイフンおよびアンダースコアは使用しない。
例:
timeQualitysyncAccuracyenterpriseIdmyCompanyName
利点:
- 実装間の一貫性。
- 可読性。
- 多様なプログラミング言語との互換性。
推奨事項:
次の名前にはこの規約を使用する。
- 新しい SD-ID
- PARAM-NAME
- 拡張識別子
私用実装は別の規約を使用してもよいが、一貫性が推奨される。
A.6. 時刻を認識しない Syslog アプリケーション
6.2.3 節は、時刻が不明な場合に TIMESTAMP として NILVALUE を許可する。
TIMESTAMP に NILVALUE を使用する場合:
- リアルタイムクロックを持たない組込みシステム。
- 時刻同期前の起動時メッセージ。
- 時刻取得に失敗したシステム。
NILVALUE を使用しない場合:
- OS が時刻関数を提供する場合。
- 実装を簡略化するために時刻処理を避けようとする場合。
- 時刻は利用可能だが取得が不便なだけの場合。
推奨事項:
- 可能な限り有効な TIMESTAMP を出力する。
- 時刻の取得が真に不可能な場合だけ NILVALUE を使用する。
- タイムゾーンと精度のトレードオフを考慮する。
- 実装における時刻処理を文書化する。
リレーの処理:
NILVALUE TIMESTAMP を持つメッセージを受信したリレーは、次のいずれかを行ってよい。
- 変更せずに転送する。
- リレーの現在時刻に置換する。
- メッセージを捨てる(ポリシーが時刻印を必要とする場合)。
構成でこの動作を制御するべきである。
A.7. timeQuality SD-ID に関する注意
timeQuality SD-ID は、時刻印の正確さに関する有益なメタデータを提供する。
tzKnown パラメータ:
次の場合を除き、既定値は 0(不明)にすべきである。
- 管理者がタイムゾーンを明示的に設定している。
- OS が信頼できるタイムゾーン情報を提供する。
- システムが外部ソースに対してタイムゾーンを検証している。
isSynced パラメータ:
次の場合だけ 1 に設定する。
- NTP または他の時刻同期が有効である。
- 同期の成功を検証済みである。
- 時刻ソースが信頼できる。
syncAccuracy パラメータ:
次の場合だけ提供する。
- 実際の精度が既知である(NTP 統計から得る)。
- 管理者が期待精度を設定している。
- 測定データがその主張を裏付ける。
精度を過大に主張しない:
誤った精度はログへの信頼を損なう。不確かな場合は、次の方法がよりよい。
- timeQuality を完全に省略する。
- 控えめな精度推定を提供する。
- 精度に関する主張を文書化する。
A.8. UTF-8 符号化と BOM
BOM(Byte Order Mark)は、MSG フィールドにおける UTF-8 符号化を示す。
BOM の詳細:
- バイト列:
0xEF 0xBB 0xBF - MSG フィールドの先頭に置く。
- 後続が UTF-8 符号化であることを示す。
BOM を含める場合:
- MSG が UTF-8 符号化テキストを含む場合。
- UTF-8 符号化であることが確実な場合。
- 組織のポリシーとの一貫性のため。
BOM を省略する場合:
- MSG の符号化が未知または不確かな場合。
- MSG がバイナリデータを含む場合。
- BOM を扱えないシステムとの後方互換性のため。
受信者の処理:
受信者は次を行うべきである。
- BOM の存在を検出する。
- それに応じて UTF-8 を処理する。
- BOM のないメッセージを扱う(符号化は未知と仮定する)。
- エンドユーザーへ BOM を表示しない。
リレーの処理:
メッセージを転送するリレーは次を行うべきである。
- 存在する BOM を保持する。
- UTF-8 へトランスコードする場合を除き BOM を追加しない。
- 別の符号化へトランスコードする場合を除き BOM を削除しない。