#python #logging
#python #ведение журнала
Вопрос:
Я пытаюсь реализовать опцию, которая дополнительно сохранит вывод консоли в файл. (если опция активирована)
Я нашел два способа: 1. использовать модуль ведения журнала 2. написать класс, подобный этому:
class MyWriter:
def __init__(self, stdout, filename):
self.stdout = stdout
self.logfile = file(filename, 'a')
def write(self, text):
self.stdout.write(text)
self.logfile.write(text)
def close(self):
self.stdout.close()
self.logfile.close()
Но у меня проблема.
Некоторые фрагменты кода будут выполняться в новом процессе. И этот способ не улавливает их отпечатки.
Когда я запускаю свою программу, как
"myscript.py > mylog.txt"
это работает. Он получил все отпечатки. Но как я могу функционально имитировать это в моем скрипте?
Комментарии:
1. Как создаются эти процессы? Вы сами запускаете эти процессы или они вызываются каким-то другим кодом поддержки?
Ответ №1:
Если я вас правильно понимаю, вы хотите перенаправить stdout
другой процесс, который вы запускаете правильно?
Тогда все, что вам нужно сделать, это использовать
subprocess.Popen(...)
команда. Затем вы должны использовать свой MyWriter
класс с ним.
Комментарии:
1. Я также использую этот класс в своем новом процессе. Это работает. Спасибо вам, ребята.
Ответ №2:
Мое предложение состояло бы в том, чтобы использовать модуль ведения журнала, использовать sockethandler и отправлять на сервер сокетов, который записывал бы полученные журналы в файл.
Я надеюсь, что это поможет
Ответ №3:
Проблема, вероятно, должна быть решена при выполнении нового процесса, вам нужно либо собрать выходные данные из подпроцесса в главном процессе, либо передать имя файла подпроцессу. Вы можете использовать переменные среды для имени файла вместо передачи его в качестве аргумента, тогда будет легко получить доступ к файлу журнала и в подпроцессе.