Opis problemu
Mamy kod biblioteczny w języku python, który wypisuje logi na konsolę tekstową przy pomocy polecenia print, podczas gdy wolimy 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.