Perpetuate journal log

journalログはcentos7のデフォルトでは/run/log/journal/以下に格納されるが、/runはメモリベースファイルシステムなので揮発的であり、再起動時には消えてしまう。

$ df -h
ファイルシス   サイズ  使用  残り 使用% マウント位置
/dev/vda1         20G  4.2G   15G   23% /
devtmpfs         236M     0  236M    0% /dev
tmpfs            245M     0  245M    0% /dev/shm
tmpfs            245M  304K  245M    1% /run
tmpfs            245M     0  245M    0% /sys/fs/cgroup
tmpfs             49M     0   49M    0% /run/user/1001

永続的なファイルシステムへjournalログを書き出すようにしてみる。

journaldの設定は/etc/systemd/journald.confにある。デフォルトでは以下のように[journal]セクション内のオプションは全てコメントアウトされている(オプションはたぶんすべてデフォルトの値)。

#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.
#
# Entries in this file show the compile time defaults.
# You can change settings by editing this file.
# Defaults can be restored by simply deleting this file.
#
# See journald.conf(5) for details.

[Journal]
#Storage=auto
#Compress=yes
#Seal=yes
#SplitMode=uid
#SyncIntervalSec=5m
#RateLimitInterval=30s
#RateLimitBurst=1000
#SystemMaxUse=
#SystemKeepFree=
#SystemMaxFileSize=
#RuntimeMaxUse=
#RuntimeKeepFree=
#RuntimeMaxFileSize=
#MaxRetentionSec=
#MaxFileSec=1month
#ForwardToSyslog=yes
#ForwardToKMsg=no
#ForwardToConsole=no
#ForwardToWall=yes
#TTYPath=/dev/console
#MaxLevelStore=debug
#MaxLevelSyslog=debug
#MaxLevelKMsg=notice
#MaxLevelConsole=info
#MaxLevelWall=emerg

今回journal.logを永続化する上で関わってくるオプションはStorageとなる。Storageの設定は以下の様な意味を持つ。

  • auto(default): /var/log/journal/があればそこに、なければ/run/log/journal/に保存する。
  • volatile: /run/log/journal/に保存する(/run/log/journal/がなければ作成する)。
  • persistent: /var/log/journal/に保存する(/var/log/journal/がなければ作成する)。
  • none: ログデータを残さない。

変更した設定はsystemd-journaldを再起動することで適用される。今回デフォルトのautoを使う(ので設定ファイルの変更は無し!)。/var/log/journal/を作成し、systemd-journaldを再起動する。

例によってansibleでやるぞい!

tasks/main.yml

- name: journal log is perpetuated
  file: path=/var/log/journal state=directory owner=root group=root mode=0644
  notify:
    - restart systemd-journald daemon
  tags: journal

handlers/main.yml

- name: restart systemd-journald daemon
  shell: systemctl restart systemd-journald

ローテートはsystemdが勝手にやってくれるので気にしないでおっけー!ひゅ~!

参考

永続的ストレージの有効化

Journal はデフォルトでは、ログファイルをメモリーか /run/log/journal/ ディレクトリー内の小さいリングバッファーにのみ保存します。これは、journalctl の最近のログ履歴を表示するには十分なものです。このディレクトリーは揮発性なので、ログデータは永続的には保存されません。デフォルト設定では、syslog は journal ログを読み取り、/var/log/ ディレクトリーに保存します。永続的なロギングが有効になると、journal ファイル /var/log/journal に保存され、再起動後も維持されます。

Man page journald.conf

Storage=

Controls where to store journal data. One of "volatile",
"persistent", "auto" and "none". If "volatile", journal log data
will be stored only in memory, i.e. below the /run/log/journal
hierarchy (which is created if needed). If "persistent", data will
be stored preferably on disk, i.e. below the /var/log/journal
hierarchy (which is created if needed), with a fallback to
/run/log/journal (which is created if needed), during early boot
and if the disk is not writable. "auto" is similar to "persistent"
but the directory /var/log/journal is not created if needed, so
that its existence controls where log data goes. "none" turns off
all storage, all log data received will be dropped. Forwarding to
other targets, such as the console, the kernel log buffer, or a
syslog socket will still work however. Defaults to "auto".