CentOS 7のログ管理「journald」

2014年12月18日(木)
古賀 政純

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でログを統合して管理することが考えられます。

図1:管理対象サーバー側でjournaldによりログを取得し、rsyslogサーバーでログを一括管理する。journaldだけでなくsyslogベースの旧システムが混在する環境では、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サーバーにそのログが転送されるはずです。

日本ヒューレット・パッカード株式会社 プリセールス統括本部 ソリューションセンター OSS・Linux担当 シニアITスペシャリスト

兵庫県伊丹市出身。1996年頃からオープンソースに携わる。2000年よりUNIXサーバーのSE及びスーパーコンピューターの並列計算プログラミング講師を担当。科学技術計算サーバーのSI経験も持つ。2005年、大手製造業向けLinuxサーバー提案で日本HP社長賞受賞。2006年、米国HPからLinux技術の伝道師に与えられる「OpenSource and Linux Ambassador Hall of Fame」を2年連続受賞。日本HPプリセールスMVPを4度受賞。現在は、Linux、FreeBSD、Hadoop等のOSSを駆使したスケールアウト型サーバー基盤のプリセールスSE、技術検証、技術文書執筆を担当。日本HPのオープンソース・Linuxテクノロジーエバンジェリストとして講演活動も行っている。Red Hat Certified Engineer、Red Hat Certified Virtualization Administrator、Novell Certified Linux Professional、EXIN Cloud Computing Foundation Certificate、HP Accredited Systems Engineer Cloud Architect、Red Hat Certified System Administrator in Red Hat OpenStack、Cloudera Certified Administrator for Apache Hadoop認定技術者。HP公式ブログ執筆者。趣味はレーシングカートとビリヤード

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています