Categories
SysOps

How to log systemd service state changes

Log systemd service state changes using rsyslog.

At first, look how the log entry looks like as it will come in handy in the next step.

$ sudo journalctl --follow --output verbose _TRANSPORT=journal SYSLOG_IDENTIFIER=systemd
Wed 2021-04-14 20:50:55.891441 UTC [s=9427351f18774a69b609ca7e9f914343;i=e2a;b=89d52c9da1f84b029e4f8270bec49e31;m=27bc63dbe5;t=5bff4e73b2823;x=7394e861da280911]
    _MACHINE_ID=8a3d7205b9ac458386ceba4c795decbb
    _HOSTNAME=bullseye
    PRIORITY=6
    SYSLOG_FACILITY=3
    SYSLOG_IDENTIFIER=systemd
    _UID=0
    _GID=0
    _SELINUX_CONTEXT=unconfined
    _TRANSPORT=journal
    _CAP_EFFECTIVE=1ffffffffff
    TID=1
    CODE_FILE=src/core/job.c
    JOB_TYPE=start
    _PID=1
    _COMM=systemd
    _EXE=/usr/lib/systemd/systemd
    _SYSTEMD_CGROUP=/init.scope
    _SYSTEMD_UNIT=init.scope
    _SYSTEMD_SLICE=-.slice
    CODE_LINE=940
    CODE_FUNC=job_log_done_status_message
    JOB_RESULT=done
    MESSAGE_ID=39f53479d3a045ac8e11786248231fbf
    UNIT=nginx.service
    MESSAGE=Started A high performance web server and a reverse proxy server.
    _BOOT_ID=89d52c9da1f84b029e4f8270bec49e31
    _CMDLINE=/lib/systemd/systemd --system --deserialize 35
    JOB_ID=2730
    INVOCATION_ID=ffd64fa6e3d744f5b18d76243c7dbde2
    _SOURCE_REALTIME_TIMESTAMP=1618433455891441

Create rsyslog configuration.

$ cat <<EOF | sudo tee /etc/rsyslog.d/systemd.conf
module(load="imjournal" IgnorePreviousMessages="on")
module(load="mmjsonparse")

template(name="systemd_message_template" type="string" string="%TIMESTAMP% %HOSTNAME% %programname%  %msg% [%\$!UNIT%, %\$!JOB_TYPE%, %\$!JOB_RESULT%, %\$!CODE_FUNC%]\n" )

action(type="mmjsonparse")
if \$programname == 'systemd' and \$!UNIT != "" then {
   action(type="omfile" file="/var/log/systemd_service_state.log" template="systemd_message_template")
}
EOF
module(load="imjournal" IgnorePreviousMessages="on")
module(load="mmjsonparse")

template(name="systemd_message_template" type="string" string="%TIMESTAMP% %HOSTNAME% %programname%  %msg% [%$!UNIT%, %$!JOB_TYPE%, %$!JOB_RESULT%, %$!CODE_FUNC%]\n" )

action(type="mmjsonparse")
if $programname == 'systemd' and $!UNIT != "" then {
   action(type="omfile" file="/var/log/systemd_service_state.log" template="systemd_message_template")
}

Test rsyslogd configuration.

$ sudo rsyslogd -N 1
rsyslogd: version 8.2102.0, config validation run (level 1), master config /etc/rsyslog.conf
rsyslogd: End of config validation run. Bye.

Restart rsyslogd service.

$ sudo systemctl restart rsyslog

This is how nginx restart operation is logged.

$ cat  /var/log/systemd_service_state.log
Apr 14 21:48:23 bullseye systemd  Stopping A high performance web server and a reverse proxy server... [nginx.service, stop, , job_log_begin_status_message]
Apr 14 21:48:23 bullseye systemd  nginx.service: Succeeded. [nginx.service, , , unit_log_success]
Apr 14 21:48:23 bullseye systemd  Stopped A high performance web server and a reverse proxy server. [nginx.service, restart, done, job_log_done_status_message]
Apr 14 21:48:23 bullseye systemd  Starting A high performance web server and a reverse proxy server... [nginx.service, start, , job_log_begin_status_message]
Apr 14 21:48:23 bullseye systemd  Started A high performance web server and a reverse proxy server. [nginx.service, start, done, job_log_done_status_message]

This is how system restart operation is logged.

