Подтвердить что ты не робот

Регистрация между классами в python

У меня есть три класса в python, и они работают в разных потоках. Я хотел бы получить вывод в тот же файл из всех классов. Прямо сейчас я создал метод вывода в основном классе и передал его через конструкторы в другие классы. Есть ли способ справиться с этим лучше? Как я могу передать логгер между классами, кроме использования конструкторов?

Возможно, python поддерживает что-то вроде статического метода в Java, поэтому я могу писать как Logger.info(сообщение) во всех трех классах?

Другим способом, вероятно, может быть перенаправление глобального файла sys.stdout в файл, т.е. указание

logger = open('debug.txt', 'w')
sys.stdout = logger

Затем, используя вызовы sys.stdout во всех классах.

Как вы думаете?

4b9b3361

Ответ 1

import logging
log = logging.getLogger("mylog")
log.setLevel(logging.DEBUG)

formatter = logging.Formatter(
    "%(asctime)s %(threadName)-11s %(levelname)-10s %(message)s")
# Alternative formatting available on python 3.2+:
# formatter = logging.Formatter(
#     "{asctime} {threadName:>11} {levelname} {message}", style='{')

# Log to file
filehandler = logging.FileHandler("debug.txt", "w")
filehandler.setLevel(logging.DEBUG)
filehandler.setFormatter(formatter)
log.addHandler(filehandler)

# Log to stdout too
streamhandler = logging.StreamHandler()
streamhandler.setLevel(logging.INFO)
streamhandler.setFormatter(formatter)
log.addHandler(streamhandler)

# Test it
log.debug("Some message")
log.error("An error!")
try:
    something()
except:
    log.exception("An exception occured!")

И заходите в debug.txt:

2011-01-18 12:07:24,943  MainThread  DEBUG      Some message
2011-01-18 12:07:24,943  MainThread  ERROR      An error!
2011-01-18 12:07:24,943  MainThread  ERROR      An exception occured!
Traceback (most recent call last):
  File "./logtest.py", line 17, in 
    something()
NameError: name 'something' is not defined

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