rsyslogの設定とログの振り分け

スポンサーリンク

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)
RSyslog Documentation - rsyslog
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.

設定ファイルの構文チェック

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

ユーザープロセスのメッセージ

mail

メールシステムのメッセージ(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

コメント

タイトルとURLをコピーしました