记录到文件并打印到stdou的记录器配置

2021-01-26 06:39:49 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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")

谢谢你的帮助!

3条回答
网友
1楼 ·

^{}可以采用自Python 3.3以来的关键字参数handlers,这大大简化了日志设置,特别是在使用相同的格式化程序设置多个处理程序时:

handlers – If specified, this should be an iterable of already created handlers to add to the root logger. Any handlers which don’t already have a formatter set will be assigned the default formatter created in this function.

因此,接受的答案中相当长且冗长的示例代码就变成了这样:

import logging

logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s [%(threadName)-12.12s] [%(levelname)-5.5s]  %(message)s",
    handlers=[
        logging.FileHandler("{0}/{1}.log".format(logPath, fileName)),
        logging.StreamHandler()
    ])

(或者根据原始问题的要求使用import sys+StreamHandler(sys.stdout)。)

要获取记录器,请使用

logger = logging.getLogger()

稍后在脚本中,使用logger.info()输出有用的日志消息。

网友
2楼 ·

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

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

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

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

您还可以向它添加一个Formatter,这样所有日志行都有一个公共头。

即:

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
网友
3楼 ·

添加不带参数的StreamHandler将转到stderr而不是stdout。如果其他进程对stdout转储有依赖关系(即在编写NRPE插件时),请确保显式指定stdout,否则可能会遇到一些意外的问题。

下面是一个从问题中重用假定值和日志文件的快速示例:

import logging
from logging.handlers import RotatingFileHandler
from logging import handlers
import sys

log = logging.getLogger('')
log.setLevel(logging.DEBUG)
format = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")

ch = logging.StreamHandler(sys.stdout)
ch.setFormatter(format)
log.addHandler(ch)

fh = handlers.RotatingFileHandler(LOGFILE, maxBytes=(1048576*5), backupCount=7)
fh.setFormatter(format)
log.addHandler(fh)

相关问题