rsyslogでログを送受信する設定方法を分かりやすく解説

Linuxをsyslogサーバーにするとログを一元化でき管理が楽になります。本記事ではLinuxで標準採用されているrsyslogの設定方法を解説します。

他のサーバーやネットワーク機器から送信されるログを保存したり、ログをリモートサーバーに送信する方法を解説しています。

rsyslogの設定

設定ファイル

  • /etc/rsyslog.conf
  • /etc/rsyslog.d/ファイル名.conf

特徴

2004年から開発が始まった次世代のsyslogです。syslogプロトコロルをベースにしており、従来のsyslog.confと後方互換があります。

多くのLinuxディストリビューションで標準のsyslogとして採用されています。

ログを受信する設定方法

UDPでログを受信する場合は次の2行をアンコメントアウトします。

module(load="imudp")
input(type="imudp" port="514")

TCPでログを受信する場合は次の2行をアンコメントアウトします。

module(load="imtcp")
input(type="imtcp" port="514")

UDPとTCPは同時に受信できますので、両方の設定を有効化できます。設定したらプロセスを再起動します。

systemctl restart rsyslog.service

Facility/Priorityベースのフィルター

受信したログをFacility/Priorityでフィルターできます。フィルターは次の構文を使います。

Facility.Priority

Facilityはキーワードもしくは数字で指定できます。指定できるのはkern (0), user (1)、mail (2)、daemon (3)、auth (4), syslog (5)、lpr (6)、news (7)、cron (8)、authpriv (9)、ftp (10)、および local0 ~ local7 (16 ~ 23)です。

Priorityもキーワードもしくは数字で指定できます。指定できるのはdebug (7)、info (6)、notice (5)、warning (4)、err (3)、crit (2)、alert (1)、および emerg (0)です。

次の例はすべてのカーネルメッセージを選択します。

kern.*

Priorityも指定したい場合はFacilityとPriorityを両方設定します。次の例はWan以上のカーネルメッセージを選択します。

kern.warn

すべてのログを選択するには次のようにします。

*.*

info または debug を除外したい場合は次のように指定できます。

cron.!info,!debug

フィルターの結果選択されたログの保存先を指定できます。Facilityがlocal0のすべてのログをファイルに保存するには次のようにします(保存先ファイル名は適宜設定する)。

local0.* /path/to/file

プロパティベースのフィルター

rsyslogはプロパティベースのフィルターをサポートします。構文は次のとおりです。

:PROPERTY, [!]COMPARE_OPERATION, "STRING"

PROPERTYhostnamesyslogtagmsgが使えます。

COMPARE_OPERATIONは比較方法です。次の比較方法が利用可能で、「!」を付けると否定となります。

contains

提供された文字列が、プロパティーで提供されたテキストのいずれかの部分に適合するかどうかをチェックします。

isequal

用意された文字列をプロパティーで提供されたすべてのテキストと比較します。これら 2 つの値が適合するには、完全に等しいものである必要があります。

startswith

提供された文字列が、プロパティーで提供されたテキストのちょうど最初にあるかどうかをチェックします。

regex

指定された POSIX BRE (Basic Regular Expression) をプロパティーが提供したテキストと比較します。

ereregex

指定された POSIX ERE (Extended Regular Expression) 正規表現をプロパティーが提供したテキストと比較します。

isempty

プロパティーが空かどうかをチェックします。値は破棄されます。これは、いくつかのフィールドが正規化の結果に基づいて設定される正規化データでの作業時に特に有用です。

