tl;dr
On CentOS 7, you have to enable the persistent storage of log messages:
# mkdir /var/log/journal
# systemd-tmpfiles --create --prefix /var/log/journal
# systemctl restart systemd-journald
Otherwise, the journal log messages are not retained between boots.
Details
Whether journald
retains log messages from previous boots is configured via /etc/systemd/journald.conf
. The default setting under CentOS 7 is:
[Journal]
Storage=auto
Where the journald.conf man page explains auto
as:
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.
(emphasize mine)
The systemd-journald.service man page thus states that:
By default, the journal stores log data in /run/log/journal/. Since /run/ is volatile, log data is lost at reboot. To make the data persistent, it is sufficient to create /var/log/journal/ where systemd-journald will then store the data.
Apparently, the default was changed in Fedora 19 (to persitent storage) and since CentOS 7 is derived from Fedora 18 - it is still non-persisent there, by default. Persistency is implemented by default outside of journald via /var/log/messages
and the rotated versions /var/log/messages-YYYYMMDD
which are written by rsyslogd (which runs by default and gets its input from journald).
Thus, to enable persistent logging with journald under RHEL/CentOS 7 one has to
# mkdir /var/log/journal
and then fix permissions and restart journald, e.g. via
# systemd-tmpfiles --create --prefix /var/log/journal
# systemctl restart systemd-journald
systemctl restart systemd-journald
should do it. So no reboot required. – xx4h Oct 16 '14 at 17:52/usr/share/doc/systemd/README.Debian
:install -d -g systemd-journal /var/log/journal
. – pevik Aug 12 '15 at 20:13drwxr-sr-x. 3 root systemd-journal
- perhaps journald fixes the permissions/ownership during initialization. – maxschlepzig Aug 13 '15 at 06:10journalctl -b -N
whereN
is the Number of any previous boot, eg-1
,-2
and so on. I use this to easily compare log between 2 boots after update for example (journalctl -b >$(hostname)-journalctl-0 && journalctl -b -1 >$(hostname)-journalctl-1 && vimdiff <hostname>-journalctl-*
– tuk0z Aug 26 '15 at 10:49USR1
signal instead of restarting, you don't lose the current journald contents.killall -USR1 systemd-journald
– James B Sep 16 '16 at 12:12systemd-tmpfiles --create --prefix /var/log/journal
; simply creating the/var/log/journal
directory and then setting the group correctly on the directory withchgrp systemd-journal /var/log/journal/
, before restarting the service, is sufficient. – paulmdavies Jul 23 '18 at 09:14systemd-tmpfiles
also sets some ACLs on that directory. – maxschlepzig Jul 23 '18 at 19:06journald
intialization, like you suggested in a previous comment? – paulmdavies Jul 24 '18 at 10:22grep journal /usr/lib/tmpfiles.d/systemd.conf
- also, thels
output in my previous comment shows that the resulting directory in that experiment didn't have any ACLs set. Thus, just doing amkdir
and possibly setting the group may work in some scenarios/for some journald features, but it's certainly not sufficient. Note thatsystemd-tmpfiles
also runs during system boot. – maxschlepzig Jul 24 '18 at 18:50