Zapisywanie logow z pracy pythona do pliku txt

0

Hej, mam pewnien problem. Uruchamiam plik .bat ktory uruchamia plik pythona z testami. Wykonanie calego pliku trwa kilka godzin, dlatego dobrze by bylo móc gdzieś zapisać konsole pythona w razie bledu. Probowalem w taki sposob:

def run_and_save_output():
    logfile = open(log_file, 'w')
    proc = subprocess.Popen([sys.executable, script_name], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    for line in proc.stdout:
        sys.stdout.write(line)
        logfile.write(line)
    proc.wait()

generalnie dla malych plikow dziala fajnie, jest plik z logami i sa wyniki w konsoli. Natomiast gdy uruchamiam duzy plik jak ten z testami to pojawia sie problem taki ze w konsoli nie ma nic dośc długo, wyglada jakby sie zwiesilo i dopiero po jakims czasie sie pojawiaja informacje takimi porcjami i sa niekompletne i w innym porządku niz podczas normlanego uruchamiania.
Probowalem też innym sposobem, w batchu za pomoca tego : > np

python run_test.py > log_file.txt

W tym przypadku w consoli nie ma nic, natomiast log file tez ma zaburzona kolejnosc i nie ma tam wszystkich informacji.

Plik z testami uruchamia też za pomocą os.system inny plik pythona i interperter ( python 2.2) oraz konsole Matlaba. W logach wyglada to tak jakby raz bylo info z konsoli pythona 2.2 , raz z pythona 2.7.
Jest jakis sposob by skopiowac całą konsole pythona/batcha do pliku .txt ?

0

Nie możesz wprost some.bat > log.txt? :-P
(+ ofc. stderr oraz inne możliwe streamy)

1

Przeczytaj sobie to https://realpython.com/python-logging/ , logi się będą odkładały tam gdzie chcesz ;)

0

Dzięki, zastosowałem logging i taki blok kodu robi to co trzeba bylo:

        self.format = logging.Formatter("%(asctime)s - %(levelname)s - %(message)s")
        self.logging_root = logging.getLogger()

        self.fileHandler = logging.FileHandler(path_to_log_file)
        self.fileHandler.setFormatter(self.format)
        self.logging_root.addHandler(self.fileHandler)

        self.consoleHandler = logging.StreamHandler()
        self.consoleHandler.setFormatter(self.format)
        self.logging_root.addHandler(self.consoleHandler)

        self.logging_root.setLevel(logging.DEBUG)

i nastepnie odwołanie sie poprzez np : self.logging_root.error(message)

1 użytkowników online, w tym zalogowanych: 0, gości: 1