Перенаправлять отпечатки в файл журнала
Хорошо. Я завершил свою первую программу python. У нее около 1000 строк кода.
Во время разработки я разместил множество операторов print
перед запуском команды, используя os.system()
скажем что-то вроде:
print "running command",cmd
os.system(cmd)
Теперь я закончил программу. Я подумал о том, чтобы комментировать их, но перенаправляю всю эту ненужную печать (я не могу удалить все операторы print
- поскольку некоторые предоставляют полезную информацию для пользователя) в файл журнала будет более полезен? Любые трюки или подсказки.
Ответы
Ответ 1
Python позволяет вам записывать и назначать sys.stdout - как упоминалось - для этого:
import sys
old_stdout = sys.stdout
log_file = open("message.log","w")
sys.stdout = log_file
print "this will be written to message.log"
sys.stdout = old_stdout
log_file.close()
Ответ 2
Вы должны посмотреть модуль регистрации python
EDIT: Пример кода:
import logging
if __name__ == "__main__":
logging.basicConfig(level=logging.DEBUG, filename="logfile", filemode="a+",
format="%(asctime)-15s %(levelname)-8s %(message)s")
logging.info("hello")
Создайте файл с именем "logfile" с контентом:
2012-10-18 06:40:03,582 INFO hello
Ответ 3
-
В следующий раз вы будете счастливее, если вместо использования инструкций print
вы будете использовать модуль logging
с самого начала. Он предоставляет требуемый элемент управления, и вы можете записать его в stdout, пока он еще там, где вы хотите.
-
Многие люди предложили перенаправить stdout. Это уродливое решение. Он мутирует глобальный и, что еще хуже, он мутирует его для использования этого модуля. Я бы скорее сделал регулярное выражение, которое меняет все print foo
на print >>my_file, foo
и устанавливает my_file
на stdout или фактический файл по моему выбору.
- Если у вас есть другие части приложения, которые на самом деле зависят от написания на stdout (или когда-либо в будущем, но вы еще этого не знаете), это нарушает их. Даже если вы этого не сделаете, это делает чтение вашего модуля похожим на одно, когда оно действительно делает другое, если вы пропустили одну маленькую линию вверх.
- Печать Chevron довольно уродлива, но не так уродлива, как временное изменение
sys.stdout
для процесса.
- Очень технически говоря, замена регулярного выражения не способна сделать это правильно (например, он может создавать ложные срабатывания, если вы находитесь внутри многострочного литерала строки). Тем не менее, он подходит для работы, просто следите за ним.
-
os.system
практически всегда уступает использованию модуля subprocess
. Последние не должны вызывать оболочку, не пропускают сигналы таким образом, который обычно нежелателен, и могут использоваться неблокируемым образом.
Ответ 4
Вы можете перенаправить замену sys.stdout на любой объект, который имеет тот же интерфейс, что и sys.stdout, в этом объекте write вы можете печатать на терминал и в файл тоже. например см. этот рецепт http://code.activestate.com/recipes/119404-print-hook/
Ответ 5
Простой способ перенаправления stdout и stderr с помощью модуля регистрации:
Как дублировать файл sys.stdout в файле журнала в python?
Ответ 6
Вы можете создать файл журнала и подготовить его для записи. Затем создайте функцию:
def write_log(*args):
line = ' '.join([str(a) for a in args])
log_file.write(line+'\n')
print(line)
а затем замените имя функции print() на write_log()
Ответ 7
Вставка собственного файла в sys.stdout
позволит вам выводить текст через print
.
Ответ 8
Просто примечание о добавлении и режиме записи. Измените filemode на "w", если вы хотите заменить файл журнала. Я также должен был закомментировать поток. Затем с помощью logging.info() выводился в указанный файл.
if __name__ == '__main__':
LOG_FORMAT = '%(asctime)s:%(levelname)s ==> %(message)s'
logging.basicConfig(
level=logging.INFO,
filename="logfile",
filemode="w",
format=LOG_FORMAT
#stream=sys.stdout
)