在python中的类之间进行日志记录

yar*_*art 13 python logging

我在python中有三个类,它们在不同的线程中运行.我想从所有类输出到同一个文件.现在我在主类中创建了输出方法,并通过构造函数将其传递给其他类.有没有办法更好地处理它?除了使用contructors之外,我如何在类之间传递记录器?

也许python支持类似Java中的静态方法,所以我可以在所有三个类中编写类似Logger.info(message)的东西?

另一种方法可能是将全局sys.stdout重定向到文件,即指定

logger = open('debug.txt', 'w')
sys.stdout = logger
Run Code Online (Sandbox Code Playgroud)

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

你怎么看?

Lau*_*low 24

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!")
Run Code Online (Sandbox Code Playgroud)

并进入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

请注意,消息在日志文件中的显示顺序可能与您从多个线程进行日志记录时的顺序完全不一致.

  • @lazyr:如果是`logging`模块,你不需要这样做 - `logging`模块本身会将它创建的记录器保存在自己的模块中.您可以在另一个模块中再次运行`logging.getLogger`,您将获得相同的对象. (4认同)
  • @lazyr。谢谢你的回答。我如何在类之间传递日志对象,以便将所有三个文件写入同一日志文件? (2认同)