Relation entre rsyslog et journald sur Ubuntu 16.04

18

J'utilise ce qui est un serveur Ubuntu 16.04 vanilla, et j'essaie de comprendre comment la journalisation est configurée par défaut. Je peux voir que les deux journaldet rsyslogsont installés et en cours d' exécution, mais pas du tout clair pour moi comment les messages du journal sont en cours de traitement.

La plupart des messages semblent apparaître à la fois dans /var/log/sysloget via journalctl, mais je ne vois aucune configuration explicite pour le transfert entre les deux dans /etc/systemd/journald.conf(qui est essentiellement tous commentés par défaut), /etc/rsyslog.confou /etc/rsyslog.d/50-default.conf. J'ai essayé de chercher de la documentation officielle, ou même un article de blog expliquant comment ces deux sont configurés dans Ubuntu, mais je n'ai rien trouvé.

Pour ajouter encore à ma confusion, j'ai exécuté logger -p local1.info Testsur l'hôte et j'ai constaté que rien n'était écrit /var/log/syslog, alors que le message apparaissait sous journalctl.

Mes questions sont:

  1. Comment exactement journald et rsyslog fonctionnent-ils ensemble sur Ubuntu 16.04 (par défaut)?
  2. Comment se fait-il que les messages envoyés loggersemblent se retrouver dans le journal, mais pas dans syslog?

Mise à jour: s'avère loggerne pas fonctionner comme prévu était une erreur de ma part, donc ce n'est pas pertinent pour la question principale.

motns
la source

Réponses:

12

Par défaut rsyslogutilise le module "imuxsock", le module fournit:

la possibilité d'accepter des messages syslog via des sockets Unix locaux. Plus important encore, il s'agit du mécanisme par lequel l'appel syslog (3) délivre des messages syslog à rsyslogd [1] .

Il est possible rsyslogd'importer des messages de log structurés depuis systemd-journal en utilisant un module nommé "imjournal" [2] .

Il peut être chargé comme:

module(load="imjournal") 

dans:

/etc/rsyslog.conf

En revanche, "systemd-journald" capture toutes les données elles-mêmes:

man systemd-journald

systemd-journald est un service système qui collecte et stocke les données de journalisation. Il crée et tient à jour des journaux structurés et indexés basés sur des informations de journalisation reçues de diverses sources:

   ·   Kernel log messages, via kmsg
   ·   Simple system log messages, via the libc syslog(3) call
   ·   Structured system log messages via the native Journal API, 
       see sd_journal_print(4)
   ·   Standard output and standard error of system services
   ·   Audit records, via the audit subsystem

Vous pouvez désactiver rsyslogdpendant que vous avez toujours accès aux journaux système à l'aide de journalctl.

$ sudo systemctl mask rsyslogd
$ sudo systemctl stop syslog.socket
$ sudo systemctl stop rsyslog.service
$ systemctl is-active rsyslog.service 
inactive
$ logger -p mail.info Helllooo
$ journalctl

Par exemple, centos utilise le module "imuxsock" pour capturer toutes les données "systemd-journald" via rsyslogtandis qu'OpenSuse n'a pas du tout "syslog".


Pour savoir pourquoi votre message n'a pas abouti /var/log/syslog, vous devriez vérifier ce fichier:

less /etc/rsyslog.d/50-default.conf

chercher *.info, voir où ils seront stockés, il pourrait s'agir d'un autre fichier comme messages.

Pour moi, cela apparaît à la fois dans journalctlet syslog.

Ravexina
la source
logger -p .info hellon'est pas valide. Vous n'avez donné aucun nom d'installation.
luv.preet
Mise à jour de la réponse ....
Ravexina
Comme je l'ai noté dans mon montage, le fait de loggerne pas fonctionner était de ma faute, donc c'est corrigé maintenant (merci pour les conseils quand même). En ce qui concerne les journaux apparaissant à deux endroits, votre note sur imuxsocksemble être la clé: il semble que rsyslog et journald écoutent les messages syslog locaux, d'où la raison pour laquelle ces entrées vont dans deux journaux distincts.
motns
J'ai suivi ce qui précède sur ubuntu et maintenant je ne reçois aucun journal de l'enregistreur, hmm: root @ T: ~ # logger -p mail.info Helllooo root @ T: ~ # journalctl Aucun fichier journal n'a été trouvé. - Pas d'entrées - des idées?
Hackeron
Très bonne réponse. Ce qui me manque, cependant, est une note sur la façon dont journald sait ouvrir un socket syslog (ou si ce n'est pas le cas, comment il obtient les messages syslog sinon) lorsque rsyslog est désactivé? Ou une configuration manuelle de journald est-elle nécessaire?
Matthijs Kooijman
4

Systemd est un système d'initialisation utilisé pour démarrer les services au démarrage du système. Journald est responsable de la création de journaux pour les services démarrés par systemd. En intégrant journald à systemd, même les premiers messages du processus de démarrage sont disponibles pour journald.

Rsyslog est un démon spécialement conçu pour le traitement des journaux, rien à voir avec journald. Il peut accepter les journaux de plusieurs manières et les afficher de nombreuses manières. Il n'est pas activé par défaut qu'il accepte également les messages de journal de journald. Pour cela, vous devez écrire dans le fichier /etc/rsyslog.conf,

$ModLoad imjournal # im -> input module
OR
load(type="imjournal")

Maintenant, il acceptera également les journaux de m journald. Mais je vous suggère de ne pas modifier votre fichier /etc/rsyslog.conf.

À la fin du fichier /etc/rsyslog.conf, il y a une ligne écrite,

$IncludeConfig /etc/rsyslog.d/*.conf

Cela signifie que tous les fichiers ayant .conf à leur extrémité dans le dossier /etc/rsyslog.d/ doivent être inclus lors du chargement de rsyslog. Donc, toutes vos configurations personnalisées doivent aller dans ces fichiers

Je vous suggère de créer un fichier /etc/rsyslog.d/journald.conf et de coller l'extrait ci-dessous.

Ci-dessous l'extrait de la page officielle rsyslog d'imjournal

module(load="imjournal" PersistStateInterval="100"
   StateFile="/path/to/file") #load imjournal module
module(load="mmjsonparse") #load mmjsonparse module for structured logs

template(name="CEETemplate" type="string" string="%TIMESTAMP% %HOSTNAME% %syslogtag% @cee: %$!all-json%\n" ) #template for messages

action(type="mmjsonparse")
action(type="omfile" file="/var/log/ceelog" template="CEETemplate")

Ligne 1 - il charge le module imjournal pour accepter les journaux de journald

2 - Le module mmjsonparse est chargé utilisé pour l'analyse des journaux

3 - Ils sont structurés dans le format décrit dans le modèle

4 - Il analyse ces journaux en utilisant le module mmjsonparse.

5 - Il envoie ces journaux dans un fichier à savoir / var / log / ceelog selon la structure fournie dans le modèle donné, en utilisant le module omfile (fichier du module de sortie - sorties vers le fichier).

Apportez des modifications dans la configuration en fonction de vos besoins.

luv.preet
la source
Merci pour l'explication, mais je pense que la réponse de @Ravexina est plus proche de m'aider à comprendre ce qui se passe avec rsyslog et journald, par défaut (sans configuration supplémentaire).
motns