rsyslogdの情報確認
バージョンと使える機能
rsyslogd -v
[root@sakue ~]# rsyslogd -v rsyslogd 8.24.0-41.el7_7.4, compiled with: PLATFORM: x86_64-redhat-linux-gnu PLATFORM (lsb_release -d): FEATURE_REGEXP: Yes GSSAPI Kerberos 5 support: Yes FEATURE_DEBUG (debug build, slow code): No 32bit Atomic operations supported: Yes 64bit Atomic operations supported: Yes memory allocator: system default Runtime Instrumentation (slow code): No uuid support: Yes Number of Bits in RainerScript integers: 64 See http://www.rsyslog.com for more information.
rsyslogdの動作状況
systemctl status rsyslog
[root@sakue ~]# systemctl status rsyslog ● rsyslog.service - System Logging Service Loaded: loaded (/usr/lib/systemd/system/rsyslog.service; enabled; vendor preset: enabled) Active: active (running) since 火 2020-10-20 09:39:29 JST; 6min ago Docs: man:rsyslogd(8)Main PID: 2876 (rsyslogd) CGroup: /system.slice/rsyslog.service └─2876 /usr/sbin/rsyslogd -n 10月 20 09:39:29 sakue.com rsyslogd[2876]: [origin software="rsyslogd" swVersio...rt Hint: Some lines were ellipsized, use -l to show in full.RSyslog Documentation - rsyslog
設定ファイルの構文チェック
rsyslogd -N 1
[root@sakue ~]# rsyslogd -N 1 rsyslogd: version 8.24.0-41.el7_7.4, config validation run (level 1), master config /etc/rsyslog.conf rsyslogd: End of config validation run. Bye.
警告が出る場合は「-c 5」オプションも付けます。
rsyslogd -N 1 -c 5
これは互換性のためのオプションなので、「-c 5」でも警告が出る場合は「-c 3」など値を小さくしてみてください。
設定ファイルの構文チェック(設定ファイルを指定)
チェックする設定ファイルを指定する場合は「-f」オプションを使います。
実環境に影響することなくテスト用の設定ファイルをチェックできますね。
rsyslogd -N 1 -f /etc/test.conf
[root@sakue]# rsyslogd -N 1 -f /etc/test.conf rsyslogd: version 8.24.0-41.el7_7.4, config validation run (level 1), master config /etc/test.conf rsyslogd: error during parsing file /etc/test.conf, on or before line 6: warnings occured in file '/etc/test.conf' around line 6 [v8.24.0-41.el7_7.4 try http://www.rsyslog.com/e/2207 ]
上記は6行目でエラーが出ている場合の例です。
設定ファイル
/etc/rsyslog.conf が設定ファイルで、これを修正するだけと非常にシンプルです。
修正後は以下で反映されます。
systemctl restart rsyslog
独自のログファイルへ出力する場合は、ログのローテーションも必ず行うようにする必要がありますので注意してください。
rsyslogdでの振り分け
基本
rsyslog.confは上から順番に評価されていき、停止の「& stop」が出現しないかぎり、一致してもさらに先に進みます。
このため、書き方によってログが多重に出力されたり、先の条件で一致して「& stop」している場合は、それ以降にルールを記述しても出力されないという状態になりますので注意が必要です。
ログの部位と名称
例えばiptablesのログを振り分ける場合は以下のようにしますが、先頭の「:msg,」でログの部位を指定しています。
:msg, contains, "IPTABLES" /var/log/iptables.log
ログ例
例えば以下のような出力を例にしてみます。
Oct 20 07:44:32 sakue kernel: [IPTABLES drop_broadcast] : IN=enp3s0f0 OUT= MAC=ff:ff:ff:ff:ff:ff:98:46:0a:bb:dc:54:08:00 SRC=0.0.0.0 DST=255.255.255.255 LEN=328 TOS=0x00 PREC=0x00 TTL=255 ID=5860 PROTO=UDP SPT=68 DPT=67 LEN=308
timegenerated
日時で、ログ例だと「Oct 20 07:44:32」の部分に該当します。
hostname
ホスト名部分で、ログ例だと「sakue」の部分に該当します。
syslogtag
syslogのタグ部分で、ログ例だと「kernel」の部分に該当します。
mysqldの場合は以下のような感じです。
:syslogtag,startswith,"mysqld" /var/log/mysqld.log & stop
msg
それ以降のメッセージ部分に該当します。
fail2banの場合は以下のような感じです。
:msg, regex, "f2b-.*DROP" /var/log/iptables.log & stop
ログの出力先
以下はログ部位の「msg」に「IPTABLES」が含まれている場合、「/var/log/iptables.log」に出力します。
ただし、「rsyslog.conf」で一致した行があってログを指定先に吐き出しても、さらに次の行を評価していくため、他でも一致すると二重三重にログが出力されてしまいます(それが目的ならOKです)
:msg, contains, "IPTABLES" /var/log/iptables.log
二重に出力しないためには次の行に「& stop」と記述します。
これで一致した場合は次からの行は評価されず、ここで終わります。
:msg, contains, "IPTABLES" /var/log/iptables.log & stop
従来は「stop」でなく「~」で同じ動作をしていましたが、現行バージョンだとエラーにはならないものの、廃止予定の非推奨な記述方法になり、/var/log/messagesに以下の警告が出てしまうので「stop」にしましょう。
Aug 1 16:02:01 sakue rsyslogd: warning: ~ action is deprecated, consider using the 'stop' statement instead [v8.24.0-34.el7 try http://www.rsyslog.com/e/2307 ]
比較オプション
「contains」「startswith」と、正規表現の「regex」が便利なので、この3つくらいしか普段使わないですね。
contains
文字列がプロパティの一部に含まれる場合に一致します。
:msg, contains, "IPTABLES" /var/log/iptables.log
isequal
文字列がプロパティと完全に同じ場合に一致します。
startswith
指定文字列でプロパティが始まる場合に一致します。
例えば「syslogtag」が「zmc_」で始まるという条件は以下のように書きます。
:syslogtag,startswith,"zmc_" /var/log/zoneminder/zm.log
regex
一致条件を正規表現で記述します。
fail2banのルールによりiptablesで遮断されたログの振り分け例です。
「msg」内で正規表現の「f2b-.*DROP」に一致した場合は /var/log/iptables.log へ出力します。
:msg, regex, "f2b-.*DROP" /var/log/iptables.log
ereregex
一致条件を拡張された正規表現で記述します。
!
比較オプションの先頭に「!」をつけると否定になります。
ファシリティ(種別)
ファシリティはログの種別のことで、おおまかに分類する場合に使用します。
rsyslog.confだと下部あたりに記述してあるので、他の条件に一致しない場合はこれで振り分けが行われます。
kern
カーネル関連のメッセージ
user
ユーザープロセスのメッセージ
メールシステムのメッセージ(sendmailやpostfixなど)
デフォルト:
mail.* -/var/log/maillog
ftp
FTPのメッセージ
news
ニュースサブシステムのメッセージ
デフォルトではクリティカル(crit)だけ以下が指定されていました。
uucp,news.crit /var/log/spooler
lpr
ラインプリンタのメッセージ
auth
認証システムのメッセージ(login、su、gettyなど)
authpriv
プライベートな認証関連のメッセージ
デフォルト:
authpriv.* /var/log/secure
daemon
デーモンのメッセージ(ftpdやnamedなど)
cron
cronやatシステム関連のメッセージ
デフォルト:
cron.* /var/log/cron
uucp
UUCPサブシステムのメッセージ
デフォルト:
uucp,news.crit /var/log/spooler
syslog
syslog 内部のメッセージ
local0 ~ local7
独自のファシリティとして使用することができます。
例えばルータのログをサーバへ転送する際などはこれを利用します。
mark
20秒ごとにメッセージを送り出すタイムスタンプ機能
*
markを除く全てのファシリティ
プライオリティ(重要度)
rsyslog.confを見ると、「news.crit」や「mail.none」などの文字が確認できますが、ドット(.)以降の部分がプライオリティ(重要度)です。
プライオリティを指定すると、それ以上のレベルが対象になります。
例えばファシリティが「mail」の場合に「mail.warning」とすると、「warning」「err」「crit」「alert」「emerg」が対象になります。
emerg
サーバが動作できないほどの重大なエラー。
alert
critよりも重大なエラー。
crit
重大なエラー。
err
一般的なエラー
warning
警告
notice
通知メッセージ
info
情報
debug
デバッグ情報
none
ファシリティ無効(メッセージを送らない)
loggerコマンドでの動作確認
loggerコマンドは任意のメッセージを出力することができるので、希望した動作になっているかの確認ができます。
書式
logger オプション 出力メッセージ
例えば、ファシリティが「kern」、プライオリティが「info」で「test desu」というメッセージを発生させる場合は以下のようにします。
logger –p kern.info "test desu"
/var/log/messagesを確認すると以下のように出力されているのが確認できます。
Oct 20 11:49:31 sakue root: test desu
オプション
オプションはloggerの次に記述します。
複数のオプションの場合「-i -p」のように個々に指定しても、「-ip」のように一緒に指定してもOKです。
以下はどちらも同じオプションが指定されます。
logger -i -p kern.info "I am Pen"
logger -ip kern.info "I am Pen"
ただし、別々に指定する必要があるオプションもあります。
-sは標準エラー出力にも吐くというオプションですが、以下のように同時に指定すると怒られます。
logger -ps kern.info “I am Pen”
logger: unknown priority name: s.
この場合は以下のように別々に指定します。
logger -p kern.info "I am Pen" -s
タグも指定する場合
logger -p kern.info "I am Pen" -t "ABCD" -s
-p
指定したファシリティ(種別)とプライオリティ(重要度)で出力します。
例えば、ファシリティが「kern」、プライオリティが「info」で「test desu」というメッセージを発生させる場合は以下のようにします。
logger –p kern.info "test desu"
同じ条件でプライオリティを「err」にする場合は以下のようにします。
logger –p kern.err "test desu"
-i
loggerのプロセスIDも出力します。
以下の例のように「i」も付けると括弧で囲われたプロセスIDも出力されます。
logger -p kern.info “I am Pen”
Oct 20 12:07:32 sakue root: I am Pen
logger -ip kern.info “I am Pen”
Oct 20 12:05:22 sakue root[486]: I am Pen
-t
タグを指定できます。
未指定の場合は実行ユーザーが出力されます。
例えば以下の場合、rootで実行するとログに「root:」と残りますが、
logger -p kern.info “I am Pen”
Oct 20 12:07:32 sakue root: I am Pen
以下のように「-t “タグ”」と指定できます。
logger -p kern.info “I am Pen” -t “ABCD”
Oct 20 12:15:00 sakue ABCD: I am Pen
-s
標準エラー出力へも同時に吐きます。
コンソールとログへ両方出力されるのが確認できると思います。
他のオプションと同時に指定できませんので、末尾あたりに「-s」と入れます。
logger -p kern.info "I am Pen" -s
タグも指定する場合
logger -p kern.info "I am Pen" -t "ABCD" -s
-f
メッセージをファイルに出力します。
未指定の場合はrsyslog.confの設定値が適用されます。
ログを模倣する
例えば以下のログと全く同じメッセージを出力したい場合です。
Oct 20 12:27:51 sakue kernel: [IPTABLES drop_broadcast2] : IN=enp3s0f0 OUT= MAC=ff:ff:ff:ff:ff:ff:98:46:0a:bb:dc:54:08:00 SRC=0.0.0.0 DST=255.255.255.255 LEN=328 TOS=0x00 PREC=0x00 TTL=255 ID=5860 PROTO=UDP SPT=68 DPT=67 LEN=308
この場合は以下のような感じで実行します。
ログは半角スペースで各項目が区切られていますが、先頭の半角スペースはあっても無くても構いません。
logger -p kern.info "[IPTABLES drop_broadcast] : IN=enp3s0f0 OUT= MAC=ff:ff:ff:ff:ff:ff:98:46:0a:bb:dc:54:08:00 SRC=0.0.0.0 DST=255.255.255.255 LEN=328 TOS=0x00 PREC=0x00 TTL=255 ID=5860 PROTO=UDP SPT=68 DPT=67 LEN=308" -t "kernel" -s
ログを毎回確認するのは大変なので「-s」オプションもつけて、コンソール上にも表示させ、およその状態を確認すると良いです。
ちょっと長くてゴチャゴチャしているので簡略化すると以下のような感じです。
logger -p kern.info "メッセージ" -t "タグ" -s
「-p」で指定するファシリティとプライオリティも模倣したいログと合わせてください。
ルータのログを受けて保存(ヤマハRTXの例)
RTX1200の例ですが、RTX系なら同じように設定できます。
ルータ側の設定
RTX1200の設定(ルータで設定)
syslog host [サーバのIPアドレス] syslog facility [0-23またはlocal0~local7] syslog notice on
今回は以下のような感じになりました。
syslog host 192.168.2.200 syslog facility local5 syslog notice on
rsyslog.confの設定
UDPのポート514で受けるので以下のコメントアウトを解除します。
$ModLoad imudp $UDPServerRun 514
messagesへは出力しないようにします。
以下のようになっている場合は末尾に、
*.info;mail.none;authpriv.none;cron.none /var/log/messages
ルータ側で指定したファシリティの「local5」を出力しないようにします。
*.info;mail.none;authpriv.none;cron.none;local5.none /var/log/messages
もう少し下あたりに以下を追加し、「/var/log/yamaha-rtx.log」へ出力するよう指定します。
local5.* /var/log/yamaha-rtx.log
設定できたらrsyslogを再起動しておきます。
systemctl restart rsyslog
iptablesで通す
ファイアウォールを使っている場合はUDPの514を通すようにしておきます。
以下はiptablesの例です。
-A INPUT -p udp -m udp --dport 514 -j ACCEPT
iptablesを再起動して反映させます
systemctl restart iptables
ログのローテーション
/etc/logrotate.d/ へ「yamaha-rtx」というファイルを作成します。
オプションはお好みで調整してください。
/var/log/yamaha-rtx.log { missingok notifempty daily rotate 90 }
動作確認
ログファイルはtouchなどで生成する必要はありませんが、rsyslogの再起動では生成されないので、しばらく放置しておいてから確認しましょう。
ルータのログが自宅サーバにも保管されるようになると、色々と自動化できて結構便利ですね。
トラブル
時刻が01秒のログが /var/log/messages へ出る
以下のようなログが延々と出る場合の対処です。
Aug 1 16:10:01 sakue systemd: Started Session 143 of user root. Aug 1 16:10:01 sakue systemd: Started Session 141 of user root. Aug 1 16:10:01 sakue systemd: Started Session 142 of user root. Aug 1 16:10:01 sakue systemd: Started Session 144 of user root. Aug 1 16:11:01 sakue systemd: Started Session 145 of user root. Aug 1 16:11:01 sakue systemd: Started Session 146 of user root. Aug 1 16:11:01 sakue systemd: Started Session 147 of user root. Aug 1 16:11:01 sakue systemd: Started Session 148 of user root. Aug 1 16:11:01 sakue systemd: Started Session 149 of user root.
以下を編集します
vi /etc/systemd/system.conf
Loglevelを以下のようにします。
LogLevel=notice
反映させて完了です。
systemctl daemon-reexec
rsyslogd was HUPed
以下のログはHUPとあったので、ハングアップしたのかと思いましたが、rsyslogdを再起動するとでるようなので無視して大丈夫です。
Aug 6 03:50:08 sakue rsyslogd: [origin software="rsyslogd" swVersion="8.24.0-34.el7" x-pid="2855" x-info="www.rsyslog.com"] rsyslogd was HUPed
logrotateの /etc/logrotate.d/syslog 内のpostrotateで以下を実行していますね。
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
コメントフォーム