syslogプロトコル再入門 ~パケットフォーマット(BSD形式とIETF形式)、Facility や Severity の判断基準~

スポンサーリンク
スポンサーリンク

syslog とは

syslogとは、UNIX系のシステムログを管理する機能です。一般的にはIPネットワーク経由でリモートホストのシステムログを取得するプロトコルを指すことが多いですが、本来はローカルホストのログとリモートホストの扱いを一元的に管理する機能です。

また、syslog は UDP を使うイメージが強いですが、TCPでの利用も可能です。ともにTCP/UDPポート番号は 514 番を使うのが一般的です。

一般的な構成では1台、もしくは2台のLinuxサーバをsyslogサーバとして動作させ、他のLinuxサーバやNW機器のsyslogを受信します。UDPの場合は再送がないため欠損の可能性がありますので、2台同時に送信するケースも多々あります。

なお、Linuxには標準で rsyslog(読み方:あーるしすろぐ)がインストールされており、syslogサーバとしてもsyslogクライアントとしても動作しますが、Windowsには標準ではsyslogを扱うことはできませんので、個別にNTsyslog等のソフトウェアをインストールする必要があります。

また、大抵のNW機器は設定によりsyslogクライアントとして動作させることができます。

syslogで送られる情報

syslogでは大きく以下の3つの情報が送受信できます。

  1. PRI(Priority): Facility と Severity の情報が含まれる
  2. HEADER: タイムスタンプやホスト名等が含まれる
  3. MSG: 自由記述

スポンサーリンク

どのようなエラーのときにどのようなFacility/Severity/MSGを出力するか』というのはすべてOS開発者やアプリケーション作成者がプログラミングの中で決定していきます。例えばルータの例外発生時の syslog の Severity に何を使うか、というのも、ルータのOS開発者が決定しているのです。

なのでメーカが異なればSeverityの基準が異なる可能性も十分あります。

Facility

Facilityとは、syslog の大分類のことです。RFC5424では以下のように定義されています。

Facilityの4番と10番のペア、および9番と15番のペアが同じ内容になっていますが、これには理由があります。このRFC5424の基になったRFC3164においても同様の定義がされているのですが、そもそもRFC3164は規格を定めたものではなく、『UNIX系syslog(BSD syslog)の動作および慣例を調査した結果、このように使われていますよ』という調査結果を記したものなのです。

つまり、内容が重複している項目については、色々なアプリケーションがそれぞれ異なるfacility番号を使っていた背景があるためなのです。

同様に、local0 ~ local7 もローカル用として予約されていましたが、現状ではあまり意識されず、リモートホスト(syslogサーバ)へ転送することが多いです。

スポンサーリンク

Severity

Severity とは、syslog の知らせる緊急度です。具体的には以下が定義されています。

Emergencyは比較的分かり易いですが、Alert, Critical は前述の通り、プログラマのさじ加減となりそうです。ErrorとWarning, WarningとNoticeあたりも境界は曖昧そうです。

syslog のパケットフォーマット

syslog のパケットフォーマットは2種類あります。1つがBSD形式(RFC3164)、もう1つはIETF形式(RFC5424)です。前述の通り、RFC3164は、フォーマットの規格を定めたわけではなく、BSDでどのような形式で使われているかを調査した結果をまとめたものです。

2009年に定められたRFC5424では「フォーマットの不統一性」や「認証がないことによる不正なログの差し込み」等を改善することを目的とし、規格化を行いました。具体的にはフォーマットを定め、また、TCPでの転送が可能になることを見越し、TLSによる認証・暗号化機能も実装されました。その後2012年にRFC6587によりTCPによる規格化も為されました。

BSD形式のフォーマット

まずはBSD形式のフォーマットから見ていきます。

スポンサーリンク

全て可変長のフィールドで、また、全てASCII文字列です。全て人間が目視するためのものなので、特にフィールドの長さを示すことはしていません。

PRI は Priority のことです。Severity と Priority をごっちゃにしてしまっている解釈も稀に見ますが、RFCの記述とは反しています

PRI は Facilityのコード番号を8倍したものと、Severityのコード番号を足した数字を、<>で囲み、ASCII文字で表現しています。例えばFacility=2 (mail system)、Severity=3 (Error) の場合は <21> という4ByteのASCII文字列が格納されます。

なお、RFC3164には『syslog のパケット長は 1024Byte 未満であること』と書かれています

IETF形式のフォーマット

次に、IETF形式を見ていきます。

スポンサーリンク

BSD形式と同じく、全てASCIIとなっており、長さを示すフィールドはありません。

PRI と TimeStamp, Hostname, MSG は BSD形式と同じです。

Version は RFC5424 のフォーマットが 01 となります。

App-Name は BSD形式 の Tag と同じく、アプリケーション名が入ります。

プロセスIDはログを吐いたプロセスのIDです。(起動時にOSから払い出される番号)

メッセージIDはsyslogメッセージの重複を検知するための識別子です。

Structured-Dataというのは、syslogに関連するパラメータをログするためのフィールドです。SD-IDというのが Structured-Data の識別子で、それに紐付き、1つ以上の SD-PARAM(属性と属性値のペア)が含まれます。また、SD-ID自体も1つのsyslogメッセージに1つ以上ですので、複数持つことも可能です。

また、RFC5424ではパケット長については2048Byteが目安として記されています。

syslog クライアントの設定(Ciscoルータの場合)

syslog クライアントは設定により、その機器で出力されたログの Facility と Severity がどのような値の場合に syslogサーバへ転送するかを決めることができます。

例えばciscoルータでは以下のように設定します。

(config)# service timestamps debug datetime msec localtime show-timezone
(config)# service timestamps log datetime msec localtime show-timezone
(config)# clock timezone JST 9
(config)# logging host 192.168.1.1 transport tcp port 514
(config)# logging trap warning
(config)# logging facility sys9

上記の例の場合、Severity が Warning以上(つまり4以下)の場合、Facility=sys9 にセットしたsyslogメッセージを 192.168.1.1 の TCP port=514 へ転送します。

スポンサーリンク
スポンサーリンク
スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

スポンサーリンク
スポンサーリンク