Zapisywanie logow z pracy pythona do pliku txt

Zapisywanie logow z pracy pythona do pliku txt
WO
  • Rejestracja:ponad 6 lat
  • Ostatnio:prawie 2 lata
  • Postów:25
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:

Kopiuj
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

Kopiuj
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 ?

Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:prawie 2 lata
  • Lokalizacja:Wrocław
  • Postów:13042
0

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


edytowany 2x, ostatnio: Patryk27
IN
  • Rejestracja:prawie 8 lat
  • Ostatnio:około 2 miesiące
  • Postów:110
1

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

WO
  • Rejestracja:ponad 6 lat
  • Ostatnio:prawie 2 lata
  • Postów:25
0

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

Kopiuj
        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)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.