Print-Ausgaben in Datei OHNE Programmänderung?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
wonk
User
Beiträge: 12
Registriert: Mittwoch 15. November 2023, 21:29

Hallo - Python dummy!
Ich habe ein Python-Prog mit diversen print-Ausgaben zur Kontrolle.
Fertig gestellt läuft dieses Programm als service. Dann sehe ich aber leider die Ausgaben nicht mehr (bzw. mit systemctl status mnur wenige Zeilen).
Gibt es eine Möglichkeit, durch EINE Zeile am Anfang des Programms ALLE Printausgaben in eine logdatei zu leiten OHNE das ich jede print-Ausgabe ändern muss? (etwas mit stdout = ???)
Gruss, wonk
Benutzeravatar
sparrow
User
Beiträge: 4227
Registriert: Freitag 17. April 2009, 10:28

1. Möglichkeit: Vernünftiges Logging ins Programm einbauen. Braucht mehr als eine Zeile.

2. Möglichkeit: Die systemd serviceunit so konfigurieren, dass stdout geloggt wird.
wonk
User
Beiträge: 12
Registriert: Mittwoch 15. November 2023, 21:29

zu 1.: Habe ich jetzt auch erkannt, ist aber nachher aufwendig.
zu 2.: Ich nehme an, das funktioniert über Linux. Ich versuche mal so was wie
StandardOutput=append:/var/log/ausgabe.log einzubauen.
Gruss, wonk
wonk
User
Beiträge: 12
Registriert: Mittwoch 15. November 2023, 21:29

Klapp leider nicht, evtl. da systemd Version 232 ist.
Gruss, wonk
Benutzeravatar
__blackjack__
User
Beiträge: 13185
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@wonk: Natürlich geht das, es wäre nicht mal unwahrscheinlich das Du gar nichts machen musst weil das schon passiert wenn Du die letzten paar Ausgaben schon über die Systemwerkzeuge bekommst.

Ansonsten kann man eigentlich immer ausserhalb des Programms die Standausgabe und die Standardfehlerausgabe irgendwohin umleiten.
“There will always be things we wish to say in our programs that in all known languages can only be said poorly.” — Alan J. Perlis
wonk
User
Beiträge: 12
Registriert: Mittwoch 15. November 2023, 21:29

Hallo,
ist schön, wenn es geht. Aber einem Dummy müßtest Du schon sagen Wie. Ich habe die Ausgaben meines *.py immerhin im syslog gefunden.
Gruss, wonk
Benutzeravatar
snafu
User
Beiträge: 6747
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Sonst nimm doch notfalls einfach redirect_stdout() und übergib dort dein Logfile.

Lässt allerdings nichts Gutes ahnen, wenn du an der Stelle schon dein Tool nicht im Griff hast...
Benutzeravatar
__blackjack__
User
Beiträge: 13185
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@wonk: Das ist letztlich keine Python-Frage sondern wie das Programm gestartet wird.
“There will always be things we wish to say in our programs that in all known languages can only be said poorly.” — Alan J. Perlis
Benutzeravatar
noisefloor
User
Beiträge: 3875
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

wenn ein Python-Skript als Service via systemd gestartet wird geht doch AFAIK alles, was nach stdout geht (inkl. standardmäßig, was du unter Python mit `print()` machst) ins Journal von systemd Um alle Ausgaben zu sehen musst du halt das Journal via `journalctl` abfragen und gezielt nach deiner Unit filtern.

Richtiges Logging in eine Datei deiner Wahl geht über das Python-Modul `logging`. Bei Standardlogging ist das auch mit wenigen Zeilen Code konfiguriert.

Gruß, noisefloor
Benutzeravatar
__blackjack__
User
Beiträge: 13185
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Alternativ gäbe es externe Module für's Logging wie `loguru` oder `structlog`, je nachdem was für Anforderungen man an so ein Protokoll hat.
“There will always be things we wish to say in our programs that in all known languages can only be said poorly.” — Alan J. Perlis
wonk
User
Beiträge: 12
Registriert: Mittwoch 15. November 2023, 21:29

