CentOS 7のログ管理「journald」
OS再起動後もログが消去されないようにする
CentOS 7のjournaldの設定では、ログファイルは、/run/log/journalディレクトリ以下に格納されています。しかし、/runディレクトリはtmpfsファイルシステムでマウントされており、OSを再起動すると、/run/log/journalディレクトリ配下に格納されていたログファイルは削除されてしまいます。
# df -HT |grep tmpfs devtmpfs devtmpfs 970M 0 970M 0% /dev tmpfs tmpfs 979M 144k 979M 1% /dev/shm tmpfs tmpfs 979M 959k 978M 1% /run ←tmpfsでマウントされている tmpfs tmpfs 979M 0 979M 0% /sys/fs/cgroup
OSを再起動してもログが保管されるようにするためには、journaldの設定ファイル/etc/systemd/journald.conf内で「Storage=persistent」を指定し、コメントアウトを意味する行頭の「#」を削除します。
# cp /etc/systemd/journald.conf /etc/systemd/journald.conf.org # vi /etc/systemd/journald.conf ... [Journal] Storage=persistent ...
設定ファイルを編集したら、journaldサービスを再起動します。
# systemctl restart systemd-journald
/etc/systemd/journald.conf内で「Storage=persistent」を指定した場合、/var/log/journalディレクトリ配下にディレクトリとログが作成され、ログが永続的に保存されるようになります。
# cd /var/log/journal/54b10747e8d74220a5b5e8da6ddb66ef/ # ls -l total 8196 -rw-r-----. 1 root root 8388608 Sep 6 12:40 system.journal
/etc/systemd/journald.conf内でデフォルトの「Storage=auto」を指定すると、/var/log/journalディレクトリが存在しない場合は、tmpfsでマウントされている/run/log/journalディレクトリ配下にログが保管されます。/var/log/journalディレクトリが存在する場合は、/var/log/journalディレクトリ配下にログが保管されます。
ログの容量制限
journaldによって生成されるログの容量を制限するには、journald.confファイルの「SystemMaxUse=」パラメータに値を設定します。以下は、ログの容量を128MBに制限する例です。
# vi /etc/systemd/journald.conf ... SystemMaxUse=128M ...
パラメータを記述したら、journaldを再起動します。
# systemctl restart systemd-journald
今現在、journaldで管理されている全てのログの容量を確認するには、journalctlコマンドに「--disk-usage」オプションを付与して実行します。
# journalctl --disk-usage Journals take up 6.2M on disk.
journaldで収集したログを遠隔にあるsyslogサーバーに転送する
CentOS 7におけるログは、journaldによって一元的に管理されていますが、そのログを遠隔にあるログサーバーに転送したい場合があります。ログサーバーには様々な種類がありますが、一般的に広く利用されているのは、rsyslogサーバーです。実は、CentOS 7でもjournald以外にrsyslogによるログサーバーを構築することが可能となっています。CentOS 7以外にCentOS 5やCentOS 6などのjournaldに対応していないsyslogベースのOSが混在する環境では、ログサーバーとして、使い慣れたrsyslogでログを統合して管理することが考えられます。
ここでは、CentOS 7がインストールされた管理対象サーバー上でjournaldによりログを取得し、遠隔にあるCentOS 7のrsyslogサーバーにログを転送する手順を紹介します。
まず、CentOS 7上で、rsyslogサーバーを構築します。rsyslogサーバーの設定ファイルrsyslog.confファイルを編集します。
# vi /etc/rsyslog.conf $ModLoad imudp $UDPServerRun 514 $umask 0022 $FileCreateMode 0644 $DirCreateMode 0755 ... :fromhost-ip, isequal, "172.16.70.2" /var/log/journalctl_log_172.16.70.2 & ~ ...
上記の「$UDPServerRun 514」は、rsyslogにおいてUDPの514番ポートを使用する設定になります。また、ログを取得したい管理対象サーバーのIPアドレスと、ログサーバー側で保管するログファイルのフルパスを記述します。上記では、管理対象サーバーのIPアドレスが172.16.70.2の場合は、ログサーバー側の「/var/log/journalctl_log_172.16.70.2」というファイルにログを書き込むというルールを記述しています。上記の設定ファイルを記述したら、ログサーバー側でjournalctl_log_172.16.70.2という空のファイルを作成しておきます。
# touch /var/log/journalctl_log_172.16.70.2
rsyslogはUDPの514番ポートを使って通信を行いますので、ログサーバー側のファイアウォールの設定を変更します。UDPの514番ポートを開ける設定は、以下のとおりです。
# firewall-cmd --zone=public --add-port=514/udp --permanent success
ログサーバー側のファイアウォールの設定を反映します。
# firewall-cmd --reload
ログサーバー側のUDPの514番ポートが開放されているかを確認します。
# firewall-cmd --list-all public (default, active) interfaces: docker0 ens7 eth0 team0 sources: services: dhcp dhcpv6-client http nfs ssh tftp ports: 21/tcp 514/udp 5901/tcp ←UDPの514番ポートが通信できる設定 masquerade: no forward-ports: icmp-blocks: rich rules:
ログサーバー側のrsyslogサービスを再起動します。
# systemctl restart rsyslog # systemctl status rsyslog rsyslog.service - System Logging Service Loaded: loaded (/usr/lib/systemd/system/rsyslog.service; enabled) Active: active (running) since 火 2014-10-21 23:03:47 JST; 2s ago Main PID: 18196 (rsyslogd) CGroup: /system.slice/rsyslog.service mq18196 /usr/sbin/rsyslogd -n 10月 21 23:03:47 centos70n01.jpn.linux.hp.com systemd[1]: Starting System Logging Service... 10月 21 23:03:47 centos70n01.jpn.linux.hp.com systemd[1]: Started System Logging Service.
これで、IPアドレスが172.16.70.2の管理対象サーバーのログをrsyslogで収集するログサーバーが構築できました。次に、管理対象サーバー側でjournaldによるログ収集を設定します。まず、管理対象サーバー側でも、ログ管理サーバーと同様に、UDPの514番ポートを開放します。
# firewall-cmd --zone=public --add-port=514/udp --permanent success # firewall-cmd --reload
管理対象サーバー側でjournaldが稼働していない場合は、journaldを起動します。
# systemctl start systemd-journald # systemctl status systemd-journald systemd-journald.service - Journal Service Loaded: loaded (/usr/lib/systemd/system/systemd-journald.service; static) Active: active (running) since 火 2014-10-21 23:07:03 JST; 50s ago Docs: man:systemd-journald.service(8) man:journald.conf(5) Main PID: 1977 (systemd-journal) Status: "Processing requests..." CGroup: /system.slice/systemd-journald.service mq1977 /usr/lib/systemd/systemd-journald ... ...
管理対象サーバー側で、journalctlコマンドを使ったログ取得を行い、遠隔のrsyslogサーバー(IPアドレスは172.16.70.99とします)にログを転送します。
# journalctl -o short -f |nc -uv 172.16.70.99 514 Ncat: Version 6.40 ( http://nmap.org/ncat ) Ncat: Connected to 172.16.70.99:514.
ログが転送されているかのテストは、管理対象サーバー側で、httpdやpostfix等のサービスを再起動したりすることでサービス再起動に関するログが生成され、rsyslogサーバーにそのログが転送されるはずです。