Heim > Backend-Entwicklung > Python-Tutorial > Wie kann ich Pythons sys.stdout sowohl im interaktiven als auch im Daemon-Modus in eine Protokolldatei duplizieren?

Wie kann ich Pythons sys.stdout sowohl im interaktiven als auch im Daemon-Modus in eine Protokolldatei duplizieren?

Linda Hamilton
Freigeben: 2024-12-01 12:23:11
Original
808 Leute haben es durchsucht

How Can I Duplicate Python's sys.stdout to a Log File in Both Interactive and Daemon Modes?

Duplizieren von sys.stdout in eine Protokolldatei

Durch das Duplizieren von sys.stdout in eine Protokolldatei können Sie alle Ausgaben, einschließlich Systemaufrufe, erfassen , aus einer Python-Anwendung. Trotz ihrer Einfachheit stellt diese Aufgabe eine einzigartige Herausforderung dar, wenn die Anwendung sowohl im interaktiven als auch im Daemon-Modus arbeitet.

Interaktiv vs. Daemon-Modus

Im interaktiven Modus, wie Sie möchten sowohl den Bildschirm als auch eine Protokolldatei, um die Ausgabe zu erhalten. Im Daemon-Modus sollten jedoch alle Ausgaben in die Protokolldatei geleitet werden. Die Funktion os.dup2() eignet sich gut zum Umleiten der Ausgabe im Daemon-Modus, bietet jedoch keine einfache Lösung zum Duplizieren der Ausgabe im interaktiven Modus, ohne Systemaufrufe zu ändern.

Duplikation mit Tee

Um dieses Problem zu lösen, können Sie die Tee-Klasse verwenden, die eine Möglichkeit bietet, stdout in eine Protokolldatei zu duplizieren. Hier ist ein Beispiel:

class Tee(object):
    def __init__(self, name, mode):
        self.file = open(name, mode)
        self.stdout = sys.stdout
        sys.stdout = self
    def __del__(self):
        sys.stdout = self.stdout
        self.file.close()
    def write(self, data):
        self.file.write(data)
        self.stdout.write(data)
    def flush(self):
        self.file.flush()
Nach dem Login kopieren

Mit dieser Klasse können Sie eine Tee-Instanz erstellen, die einen Protokolldateinamen und einen Modus als Parameter verwendet. Die write()-Methode dupliziert die Ausgabe sowohl in die Protokolldatei als auch in die Standardausgabe.

Implementierungsbeispiel

So verwenden Sie die Tee-Klasse:

with Tee('logfile.txt', 'w') as tee:
    print('Hello world!')
    os.system('ls -la')
Nach dem Login kopieren

In diesem Beispiel werden alle Ausgaben, einschließlich des Systemaufrufs von „ls -la“, sowohl auf den Bildschirm als auch in die Protokolldatei geschrieben 'logfile.txt'.

Diese Lösung protokolliert effektiv alle Ausgaben, einschließlich der Systemaufrufausgabe, ohne dass einzelne Systemaufrufe geändert werden müssen.

Das obige ist der detaillierte Inhalt vonWie kann ich Pythons sys.stdout sowohl im interaktiven als auch im Daemon-Modus in eine Protokolldatei duplizieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage