代码之家  ›  专栏  ›  技术社区  ›  BAE

python日志模块默认在哪里写日志?

  •  4
  • BAE  · 技术社区  · 6 年前

    我有一个python脚本 詹金斯 logging 使用模块。

    logging.basicConfig(filename="/tmp/test.log",
                        format="%(asctime)s %(levelname)s %(message)s",
                        filemode="a",
                        level=logging.INFO)
    

    如果删除了上述配置,则找不到由以下语句生成的日志:

    logging.info("xxxxxxx")
    

    我在詹金斯机器的系统日志中没有找到。我在詹金斯控制台的输出中没有找到它。

    有什么暗示吗?谢谢

    2 回复  |  直到 6 年前
        1
  •  5
  •   munk    6 年前

    默认情况下,记录对stderr的写入。您没有看到该语句被打印的原因是默认的日志级别是warning。

    >>> import logging
    >>> logging.error('a message!')
    ERROR:root:a message!
    >>> logging.warning('a message!')
    WARNING:root:a message!
    >>> logging.info('a message!')
    >>>
    
        2
  •  3
  •   NickD    6 年前

    日志模块的帮助说明:

    默认行为是创建一个streamhandler,它向 sys.stderr,使用basic_format format字符串设置格式化程序,然后 将处理程序添加到根日志记录器。

    正如(现在已删除)注释中指出的,此描述用于 basicConfig() 这确实不是立即调用的。真正发生的是根日志以功能等效的方式初始化,这就是默认日志。它实际上是在两个阶段初始化的:在模块加载时,根记录器的初始化如下:

    root = RootLogger(WARNING)
    Logger.root = root
    Logger.manager = Manager(Logger.root)
    

    但没有附加处理程序:

    >>> logging.root.__dict__
    {'name': 'root', 'parent': None, 'handlers': [], 'level': 30, 'disabled': 0, 'propagate': 1, 'filters': []}
    

    当A logging.warning() (或) error() info() 或者……)被称为, 基本配置() 将streamhandler添加到sys.stderr的调用:

    def warning(msg, *args, **kwargs):
    """
    Log a message with severity 'WARNING' on the root logger.
    """
    if len(root.handlers) == 0:
        basicConfig()
    root.warning(msg, *args, **kwargs)
    

    这是蟒蛇2.7。我想蟒蛇3的工作原理是一样的,但我没有检查。