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"
PROPERTY
はhostname
やsyslogtag
、msg
が使えます。
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"
PROPERTY
はhostname
やsyslogtag
、msg
が使えます。
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
コマンドでプロセスを再起動する事を忘れないでください。