记录器配置以记录到文件并打印到标准输出

新手上路,请多包涵

我正在使用 Python 的日志记录模块将一些调试字符串记录到一个运行良好的文件中。现在另外,我想使用这个模块将字符串打印到标准输出。我该怎么做呢?为了将我的字符串记录到文件中,我使用以下代码:

 import logging
import logging.handlers
logger = logging.getLogger("")
logger.setLevel(logging.DEBUG)
handler = logging.handlers.RotatingFileHandler(
    LOGFILE, maxBytes=(1048576*5), backupCount=7
)
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
handler.setFormatter(formatter)
logger.addHandler(handler)

然后调用一个记录器函数

logger.debug("I am written to the file")

在这里感谢您的帮助!

原文由 stdcerr 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 385
2 个回答

只需获取根记录器的句柄并添加 StreamHandlerStreamHandler 写入标准错误。不确定您是否真的需要 stdout 而不是 stderr,但这是我在设置 Python 记录器时使用的,我还添加了 FileHandler 。然后我所有的日志都去这两个地方(这听起来像你想要的)。

 import logging
logging.getLogger().addHandler(logging.StreamHandler())

如果要输出到 stdout 而不是 stderr ,只需将其指定给 StreamHandler 构造函数即可。

 import sys
# ...
logging.getLogger().addHandler(logging.StreamHandler(sys.stdout))

您还可以在其中添加 Formatter 以便所有日志行都有一个共同的标题。

IE:

 import logging
logFormatter = logging.Formatter("%(asctime)s [%(threadName)-12.12s] [%(levelname)-5.5s]  %(message)s")
rootLogger = logging.getLogger()

fileHandler = logging.FileHandler("{0}/{1}.log".format(logPath, fileName))
fileHandler.setFormatter(logFormatter)
rootLogger.addHandler(fileHandler)

consoleHandler = logging.StreamHandler()
consoleHandler.setFormatter(logFormatter)
rootLogger.addHandler(consoleHandler)

打印为以下格式:

 2012-12-05 16:58:26,618 [MainThread  ] [INFO ]  my message

原文由 Waterboy 发布,翻译遵循 CC BY-SA 4.0 许可协议

logging.basicConfig() 可以采用关键字参数 handlers 自 Python 3.3 以来,这大大简化了日志设置,尤其是在使用相同的格式化程序设置多个处理程序时:

handlers – 如果指定,这应该是一个可迭代的已创建的处理程序以添加到根记录器。任何尚未设置格式化程序的处理程序都将被分配在此函数中创建的默认格式化程序。

因此,整个设置可以通过这样的单个调用来完成:

 import logging

logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s [%(levelname)s] %(message)s",
    handlers=[
        logging.FileHandler("debug.log"),
        logging.StreamHandler()
    ]
)

(或者使用 import sys + StreamHandler(sys.stdout) 根据原始问题的要求 - StreamHandler 的默认设置是写入 stderr。如果要自定义日志格式并添加诸如文件名之类的内容,请查看 LogRecord 属性/行,线程信息等)

上面的设置只需要在脚本开头附近完成一次。您可以稍后像这样使用代码库中所有其他地方的日志记录:

 logging.info('Useful message')
logging.error('Something bad happened')
...

注意:如果它不起作用,其他人可能已经以不同方式初始化了日志系统。评论建议在调用 logging.root.handlers = [] basicConfig()

原文由 Yirkha 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题