r​syslog でログの出力先を変更する

メモ:  Category:ubuntu

ネットワーク機器やサーバーからのログをホスト毎のディレクトリを作成して外付けのハードディスクへ保存するよう設定してきます。

rsyslog の設定

外部からのログを受け入れるとき、モジュールの設定は /etc/rsyslog.conf を修正したのですが設定を別のファイルに記述することもできます。

rsyslog.conf には /etc/rsyslog.d/ ディレクトリの *.conf ファイルをインクルードするように定義されており用途などに分けて設定を用意することができます。

インストール直後の状態では、「 20-ufw.conf 」 「 21-cloudinit.conf 」 「 50-default.conf 」の 3 つが作成されており、それぞれの機能に対しての設定が記載されています。

今回は、出力先の設定を「 50-default.conf 」へ追記していく事としています。

$ sudo vi /etc/rsyslog.d/50-default.conf

rsyslog では、 $template でテンプレートを定義することができます。テンプレートでは、ログファイルの出力先や、ログメッセージのフォーマットを定義することができます。 テンプレートは、「 $template テンプレート名, テンプレート形式 」の形式で作成し、テンプレート形式には変数(プロパティ)を指定することができます。

変数(プロパティ)の代表的なものには、次のようなものがあります。

プロパティ 意味
%msg% Syslog データの MSG 内容(メッセージ)
%hostname% Syslog データの HEADER に記載されているホスト名
%fromhost% Syslog データの受信側が DNS を使って記録したホスト名
%syslogtag% Syslog データの MSG の TAG フィールドの内容
%programname% Syslog データの MSG の TAG フィールドに含まれているプログラム名

また、プロパティを使用するときはオプションも指定することができます。 プロパティにオプションを指定するときは以下の形式で指定することができます。

%プロパティ名:範囲開始:範囲終了:オプション%

次にテンプレートの適用先を設定します。

ルールといわれる部分で、対象とするログメッセージを指定し、保存先や出力方法を設定します。

ここでは、ローカルホストからのメッセージ以外をテンプレートで指定した保存先へ保管するように設定しています。

#  Default rules for rsyslog.
#
#                       For more information see rsyslog.conf(5) and /etc/rsyslog.conf

$template logFileName,"/mnt/log/syslog/%hostname%/log_%hostname%_%$year%%$month%%$day%.log"

#
# First some standard log files.  Log by facility.
#
:fromhost-ip,!isequal, "127.0.0.1" -?logFileName
& stop

auth,authpriv.*                 /var/log/auth.log
*.*;auth,authpriv.none          -/var/log/syslog

出力先の設定ができたので rsyslog を再起動します。

$ sudo systemctl status rsyslog
● rsyslog.service - System Logging Service
     Loaded: loaded (/usr/lib/systemd/system/rsyslog.service; enabled; preset: enabled)
     Active: active (running) since Mon 2024-11-11 11:25:47 UTC; 1h 47min ago

上記設定で出力先の変更ができると思っていましたが、次のようなエラーが発生し正しく出力されません。

ログを確認すると、出力しようとしているのですが権限がなく失敗しているようです。

error during config processing: omfile: creating parent directories for file

や

/va/log/syslogに
rsyslogd: error during config processing: omfile: creating parent directories for file

権限に問題があるようなので、出力先の設定を確認してみます。

$ ll
drwxr-xr-x 3 root root 4096 Nov 12 14:31 ./
drwxr-xr-x 3 root root 4096 Nov 12 13:38 ../
drwxr-xr-x 2 root root 4096 Nov 12 14:31 syslog/

ログの出力には syslog グループに権限が必要そうなため、出力先ディレクトリに指定した「 /mnt/log/syslog 」 の 所有権を syslog グループに変更し、そのグループがそのディレクトリに書き込むことを許可します。

$ sudo chgrp syslog /mnt/log/syslog/
$ sudo chmod g+w /mnt/log/syslog/

コマンドを実行し、権限が変更されていることを確認します。

$ ll
total 12
drwxr-xr-x 3 root root   4096 Nov 12 14:31 ./
drwxr-xr-x 3 root root   4096 Nov 12 13:38 ../
drwxrwxr-x 2 root syslog 4096 Nov 12 14:31 syslog/

権限が変更できたので、 rsyslog を再起動し動作確認を実施します。

$ sudo systemctl status rsyslog

実行した結果は変わらず、同じエラーが発生しています。

いろいろググってみたところ、次のサイトに行きつき apparmor の設定が関係していそうです。 AppArmor は、アクセス制御( ACL )を担当しているようで、記事に沿って apparmor の設定を変更します。( AppArmor については、後日勉強です)

Rsyslog producing errors when trying to write to mounted drive

rsyslog の関係は、 「 /etc/apparmor.d/usr.sbin.rsyslogd 」へ「 /mnt/log/syslog/** rw, 」を追記します。

$ sudo vi /etc/apparmor.d/usr.sbin.rsyslogd

vi を起動し、「/var/log/**」の次へ追加します。

  # 'r' is needed when using imfile
  /var/log/**                   rw,
  /mnt/log/syslog/**            rw,

設定を保存し、apparmor を再起動します。

$ sudo systemctl restart apparmor.service

次に rsyslog を再起動します。

$ sudo systemctl restart rsyslog.service

あらためて動作確認を行うと、ディレクトリが作成されマウントした外付けディスクへログが出力されていることが確認できます。

bluenote by BBB