16 kwietnia 2016

Przekierowanie wyjścia [Python]

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.