STRINGはプロパティーが提供するテキストの比較対象となる値を指定します。この値は引用符で囲む必要があります。この文字列内の特定の文字をエスケープさせるには (たとえば、引用符 ("))、バックスラッシュ (\) を使用します。

よく使われるのはホスト名によるログの保存先変更です。以下の例はホスト名「foobar」と一致するログの保存先を指定しています(保存ファイル名は適宜指定する)。

:hostname, isequal, "foobar" /path/to/file

ログを送信する設定方法

Facility/Priorityベースのフィルター

送信するログをFacility/Priorityでフィルターできます。フィルターは次の構文を使います。

Facility.Priority

Facilityはキーワードもしくは数字で指定できます。指定できるのはkern (0), user (1)、mail (2)、daemon (3)、auth (4), syslog (5)、lpr (6)、news (7)、cron (8)、authpriv (9)、ftp (10)、および local0 ~ local7 (16 ~ 23)です。

Priorityもキーワードもしくは数字で指定できます。指定できるのはdebug (7)、info (6)、notice (5)、warning (4)、err (3)、crit (2)、alert (1)、および emerg (0)です。

特定のFacilityを指定したい場合はPriorityを*に設定します。次の例はすべてのメッセージを選択し送信します。

*.* @@192.168.2.1:514

ログの送信先には先頭に@を付けます。@がひとつの場合はUDP、@がふたつの場合はTCPで送信します。記載した例では@@192.168.2.1としているので、192.168.2.1へTCPでログを送信します。

:514はポート番号です。デフォルトは514番なので通常は:514とします。

プロパティベースのフィルター

rsyslogはプロパティベースのフィルターをサポートします。構文は次のとおりです。

:PROPERTY, [!]COMPARE_OPERATION, "STRING"

PROPERTYhostnamesyslogtagmsgが使えます。

COMPARE_OPERATIONは比較方法です。次の比較方法が利用可能で、「!」を付けると否定となります。

contains

提供された文字列が、プロパティーで提供されたテキストのいずれかの部分に適合するかどうかをチェックします。

isequal

用意された文字列をプロパティーで提供されたすべてのテキストと比較します。これら 2 つの値が適合するには、完全に等しいものである必要があります。

startswith

提供された文字列が、プロパティーで提供されたテキストのちょうど最初にあるかどうかをチェックします。

regex

指定された POSIX BRE (Basic Regular Expression) をプロパティーが提供したテキストと比較します。

ereregex

指定された POSIX ERE (Extended Regular Expression) 正規表現をプロパティーが提供したテキストと比較します。

isempty

プロパティーが空かどうかをチェックします。値は破棄されます。これは、いくつかのフィールドが正規化の結果に基づいて設定される正規化データでの作業時に特に有用です。

STRINGはプロパティーが提供するテキストの比較対象となる値を指定します。この値は引用符で囲む必要があります。この文字列内の特定の文字をエスケープさせるには (たとえば、引用符 ("))、バックスラッシュ (\) を使用します。

httpdのログを送信したい場合などにプロパティベースのフィルターを使うと便利です。

module(load="imfile" PollingInterval="15")
input(type="imfile" file="/var/log/httpd/access.log" tag="httpd-log-access")
input(type="imfile" file="/var/log/httpd/error.log" tag="httpd-log-error")
:syslogtag, startswith, "httpd-log" @@192.168.0.3:514

まずimfileをロードします。これは全体で1度だけ定義します。PollingIntervalはファイルを監視する秒単位の間隔です。デフォルトは10秒なので、10秒から変更したい場合に秒数を指定します(この例では15秒)。間隔を短くし過ぎるとシステム負荷となるので注意してください。

module(load="imfile" PollingInterval="15")

次にファイルを指定します。ファイルは複数指定でき、タグを付けます。この例ではアクセスログにはhttpd-log-accessというタグを付け、エラーログにはhttpd-log-errorというタグを付けています。

さいごにsyslogtagプロパティでフィルターします。次の例ではstartswithを使って先頭からhttpd-logで始まるタグにマッチすると192.168.0.3へTCPでログを送信します。

:syslogtag, startswith, "httpd-log" @@192.168.0.3:514

ログを受信する側でもタグを使ってフィルターするとアクセスログとエラーログを別々のファイルに保存できます。

受信側の例:

:syslogtag, isequal, "httpd-log-access" /path/to/access.log
:syslogtag, isequal, "httpd-log-error" /path/to/error.log

ログファイルの所有者とパーミッション

rsyslog.confで次のように設定されているはずです。

$FileOwner syslog
$FileGroup adm
$FileCreateMode 0640
$DirCreateMode 0755
$Umask 0022
$PrivDropToUser syslog
$PrivDropToGroup syslog

FileOwnerはログファイルの所有者、FileGroupはログファイルの所有グループです。ログを保存するディレクトリを新規に作成する場合はsyslogユーザーに書き込み権限が必要となります。

ログファイルのパーミッションはFileCreateModeで設定している640となります。この辺りは適宜変更してください(通常は変更する必要ありません)。

PrivDropToUserはrsyslogの実行ユーザーでPrivDropToGroupはrsyslogの実行グループとなります。

よくあるミス

設定を有効化してもログを受信できない場合、Firewallの設定を確認してください。

また、設定を変更した場合はsystemctl restart rsyslog.serviceコマンドでプロセスを再起動する事を忘れないでください。