Wie stelle ich `/ dev / log` in systemd + rsyslog host wieder her?

10

Übernimmt auf RHEL7 systemd-journaldviele der Aufgaben dessen, was einst von getan wurde rsyslogd. Ob durch Fehler oder Konflikte zwischen diesen beiden Dämonen, manchmal /dev/logwird es verschwinden. Infolgedessen syslog(3)funktionieren Programme, die sich auf den Aufruf verlassen, nicht ordnungsgemäß, einschließlich beispielsweise logger. Wie kann ich den /dev/logSocket wiederherstellen ?

Otheus
quelle

Antworten:

13

Meine eigene Frage stellen und beantworten, da Google in dieser Frage nicht sehr hilfreich war.

Normalerweise erstellt rsyslogddas imuxsockModul mit den /dev/logSocket selbstständig und hebt die Verknüpfung des vorherigen Eintrags auf, bevor er erstellt wird. Wenn rsyslogdgestoppt wird (möglicherweise weil ein Neustart aufgrund einer fehlerhaften Konfiguration fehlschlägt), wird rsyslogd entfernt /dev/log .

Es wird jedoch RHEL7erwartet, dass das mitgelieferte rsyslog in Verbindung mit verwendet wird systemd, und das imuxsockModul öffnet und entfernt tatsächlich den /run/systemd/journal/syslogSocket. In der Zwischenzeit wird das /dev/logGerät von der Systemdienstdatei erstellt, systemd-journald.socketdie ausgelöst wird journald.

Unabhängig davon, ob ein $imjournalModul verwendet wird oder nicht , funktioniert anscheinend Folgendes.

In der Summe, wenn /dev/logverschwindet:

  1. Starten Sie systemd-journald.socket neu:

    systemctl restart systemd-journald.socket
    
  2. Starten Sie dann rsyslogd neu

    systemctl start rsyslogd
    

UPDATE: Ich glaube, restart rsyslogdder Socket rsyslogdwird möglicherweise erneut gelöscht, wenn er bereits ausgeführt wird.

Otheus
quelle
2
Vielen Dank dafür! Ich habe gerade einige Stunden verloren, um herauszufinden, warum die Protokollierung für einen Dienst nicht funktioniert hat. Ich habe es schließlich auf das fehlende / dev / log zurückgeführt, was mich zu Ihrer Lösung führte.
Chad Huneycutt
4

Die systemctl restart systemd-journald.socket && systemctl restart rsyslogLösung hat unter Ubuntu 16.04 bei mir nicht funktioniert.

Stattdessen musste ich /dev/logals Symlink neu erstellen zu /run/systemd/journal/dev-log:

ln -s /run/systemd/journal/dev-log /dev/log
11181
quelle
Ja, die manuelle Verknüpfung sollte ebenfalls funktionieren. Aber es ist etwas unhandlich, sich daran zu erinnern. Frage: Gibt es unter Ubuntu systemd-journald.socketeinen Dienst? F2: Vielleicht restart rsyslogdwar das das Problem? Vielleicht sollte es einfach sein start rsyslogd?
Otheus
Q1: Ja, es existiert. F2: Es gibt keinen restartBefehl mehr, es gibt serviceund /etc/init.d/rsyslog.
11181
Damit restart rsyslogddachte ich, es sei klar, ich meinte systemctl restart rsyslogd. Verwendet Ubuntu noch Init-Skripte für rsyslog?
Otheus
@Otheus /etc/init.d/rsyslog stopgefolgt von /etc/init.d/rsyslog starthat nicht geholfen. Weder habe systemctl stop syslog.socket rsyslog.service && systemctl start syslog.socket rsyslog.serviceAuf meinem System gibt es sowohl /lib/systemd/system/rsyslog.serviceund /etc/init.d/rsyslog. Auf jeden Fall würde ich lieber nicht mehr Zeit mit diesem Problem verbringen.
11181
0

Für mich war dies ein Problem damit, wie das in rsyslog verwendete imuxsock-Modul mit systemd funktionierte.

In der imuxsock-Dokumentation wird erläutert, wie das Modul für systemd funktionieren soll. In Schritt 1 sah ich Probleme:

Schritt 1: Wählen Sie den Namen des System-Sockets

  1. Wenn der Benutzer SysSock.Use = "off" nicht explizit ausgewählt hat, wird der Standardname für den Listener-Socket (auch bekannt als "System Log Socket" oder einfach "System Socket") auf / dev / log gesetzt. Wenn der Benutzer SysSock.Use = "off" explizit festgelegt hat, überwacht rsyslog andernfalls nicht / dev / log ODER einen durch den Parameter SysSock.Name definierten Socket, und der Rest dieses Abschnitts gilt nicht.

  2. Wenn der Benutzer sysSock.Name = "/ path / to / custom / socket" angegeben hat (und SysSock.Use = "off" nicht explizit festgelegt hat), wird der Standard-Listener-Socket-Name mit / path / to / custom / socket überschrieben .

  3. Andernfalls wird der Standard-Listener-Socket-Name mit / run / systemd / journal überschrieben, wenn rsyslog unter systemd ausgeführt wird UND / run / systemd / journal / syslog vorhanden ist (UND der Benutzer hat SysSock.Use nicht explizit auf "off" gesetzt) / syslog.

Das System sollte in Schritt 3 fallen und den Standardpfad in "/ run / systemd / journal / syslog" ändern, aber stattdessen "/ var / log" bleiben. Dies bedeutete, dass das imuxsock-Modul versuchte (und manchmal erfolgreich war), einen Socket in / dev / log zu erstellen, in dem stattdessen eine symbolische Verknüpfung erstellt werden sollte, die vom systemd-journald-dev-log.socket erstellt wurde. Für den Fall, dass der echte Socket nicht erstellt werden kann, wird die symbolische Verknüpfung weiterhin entfernt.

Diese Dokumentation war das Ergebnis dieses Problems , das auf dem rsyslog-Github gemeldet wurde. Wenn Sie die Diskussion überspringen und direkt zu den Änderungen springen möchten, lesen Sie PR # 1 bzw. PR # 2 .

Meine Lösung bestand darin, das imuxsock-Modul so zu konfigurieren, dass der Pfad systemd in meiner Datei /etc/rsyslog.conf verwendet wird:

module(load="imuxsock"
    SysSock.Name="/run/systemd/journal/syslog")

Dies scheint mein Problem behoben zu haben und klingt hier nach einer guten Lösung, da es erklären würde, warum der symbolische Link möglicherweise wieder verschwindet, nachdem Sie ihn manuell erstellt haben.

Wenn Sie auf Ihr System schauen und "/ run / systemd / journal / syslog" nicht vorhanden ist, überprüfen Sie in der Datei "syslog.socket", ob es erfolgreich gestartet wurde, da dies für die Erstellung des Sockets verantwortlich ist.

systemctl status syslog.socket

Möglicherweise definiert Ihre Version von rsyslog.service syslog.service nicht als Alias, der benötigt wird, wenn syslog.socket versucht, diesen Dienst zu aktivieren. Es ist auch möglich, dass mehrere Protokollierungsdienste versuchen, syslog.service als Alias ​​zu verwenden. In diesem Fall gewinnt der zuletzt aktivierte.

Adam
quelle