Запись sys.stdout в несколько файлов журнала с использованием Python?

#python #stdout

#python #стандартный вывод

Вопрос:

Мне трудно понять, в чем проблема с моим фрагментом кода для записи сообщений печати в моей консоли в несколько файлов журнала.

Предполагается, что фрагмент кода, который я опубликовал ниже, должен создать новый каталог test , затем записать 11 файлов журнала, 1 глобальный файл журнала и 10 файлов журнала цикла в этот каталог. Однако при запуске 1st 2 сообщения о печати в моем глобальном файле журнала отсутствуют, и я не могу понять, в чем проблема?

 import sys
import os

# Create a test folder to store these global and loop log files.

path = os.getcwd()
test_dir_name = 'test'
test_dir_path = os.path.join(path, test_dir_name)
os.mkdir(test_dir_path)

# Keep a reference to the original stdout.
orig_stdout = sys.stdout

# Define global logfile path.
global_log_name = "global-log.txt"
global_log_path = os.path.join(test_dir_path, global_log_name)

# Problematic code-snippet
sys.stdout = open(global_log_path, 'w')
print("This is a global log file.") # Why is my code omitting this line?
print("The loop is now creating 10 individual log files.") # And this one?  
sys.stdout.close()

for i in range(10):
    sys.stdout = open(global_log_path, 'w')
    print("Creating loop log file {}...".format(i))
    sys.stdout.close()
    
    loop_log_name = "local-log-{}.txt".format(i)
    loop_log_path = os.path.join(test_dir_path, loop_log_name)
    
    sys.stdout = open(loop_log_path, 'w')
    print("This is loop log file {}".format(i))
    print("Closing this loop log file...")
    sys.stdout.close()

sys.stdout = open(global_log_path, 'w')
print("Loops have concluded.") # But then it includes this line.
print("Now closing global log file.") # And this line in the global log file.
sys.stdout.close()

sys.stdout = orig_stdout
print("Back to original console.")

 

Некоторая помощь была бы весьма признательна.

Комментарии:

1. Было бы проще использовать logging для этого…

Ответ №1:

Основной проблемой этого фрагмента кода является неправильное использование open(global_log_path, 'w') для добавления дополнительных сообщений печати global-log.txt . После первоначального выполнения:

 sys.stdout = open(global_log_path, 'w')
print("This is a global log file.") # Why is my code omitting this line?
print("The loop is now creating 10 individual log files.") # And this one? 
 

Последующие перенаправления stdout to global-log.txt вместо этого требуют передачи аргумента a , обозначающего append to open() like so:

 sys.stdout = open(global_log_path, 'a')
print("Creating loop log file {}...".format(i))
 

Это предотвращает перезапись ранее перенаправленного текста, что происходило с вашим фрагментом кода.