我有一个由 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控制台输出中找到它。
任何提示?感谢
答案 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的工作方式相同,但我没有检查过。