Postfix meldet sich nicht mehr bei / var / log / mail an, nachdem es gelöscht und neu erstellt wurde?

10

Ich habe die /var/log/mailDatei versehentlich gelöscht . Bis zu diesem Zeitpunkt konnte ich es mit Postfix-Sachen überwachen. Nun scheint es, dass Postfix seine Protokolle nicht an sendet /var/log/mail, da die Datei nicht mit neuen Protokollnachrichten aktualisiert wird.

drpaneas
quelle

Antworten:

9

Wenn Sie die Datei mail.log löschen, verliert rsyslog (unter Ubuntu) das Handle in die Datei. Geben Sie bitte Folgendes an, damit es unter Ubuntu wieder funktioniert:

sudo service rsyslog restart

Dadurch wird nicht nur eine neue Datei erstellt, sondern es werden auch Protokolle geschrieben.

Ashish
quelle
1
Anstatt zu sagen, was Sie getan haben, machen Sie die Antwort allgemeiner (auf lehrreiche Weise) und sagen Sie uns, warum.
Julie Pelletier
4

Auch nach dem Erstellen einer leeren Datei

touch /var/log/mail

Sie müssen das Syslog neu starten

service syslog restart

und dann ist es Protokollierungsgewinn :)

drpaneas
quelle
4

Dies ist ein Fehler in Syslog, zeigt jedoch ein häufiges Problem, wenn eine Datei gelöscht wird, während sie von einem Programm geöffnet wird. Wenn Sie ein "rm" ausführen, entfernen Sie einen Verzeichniseintrag, aber Sie entfernen NICHT die zugrunde liegende Datei. Das Betriebssystem zählt die Verweise auf die Datei und löscht die zugrunde liegenden Dateidaten erst, wenn die Referenzanzahl auf Null geht. Bei einer durchschnittlichen Datei beträgt der Referenzzähler der ungeöffneten Datei eins (der Verzeichniseintrag). Wenn die Datei geöffnet wird, wird die Anzahl auf zwei erhöht. Wenn ein zweites Programm dieselbe Datei öffnet, wird die Anzahl auf drei erhöht. Wenn der Verzeichniseintrag jetzt gelöscht wird, wird die Anzahl auf zwei dekrementiert - was bedeutet, dass die Datei anomal ist (keinen Namen hat).

Wenn Sie / var / log / mail löschen, hat der Systemlogger die Datei noch zum Schreiben geöffnet. Wenn Sie ein neues / var / log / mail erstellen, verweist es auf eine andere Datei als die, die der Systemlogger gerade schreibt. Die einzige Möglichkeit, alles konsistent zu machen, besteht darin, den Systemlogger neu zu starten. Wenn der ursprüngliche Systemprotokollierer beendet wird, werden alle ihm zugeordneten Dateien geschlossen - einschließlich des anonymen E-Mail-Protokolls, dessen Verzeichniseintrag Sie gelöscht haben. Wenn Sie den Systemprotokollierer neu starten, wird er / var / log / mail erneut geöffnet, wenn eine Protokollnachricht geschrieben werden muss, und danach geöffnet.

Eine andere Möglichkeit, die häufig entdeckt wird, besteht darin, dass ein laufendes Programm die gesamte Festplatte mit Dateidaten füllt. Der Benutzer löscht die sehr große Datei, aber der Speicherplatz wird nicht freigegeben, da die Datei noch vorhanden ist und Speicherplatz belegt, der Verzeichniseintrag jedoch entfernt wurde. Wenn das Programm beendet wird (entweder weil der Benutzer es beendet hat oder weil es sich selbst beendet hat), wird der Speicherplatz wiederhergestellt, da der Referenzzähler in der Datei auf Null gegangen ist.

Um dies zu verhindern, schreibt der Protokollierer möglicherweise zuerst die Protokollnachricht, überprüft, ob der Verzeichniseintrag für die Protokolldatei vorhanden ist, und schließt die ursprüngliche Protokolldatei, öffnet eine neue und schreibt sie dann neu Nachricht - damit die Nachricht nicht verloren geht. All dies zu tun, würde jedoch viel mehr Komplexität erfordern, als der Systemlogger haben sollte - für jede Nachricht, die er schreibt, dauert das Schreiben aufgrund der zusätzlichen Verzeichnisprüfung etwas länger -, was jedes Mal erfolgreich ist, wenn die Datei vorhanden ist NICHT gelöscht worden.

Um all das besser zu verstehen, ist der folgende Befehl aufschlussreich, da er den Systemaufruf beschreibt, der das Entfernen des Verzeichniseintrags und das Referenzdekrement durchführt: "man 3 unlink"

Douglas Campbell
quelle
4

Das ist nicht das Problem unter CentOS 7. Jemand hielt es für eine großartige Idee, die Postfix-Mail-Protokolle über den Journaler zu führen. Wenn Sie Postfix-Protokolle anzeigen möchten:

journalctl -u postfix

(um das ganze Protokoll zu sehen)

journalctl -u postfix -f

(um das Protokoll zu verfolgen)

Möglicherweise benötigen Sie auch in der main.cf für Postfix

syslog_name = postfix
Nick Schneider
quelle
1
Ich habe drei Stunden lang versucht, ein System zu reparieren, bei dem die Protokollierung verschwunden ist. Hätte ich diesen Beitrag nicht gefunden, hätte ich noch 3 Stunden verbracht. Mein Tagebuch hatte 10000 Zeilen, daher hat mir dieser Befehl auch sehr geholfenjournalctl --vacuum-time=1d
Eugene van der Merwe
2

fwiw neuere Versionen von Postfix-Protokoll zu /var/log/mail.logund ich musste auch ausführen sudo chmod a+w /var/log/mail*und service postfix restartmeine Postfix-Protokolle nach dem Löschen zurückbekommen

bsautner
quelle