$ cat /var/log/systemd_service_state.log
Apr 14 21:49:19 bullseye systemd  e2scrub_reap.service: Succeeded. [e2scrub_reap.service, , , unit_log_success]
Apr 14 21:49:19 bullseye systemd  Finished Remove Stale Online ext4 Metadata Check Snapshots. [e2scrub_reap.service, start, done, job_log_done_status_message]
Apr 14 21:49:19 bullseye systemd  Found device 82540EM Gigabit Ethernet Controller (PRO/1000 MT Desktop Adapter). [sys-subsystem-net-devices-eth0.device, start, done, job_log_done_status_message]
Apr 14 21:49:19 bullseye systemd  Started ifup for eth0. [ifup@eth0.service, start, done, job_log_done_status_message]
Apr 14 21:49:19 bullseye systemd  Started User Login Management. [systemd-logind.service, start, done, job_log_done_status_message]
Apr 14 21:49:19 bullseye systemd  Finished Helper to synchronize boot up for ifupdown. [ifupdown-pre.service, start, done, job_log_done_status_message]
Apr 14 21:49:19 bullseye systemd  Starting Raise network interfaces... [networking.service, start, , job_log_begin_status_message]
Apr 14 21:49:19 bullseye systemd  Finished Raise network interfaces. [networking.service, start, done, job_log_done_status_message]
Apr 14 21:49:19 bullseye systemd  Reached target Network. [network.target, start, done, job_log_done_status_message]
Apr 14 21:49:19 bullseye systemd  Starting chrony, an NTP client/server... [chrony.service, start, , job_log_begin_status_message]
Apr 14 21:49:19 bullseye systemd  Starting MariaDB 10.5.9 database server... [mariadb.service, start, , job_log_begin_status_message]
Apr 14 21:49:19 bullseye systemd  Starting A high performance web server and a reverse proxy server... [nginx.service, start, , job_log_begin_status_message]
Apr 14 21:49:19 bullseye systemd  Condition check resulted in fast remote file copy program daemon being skipped. [rsync.service, start, done, job_log_done_status_message]
Apr 14 21:49:19 bullseye systemd  Starting OpenBSD Secure Shell server... [ssh.service, start, , job_log_begin_status_message]
Apr 14 21:49:19 bullseye systemd  Starting Permit User Sessions... [systemd-user-sessions.service, start, , job_log_begin_status_message]
Apr 14 21:49:19 bullseye systemd  Started Unattended Upgrades Shutdown. [unattended-upgrades.service, start, done, job_log_done_status_message]
Apr 14 21:49:19 bullseye systemd  Finished Permit User Sessions. [systemd-user-sessions.service, start, done, job_log_done_status_message]
Apr 14 21:49:19 bullseye systemd  Started Getty on tty1. [getty@tty1.service, start, done, job_log_done_status_message]
Apr 14 21:49:19 bullseye systemd  Reached target Login Prompts. [getty.target, start, done, job_log_done_status_message]
Apr 14 21:49:19 bullseye systemd  Started OpenBSD Secure Shell server. [ssh.service, start, done, job_log_done_status_message]
Apr 14 21:49:19 bullseye systemd  Started chrony, an NTP client/server. [chrony.service, start, done, job_log_done_status_message]
Apr 14 21:49:19 bullseye systemd  Reached target System Time Synchronized. [time-sync.target, start, done, job_log_done_status_message]
Apr 14 21:49:19 bullseye systemd  Started Daily apt download activities. [apt-daily.timer, start, done, job_log_done_status_message]
Apr 14 21:49:19 bullseye systemd  Started Daily apt upgrade and clean activities. [apt-daily-upgrade.timer, start, done, job_log_done_status_message]
Apr 14 21:49:19 bullseye systemd  Started Periodic ext4 Online Metadata Check for All Filesystems. [e2scrub_all.timer, start, done, job_log_done_status_message]
Apr 14 21:49:19 bullseye systemd  Started Discard unused blocks once a week. [fstrim.timer, start, done, job_log_done_status_message]
Apr 14 21:49:19 bullseye systemd  Started Daily rotation of log files. [logrotate.timer, start, done, job_log_done_status_message]
Apr 14 21:49:19 bullseye systemd  Started Daily man-db regeneration. [man-db.timer, start, done, job_log_done_status_message]
Apr 14 21:49:19 bullseye systemd  Reached target Timers. [timers.target, start, done, job_log_done_status_message]
Apr 14 21:49:19 bullseye systemd  nginx.service: Failed to parse PID from file /run/nginx.pid: Invalid argument [nginx.service, , , service_load_pid_file]
Apr 14 21:49:19 bullseye systemd  Started A high performance web server and a reverse proxy server. [nginx.service, start, done, job_log_done_status_message]
Apr 14 21:49:19 bullseye systemd  Started MariaDB 10.5.9 database server. [mariadb.service, start, done, job_log_done_status_message]
Apr 14 21:49:19 bullseye systemd  Reached target Multi-User System. [multi-user.target, start, done, job_log_done_status_message]
Apr 14 21:49:19 bullseye systemd  Reached target Graphical Interface. [graphical.target, start, done, job_log_done_status_message]
Apr 14 21:49:19 bullseye systemd  Starting Update UTMP about System Runlevel Changes... [systemd-update-utmp-runlevel.service, start, , job_log_begin_status_message]
Apr 14 21:49:19 bullseye systemd  systemd-update-utmp-runlevel.service: Succeeded. [systemd-update-utmp-runlevel.service, , , unit_log_success]
Apr 14 21:49:19 bullseye systemd  Finished Update UTMP about System Runlevel Changes. [systemd-update-utmp-runlevel.service, start, done, job_log_done_status_message]
Apr 14 21:53:03 bullseye systemd  Created slice User Slice of UID 1000. [user-1000.slice, start, done, job_log_done_status_message]
Apr 14 21:53:03 bullseye systemd  Starting User Runtime Directory /run/user/1000... [user-runtime-dir@1000.service, start, , job_log_begin_status_message]
Apr 14 21:53:03 bullseye systemd  Finished User Runtime Directory /run/user/1000. [user-runtime-dir@1000.service, start, done, job_log_done_status_message]
Apr 14 21:53:03 bullseye systemd  Starting User Manager for UID 1000... [user@1000.service, start, , job_log_begin_status_message]
Apr 14 21:53:03 bullseye systemd  Started User Manager for UID 1000. [user@1000.service, start, done, job_log_done_status_message]
Apr 14 21:53:03 bullseye systemd  Started Session 1 of user vagrant. [session-1.scope, start, done, job_log_done_status_message]

See imjournal: Systemd Journal Input Module web-page for more information.