とはいえ小規模な環境で有償のソフトウェアを導入することは、費用面や構築負荷といった面で割に合わないこともあるため、とりあえずログを保管するだけで詳細な分析は不要であれば、OSの標準機能で実装してしまう方が手っ取り早い。
今回はLinuxの標準機能であるrsyslogとlogrotateを組み合わせて、ログ保管サーバーの構築を行う。
環境
今回は仮想スイッチVyOSのログをSyslogにて受信し、5日分のログを保管できるように設定することにする。参考までに、VyOSのSyslog設定を以下に記載する。
# show system syslog
------------------------------
global {
facility all {
level notice
}
facility protocols {
level debug
}
}
host 192.168.33.22 {
facility all {
level debug
}
}
------------------------------
rsyslogの設定
UDP/514ポートを使ったSyslog受信設定を行ったうえで、送信元のIPアドレスをもとに出力ファイルを指定する。設定は以下の通りとなる。
# cat /etc/rsyslog.conf | grep -v -e "^#" -e "^$"
------------------------------
$ModLoad imuxsock # provides support for local system logging (e.g. via logger command)
$ModLoad imklog # provides kernel logging support (previously done by rklogd)
$ModLoad imudp ←UDPによるSyslogメッセージ入力を許可
$UDPServerRun 514 ←UDPの待ち受けポートを514に設定
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
$IncludeConfig /etc/rsyslog.d/*.conf
:fromhost-ip, isequal, "192.168.33.31" -/var/log/t3031vy11.log
& ~
↑送信元IPアドレスに対して、出力先のログを指定。"& ~"を付けることで、直前の条件に一致したログを破棄する
*.info;mail.none;authpriv.none;cron.none /var/log/messages
authpriv.* /var/log/secure
mail.* -/var/log/maillog
cron.* /var/log/cron
*.emerg *
uucp,news.crit /var/log/spooler
local7.*
------------------------------
:fromhost-ipの行はプロパティベースのフィルターと呼ばれる。構文は以下の通りとなる。
:PROPERTY, [!]COMPARE_OPERATION, "STRING" LOGFILE
左から順に見ていこう。
①PROPERTY
今回はIPアドレスでフィルターするため、「fromhost-ip」で指定する。利用できるPROPERTYの値は以下を参照。・rsyslog Properties
http://www.rsyslog.com/doc/master/configuration/properties.html
②[!]COMPARE_OPERATION, "STRING"
今回はIPアドレスで「一致」を条件とするため、「isequal, "192.168.33.31"」とする。isequalの前に!を付ければ否定となり「一致しないこと」が条件となる。その他比較処理については、以下表を参照すること。- contains:テキストを含む。大文字小文字を区別する
- contains_i:テキストを含む。大文字小文字を区別しない
- isequal:テキストと一致
- regex: POSIX BRE (Basic Regular Expression)による比較
- ereregex: POSIX ERE (Extended Regular Expression) 正規表現による比較
- isempty:空かどうかを比較 (この際の”STRING"の記載方法が不明)
③LOGFILE
出力先のログファイルを指定する。ログファイル名の前に「-」を指定すると書き込みが非同期で行われ、パフォーマンスが向上するが、サーバー停止時に一部ログの欠損が発生する可能性がある。logrotateの設定
以下の内容でファイルを新規作成する。今回は日次5世代のローテーション設定を行う。# cat /etc/logrotate.d/remotelog
------------------------------
/var/log/t3031vy11.log {
missingok ←ログファイルが存在しない場合でもエラーとしない
notifempty ←ログファイルが空ならローテーションしない
daily ←日次で実行
compress ←圧縮。デフォルトではgzを圧縮コマンドとして利用
rotate 5 ←5世代の過去ファイルを保管
postrotate ←ローテーション後コマンド(次行~endscriptまで)を実行
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
endscript ←コマンドの終わり
}
------------------------------
このファイルの作成ディレクトリである/etc/logrotate.dは、/etc/logrotate.confでインクルードされているため、ファイルを置くだけで設定を反映することができる。
なお、logrotateはただのコマンドとして提供されており、サービス化されていない。そのため、設定反映の際に、サービス再起動や設定ファイルの再読み込み作業は不要となる。
設定確認コマンドは以下の通りとなる。
# logrotate -d /etc/logrotate.conf
------------------------------
reading config file /etc/logrotate.conf
including /etc/logrotate.d
reading config file ConsoleKit
reading config info for /var/log/ConsoleKit/history
~(中略)~
reading config info for /var/log/t3031vy11.log
~(中略)~
empty log files are not rotated, old logs are removed
considering log /var/log/t3031vy11.log
log does not need rotating
not running postrotate script, since no logs were rotated
~(以下略)~
------------------------------
logrotateの実行時間について
ここでlogrotateの実行時間についても記載しておく。logrotateはanacronで制御されており、日次、週次、月次の実行処理があらかじめ設定されている。実際にanacronの実行制御の設定を見てみる。
# cat /etc/anacrontab
------------------------------
SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
RANDOM_DELAY=45 ←各ジョブのdelay in minutes + 最大45分の遅延
START_HOURS_RANGE=3-22 ←3時-22時の間でジョブを実行(サーバー停止等がなければ3時開始)
#period in days delay in minutes job-identifier command
1 5 cron.daily nice run-parts /etc/cron.daily ←日次処理
7 25 cron.weekly nice run-parts /etc/cron.weekly ←週次処理
@monthly 45 cron.monthly nice run-parts /etc/cron.monthly ←月次処理
------------------------------
上記より、日次処理の場合、3:05~3:50の間でlogrotateが実行されることがわかる。
# cat /etc/cron.daily/logrotate
------------------------------
#!/bin/sh
/usr/sbin/logrotate /etc/logrotate.conf ←logrotateコマンドを実行
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
/usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0
------------------------------
実際に作成されたログファイルを確認してみると、3:05~3:50の間でgz形式で圧縮されたファイルが5つ生成されていることがわかる。
# cd /var/log/
# ls -l t3031vy11.log*
------------------------------
-rw------- 1 root root 1233016 12月 4 10:06 2017 t3031vy11.log
-rw------- 1 root root 305117 11月 30 03:48 2017 t3031vy11.log-20171130.gz
-rw------- 1 root root 229191 12月 1 03:44 2017 t3031vy11.log-20171201.gz
-rw------- 1 root root 262123 12月 2 03:29 2017 t3031vy11.log-20171202.gz
-rw------- 1 root root 373297 12月 3 03:49 2017 t3031vy11.log-20171203.gz
-rw------- 1 root root 294881 12月 4 03:25 2017 t3031vy11.log-20171204.gz
------------------------------
参考
・rsysloghttp://www.rsyslog.com/
・20.2. RSYSLOG の基本設定
https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/system_administrators_guide/s1-basic_configuration_of_rsyslog
・第21章 システムタスクの自動化
https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/6/html/deployment_guide/ch-automating_system_tasks
0 件のコメント:
コメントを投稿