Admin/Systemd/Journalctl

De TartareFR
Aller à la navigation Aller à la recherche

Introduction

Depuis Fedora 18, systemd est pleinement implémenté, c'est à dire que la commande pour visualiser les journaux systèmes est <app>journalctl</app>.

journalctl

Cette commande lancée avec le super-utilisateur root, permet de voir tous les logs générés par le système et par les utilisateurs de celui-ci. A contrario, lancée avec un utilisateur basique, seuls les logs lui appartenant seront visibles. C'est une amélioration du traditionnel format de <path>/var/log/messages</path>:

  • Les lignes de priorité erreur (ou supérieur) sont affiché en rouge
  • Les lignes de priorité notice/warning sont affiché en gras
  • Les timestamps sont convertis en date/heure locale
  • La sortie est utilise automatiquement un pager ( <app>less</app> par défaut)
  • Affiche toutes les traces, même celles qui ont subies une rotation de logs.
  • Un démarrage du système est clairement identifié

Les logs contiennent les trois sources possibles de messages du daemon:

  • Appel depuis la GLibc syslog
  • Appel à l'API native de Journal
  • Écriture sur STDOUT et STDERR

Contrôle d'accès

Afin d'autoriser un utilisateur à visualiser les logs du système, sans devoir devenir le super-utilisateur root, il est prévu que les logs soient lisibles par les membres du groupe adm:

usermod -a -G adm didier

Temps réel

Le lancement de cette commande sans argument affiche tous les logs et peut contenir beaucoup de traces. Pour afficher les traces en temps réel, on ajoute l'option -f comme pour la commande <app>tail</app>. Cette commande est équivalente à <app>tail -f /var/log/messages</app>

journalctl -f

Cela affiche les dix dernières lignes et se rafraichie en temps réel.

Filtrage Basique

  • Pour visualiser uniquement les logs depuis le démarrage
    journalctl -b
  • On peut coupler les filtres: affichage des logs générés depuis le démarrage et de priorité erreur
    journalctl -b -p err
  • Si la période entre deux démarrage est longue, filtrer sur une date est plus intéressant
    journalctl --since=yesterday
  • Pour chercher les traces générées le 15 et 16 octobre 2012
    journalctl --since=2012-10-15 --until="2011-10-16 23:59:59"
  • Pour chercher les traces générées par apache aujourd'hui entre minuit et 09h30
    journalctl -u httpd --since=00:00 --until=9:30
  • Pour chercher les traces générées par le disque /dev/sda
    journalctl /dev/sda
  • Pour chercher les traces générées par l'application dhclient
    journalctl /usr/sbin/vpnc
  • On peut spécifier plus d'une application
    journalctl /sbin/dhclient /sbin/bridge

Filtrage avancé

Systemd garde chaque trace avec un jeu de meta-données implicite en interne. Ces meta-données ressemble à des variables d'envirronement mais elles sont un petit peu plus que cela.

journalctl -o verbose -n
[...]
Fri 2013-09-27 12:35:01 CEST [s=fc9f8071f2d340d2a90223d0ee936891;i=4d94;b=6316626194e143398f819153c8ed4397;
m=383ce9d94;t=4e75b09ec1023;x=402b0415f704584d]
        PRIORITY=6
        _UID=0
        _MACHINE_ID=466993867b10491ea29f60dce19b9347
        _HOSTNAME=didier.b2pweb.com
        _TRANSPORT=syslog
        _SYSTEMD_OWNER_UID=1000
        SYSLOG_FACILITY=9
        _COMM=crond
        _EXE=/usr/sbin/crond
        _SELINUX_CONTEXT=system_u:system_r:crond_t:s0-s0:c0.c1023
        _GID=1000
        SYSLOG_IDENTIFIER=CROND
        MESSAGE=(didier) CMD (/home/didier/vcs/b2pweb/website/webservice-monitoring/client/webservice-monitoring-graph.sh)
        _AUDIT_LOGINUID=1000
        _CMDLINE=/usr/sbin/CROND -n
        _AUDIT_SESSION=281
        _SYSTEMD_CGROUP=/user/1000.user/281.session
        _SYSTEMD_SESSION=281
        _BOOT_ID=6316626194e143398f819153c8ed4397
        SYSLOG_PID=11437
        _PID=11437
        _SOURCE_REALTIME_TIMESTAMP=1380278101347809

