Ich aktualisiere eine Reihe von Programmen für RHEL7, einigec++, mancheJava. Wenn sie als systemd-Dienste gestartet werden, möchte ich, dass sie in das systemd-Journal schreiben. Wenn sie direkt auf dem Terminal ausgeführt werden, beispielsweise zu Testzwecken, möchte ich, dass sie stattdessen in stdout schreiben. Wie kann ich das am elegantesten machen?
Ich möchte die erweiterten Funktionen des Journals nutzen (Protokollierung von Schweregrad, Dateiname, Zeilennummer, Threadname usw.), daher reicht das einfache Schreiben in die Standardausgabe nicht aus.
Meine Suche ergab den Rat, die übergeordnete PID des Prozesses oder dessen Kontrollgruppe zu überprüfen. Gibt es einen besseren Weg? Das scheinen ungeschickte Lösungen zu sein. Im Idealfall gäbe es eine Funktion, die ich aufrufen könnte, oder eine Umgebungsvariable, die ich überprüfen könnte.
Zusätzliche Information:
- Für diec++Programme, die ich anrufen möchtesd_journal_print(3).
- Für dieJavaProgramme, die ich verwenden möchte SLF4J + Logback +Logback-Journal.
(Mein Fallback-Plan besteht darin, einen Befehlszeilenschalter zu verwenden, aber es wäre sicher schön, wenn es eine automatische Erkennung gäbe.)
Antwort1
In systemd Version 231 JOURNAL_STREAM
wurde die Umgebungsvariable genau zu diesem Zweck eingeführt. Ihr Programm überprüft ihren Wert, vergleicht ihn mit dem Gerät und der I-Node-Nummer seines Standardfehlers und ändert sein Verhalten entsprechend.
WannnichtWenn Sie mit dem Journal verbunden sind, können Sie (natürlich) immer etwas wie JSON verwenden, das (als einzelne Zeile pro Objekt) in die Standardfehlerdatei geschrieben wird, um auch dort strukturierte Protokolldatensätze zu haben. RFC 5424 bietet auch (eingeschränktere) Optionen für strukturierte Daten.
Antwort2
systemd
behandelt diesen Fall bereits elegant für Sie, wie dokumentiert insystemd.exec.
Protokollieren Sie bei STDOUT. Bei Ausführung über systemd leitet systemd STDOUT standardmäßig zum Journal um.
Eine weitere Option ist, journal+console
dass Sie sich immer bei beiden anmelden möchten.
Die Protokollierung auf STDOUT ist auch eine bewährte Methode in der12 Faktor App-Design.