首页 文章

Logger 配置以记录到文件并打印到stdout

提问于
浏览
229

我正在使用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 函数

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

谢谢你的帮助!

6 回答

  • 18

    对于2.7,请尝试以下操作:

    fh = logging.handlers.RotatingFileHandler(LOGFILE, maxBytes=(1048576*5), backupCount=7)
    
  • 312

    只需获取根 Logger 的句柄并添加StreamHandler . StreamHandler写入stderr . 不确定你是否真的需要stdout而不是stderr,但这是我在设置Python Logger 时使用的,我也添加了FileHandler . 然后我的所有日志都会转到这两个地方(这听起来像你想要的) .

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

    您还可以向其添加Formatter,以便所有日志行都有一个公共 Headers .

    即:

    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
    
  • -2

    logging.basicConfig()可以从Python 3.3开始使用关键字参数 handlers ,这简化了日志记录设置,特别是在使用相同的格式化程序设置多个处理程序时:

    处理程序 - 如果指定,这应该是已经创建的处理程序的可迭代,以添加到根记录程序 . 任何没有格式化程序集的处理程序都将被分配在此函数中创建的默认格式化程序 .

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

    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 ,请使用

    logger = logging.getLogger()
    

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

  • 1

    添加不带参数的StreamHandler会转到stderr而不是stdout . 如果某个其他进程依赖于stdout转储(即编写NRPE插件时),那么请确保明确指定stdout,否则可能会遇到一些意外问题 .

    这是一个重用假设值和问题LOGFILE的快速示例:

    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)
    
  • 54

    在设置任何其他处理程序或记录任何消息之前,使用 basicConfig 作为参数运行 basicConfig ,或手动添加 StreamHandler 将消息发送到stdout到根 Logger (或任何其他所需的 Logger ) .

  • 91

    在多个Python包中反复使用Waterboy的代码之后,我最终将它转换为一个小的独立Python包,你可以在这里找到它:

    https://github.com/acschaefer/duallog

    代码记录良好且易于使用 . 只需下载 .py 文件并将其包含在项目中,或通过 pip install duallog 安装整个软件包 .

相关问题