(I cut out a lot of noise here, I don't want to make this story overly long. -n without parameter shows you the last 10 log entries, but I cut out all but the last.)

Avec l'option -o, les meta-data sont affichées. Le plus intéressant est le stockage des informations de connexion, le contexte SELinux, nom d'hôte, etc... Pour la liste exhaustive des meta-données, on peut consulter la page man.

tous les champs des meta-données sont indexés.

  • Affichage de tous les messages concernant l'utilisateur d'identifiant 1000
    journalctl _UID=1000
  • Affichage de tous les messages concernant les utilisateur d'identifiant 1000 et 1001
    journalctl _UID=1000 _UID=1001
  • Affichage de tous les messages concernant l'hôte didier.b2pweb.com et provenant d'une tâche planifiée
    journalctl _HOSTNAME=didier.b2pweb.com _COMM=crond
  • Affichage de tous les messages concernant l'hôte didier.b2pweb.com et provenant d'un utilisateur d'identifiant 1000 OU concernant l'hôte koji.b2pweb.com et provenant d'une tâche planifiée
    journalctl _HOSTNAME=didier.b2pweb.com  _UID=1000 + _HOSTNAME=koji.b2pweb.com _COMM=crond
    Le + est ici une condition OU explicite.

Et encore plus fort

La complétion automatique est possible avec <app>journalctl</app>.

Pour taper journalctl -F _SYSTEMD_UNIT, il est possible de taper juste journalctl _SE suivi d'une tabulation pour que le champs des meta-données sont complété automatiquement ou un choix propsé dans le cas où plusieurs complément est possible.

Mais là où c'est vraiment bluffant, c'est qu'une fois le nom du champs entier ( suivi du signe =, une autre tabulation affiche toutes les valeurs déjà enregistrées dans le journal.

journalctl _SELINUX_CONTEXT=<TAB><TAB>
kernel                                                       system_u:system_r:local_login_t:s0-s0:c0.c1023
system_u:system_r:udev_t:s0-s0:c0.c1023                      system_u:system_r:accountsd_t:s0                                                
system_u:system_r:lvm_t:s0                                   system_u:system_r:virtd_t:s0-s0:c0.c1023
system_u:system_r:avahi_t:s0                                 system_u:system_r:modemmanager_t:s0-s0:c0.c1023
system_u:system_r:vpnc_t:s0                                  system_u:system_r:bluetooth_t:s0
system_u:system_r:NetworkManager_t:s0                        system_u:system_r:xdm_t:s0-s0:c0.c1023
system_u:system_r:chkpwd_t:s0-s0:c0.c1023                    system_u:system_r:policykit_t:s0
system_u:system_r:chronyd_t:s0                               system_u:system_r:rtkit_daemon_t:s0
system_u:system_r:crond_t:s0-s0:c0.c1023                     system_u:system_r:syslogd_t:s0
system_u:system_r:devicekit_disk_t:s0                        system_u:system_r:system_cronjob_t:s0-s0:c0.c1023
system_u:system_r:dhcpc_t:s0                                 system_u:system_r:system_dbusd_t:s0-s0:c0.c1023
system_u:system_r:dnsmasq_t:s0-s0:c0.c1023                   system_u:system_r:systemd_logind_t:s0
system_u:system_r:init_t:s0                                  system_u:system_r:systemd_tmpfiles_t:s0
unconfined_u:system_r:rpm_t:s0-s0:c0.c1023                   unconfined_u:system_r:unconfined_t:s0-s0:c0.c1023
unconfined_u:system_r:useradd_t:s0-s0:c0.c1023               unconfined_u:unconfined_r:unconfined_dbusd_t:s0-s0:c0.c1023
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

De plus, la sortie peut-être formatée en JSON.