Hallo!
Ergebnis meiner Versuche:
- Standard-Output=append: /home/pi/sperre.log in *.service wird im syslog als Fehler zurückgewiesen
- im syslog finden sich auch so Ausgaben meines Python-Progs, aber nur sporadisch, nicht alle, nicht immer
- journalctl -o verbose _PID=<PID meines prozesses> ergibt "no entries"
Gruss, wonk
Benutzeravatar
__blackjack__
User
Beiträge: 13185
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@wonk: Was heisst „wird im syslog als Fehler zurückgewiesen“ konkret? Auch wenn man das korrekt schreibt, ohne Zeichen die da nicht hingehören? Hat systemd die entsprechenden Rechte die Datei zu schreiben?

Der dritte Punkt ohne die kaputte Umleitung? Und wenn man da explizit angibt, das die Ausgabe ins Journal soll?
“There will always be things we wish to say in our programs that in all known languages can only be said poorly.” — Alan J. Perlis
wonk
User
Beiträge: 12
Registriert: Mittwoch 15. November 2023, 21:29

Hallo,
im syslog finde ich:
Failed to parse output specifier, ignoring append.....
Die log-Datei habe ich angelegt und Lese/Scheibrechte für alle gegeben.
Ich habe jetzt mit journalctl _SYSTEMD_UNIT=... jede Menge Ausgaben gefunden, die reichen aber nicht mehr für das laufende Prg. Wo kann ich die Datei sehen, aus der diese Ausgaben sind?
Gruss, wonk
Benutzeravatar
noisefloor
User
Beiträge: 3875
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

welche Distro nutzt du? Bei den meisten Distro ist journald von systemd für's Logging zuständig und auf syslog wird "nur noch" je nach Konfiguration weitergeleitet (oder eben nicht).

Das gut systemd ist, dass es sehr umfangreich dokumentiert ist, inkl. journalctl.

Um die Logs von einer Unit gezielt abzufragen rufst du `journalctl -u NAME_DEINER_UNIT` auf. `NAME_DEINER_UNIT` ist der Dateiname deiner Unitdatei. Mit den Optionen `--since` und `--until` und `--boot` kannst du den Zeitraum einschränken.

Gruß, noisefloor
wonk
User
Beiträge: 12
Registriert: Mittwoch 15. November 2023, 21:29

Hallo,
es ist ein Spezialimage (volkszähler auf Basis von Debian wohl).
Heute morgen kamen auf einmal die vermissten Daten mit journalctl. Offensichtlich werden die Daten in - wohin auch immer - nicht kontinuierlich geschrieben, sondern kommen einmal am Tag für den ganzen Vortag. Ist das normal? In journald.conf finde ich nur auskommentierte Einträge
Gruß, wonk
Gruss, wonk
Benutzeravatar
noisefloor
User
Beiträge: 3875
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Offensichtlich werden die Daten in - wohin auch immer - nicht kontinuierlich geschrieben, sondern kommen einmal am Tag für den ganzen Vortag. Ist das normal?
Nein, ist es nicht. Ich wüßte auch nicht, dass man journald so konfigurieren kann. Man kann das Logging in Journal so einstellen, dass es temporär ist (=nur im RAM / Temp-Speicher lebt = bei Neustart des Rechners weg) oder persistent mit einer begrenzten Größe des Journals in Tagen oder Größe oder gar kein Logging.

Entweder machst du einen Fehler bei der Abfrage oder deine (zumindest mir nicht bekannte) Distro ist extrem komisch. Jedenfalls ist das Problem von Python und die solltest das Problem im Supportforum deines Vertrauens der von dir verwendeten Distro weiter verfolgen. Oder wie vorgeschlagen richtiges Logging via Python mit einem passenden Python-Modul einsetzen.

Gruß, noisefloor
wonk
User
Beiträge: 12
Registriert: Mittwoch 15. November 2023, 21:29

Danke!
Gruss, wonk
Benutzeravatar
Kebap
User
Beiträge: 695
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

Also in der Zeit hättest du locker "print" durch logging ersetzen können, und noch was für die Zukunft gelernt.
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
Benutzeravatar
__blackjack__
User
Beiträge: 13185
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Naja, ich würde auch bei `logging` (oder `loguru`) trotzdem einfach nach stdout loggen und den Rest über systemd machen. Dafür ist das ja da.
“There will always be things we wish to say in our programs that in all known languages can only be said poorly.” — Alan J. Perlis
Antworten