Python中类之间的日志记录

13 投票
1 回答
11631 浏览
提问于 2025-04-16 10:10

我在Python中有三个类,它们在不同的线程中运行。我想让这三个类都能把输出写到同一个文件里。目前我在主类里创建了一个输出的方法,然后通过构造函数把这个方法传递给其他类。有没有更好的方法来处理这个问题?除了使用构造函数,我还能怎么在类之间传递日志记录器?

也许Python支持类似Java中的静态方法,这样我就可以在三个类中都写Logger.info(message)?

另外一种方法可能是把全局的sys.stdout重定向到一个文件,也就是指定

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

然后在所有类中使用sys.stdout的调用。

你觉得怎么样?

1 个回答

25
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

请注意,当你从多个线程记录信息时,日志文件中消息出现的顺序可能和它们实际发生的顺序并不完全一致。

撰写回答