Notatnik techniczny

Przekierowanie wyjścia [Python]

Opis problemu

Mamy kod biblioteczny w języku python, który wypisuje logi na konsolę tekstową przy pomocy polecenia print.

Chcemy wszystko, co idzie na ekran, mieć nadal na ekranie oraz dodatkowo w pliku, bez modyfikacji istniejącego kodu.

Bezmyślne podmienienie strumieni, jak poniżej, spowoduje, że na ekranie zobaczymy ciemność.

import sys
sys.stdout = open('file', 'w')
print 'test'

Rozwiązanie problemu

import sys
 
class Logger(object):
    def __init__(self):
        self.log_destination = [sys.stdout]
 
    def add_log_file(self, filename):
        self.log_destination.append(open(filename, "a"))
 
    def write(self, message):
        for item in self.log_destination:
            item.write(message)
 
    def flush(self):
        for item in self.log_destination:
            item.flush()

Przykład użycia

import sys
import Logger
 
print "Test 1"
sys.stdout = Logger.Logger()
sys.stdout.add_log_file("log.log")
print "Test 2"
print "Test 3"

Na ekranie zobaczymy trzy linie, a w pliku tylko dwie ostatnie.

Start