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

时间:2018-06-07 21:58:32

标签: python jenkins logging

我有一个由 jenkins 运行的python脚本。使用logging模块。

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

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

logging.info("xxxxxxx")

我没有在jenkins机器的syslog中找到它。我没有在jenkins控制台输出中找到它。

任何提示?感谢

2 个答案:

答案 0 :(得分:5)

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

>>> import logging
>>> logging.error('a message!')
ERROR:root:a message!
>>> logging.warning('a message!')
WARNING:root:a message!
>>> logging.info('a message!')
>>>

答案 1 :(得分:3)

日志记录模块的帮助说:

  

默认行为是创建一个写入的StreamHandler           sys.stderr,使用BASIC_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': []}

调用logging.warning()(或error()info()或...)时,会调用basicConfig(),将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)

这是python2.7。我假设python3的工作方式相同,但我没有检查过。