不配置的时候,默认日志级别是warning的,使用的root logger,并通过StreamHandler输出的,默认日志格式是:%(levelname)s:%(name)s:%(message)s
Demo:
#!/usr/bin/env python3
# coding=utf-8
import logging
logging.debug("test debug log")
logging.info("test info log")
logging.warning("test warning log")
logging.error("test error log")
logging.critical("test critical log")
运行结果:
可以使用logging.basicConfig函数自定义日志,而且只在第一次调用的时候有效(或者设置force为true可有效),需要在其他线程启动前从主线程调用该函数(在2.7.1和3.2之前的Python版本中,如果从多个线程调用此函数可能会出现问题);
basicConfig支持的参数:
filename:指定输出日志的文件名(使用FileHandler代替StreamHandler输出,不会输出控制台)
filemode:指定打开日志文件的模式,默认‘a’,配合filename使用
format:指定日志格式
datefmt:格式化%(asctime)s的日期时间,相当于time.strftime()函数的功能
style:指定格式化字符串风格“%”、“{”或“$”之一,默认“%”
level:指定日志级别
stream:使用指定的StreamHandler,跟filename不共存
handlers:向root logger添加多个可迭代的handler,跟filename、stream不共存
force:设置为true时,在设置其他配置属性前,会删除并关闭root logger上现有的handler
注:style是3.2加的,handlers是3.3加的,force是3.8加的
format格式化可以使用的参数:
%(asctime)s:人类可读的时间,默认格式:2003-07-08 16:49:45,896
%(created)f:当前UNIX时间,time.time()的返回值(浮点数)
%(filename)s:pathname中的文件名部分,带后缀
%(funcName)s:包含日志调用的函数的名称
%(levelname)s:日志等级的名称(DEBUG,INFO,WARNING,ERROR,CRITICAL)
%(levelno)s:日志等级的数字表示(10,20,30,40,50)
%(lineno)d:打印日志的源代码行号(如果可用)
%(message)s:日志消息
%(module)s:模块名,filename的名称部分,无后缀
%(msecs)d:日志时间的毫秒部分(使用%(asctime)s的时候指定datefmt参数会丢失毫秒值)
%(name)s:日志器名称,默认root
%(pathname)s:打印日志的源文件的完整路径(如果可用)
%(process)d:进程id(如果可用)
%(processName)s:进程名字(如果可用)
%(relativeCreated)d:从加载日志模块开始到打印日志的时间(毫秒值)
%(thread)d:线程id(如果可用)
%(threadName)s:线程名字(如果可用)
注:%(processName)s是3.1加的
关于time.strftime()的时间格式化:
%a:星期的简称
%A:星期的全称
%b:月份的简称
%B:月份的全称
%c:适合本地的日期时间表示格式
%d:日份,区间[01,31]
%H:小时(24小时制),区间[00,23]
%I:小时(12小时制),区间[01,12]
%j:一年中的第几天,区间[001,366]
%m:月份,区间[01,12]
%M:分钟,区间[00,59]
%p:本地上下午AM和PM
%S:秒,区间[00,61]
%U:一年中的周数,区间[00,53](周日为一周第一天,新年中第一个周日之前的都为第0周)
%w:数字表示星期,区间[0,6](周日为0)
%W:一年中的周数,区间[00,53](周一为一周第一天,新年中第一个周一之前的都为第0周)
%x:适合本地的日期表示格式
%X:适合本地的时间表示格式
%y:不带世纪的年份,区间[00,99]
%Y:带世纪的年份
%z:时区偏移,表示与UTC/GMT的正负时差,形式为+HHMM或-HHMM,区间[-23:59, +23:59]
%Z:时区名称(如果不存在时区则不包含字符)
%%:转义的”%“字符
另外,basicConfig函数的format参数,可以在)和数据类型之间增加格式化参数,例如:
%(levelname)10s可以使日志等级占10个宽度并右对齐;
%(levelname)-10s使日志等级占10个宽度并左对齐;
%(levelname)-10.3s使日志等级占10个宽度并左对齐并保留3个字符展示;
%(lineno)5d使行号占5个宽度并右对齐;
%(lineno)05d使行号占5个宽度并右对齐并前面补0;
%(lineno)-5d使行号占5个宽度并左对齐;
%(lineno)+5d使行号占5个宽度并右对齐并添加正负符号;
%(lineno)+05d使行号占5个宽度并右对齐并前面补0并在最前面展示正负符号;
%(lineno)+-5d使行号占5个宽度并左对齐并添加正负符号;
Demo:
#!/usr/bin/env python3
# coding=utf-8
import logging
logging.basicConfig(level=logging.DEBUG,
format="[TEST][%(levelname)-8s] [%(asctime)s,%(msecs)d] [%(threadName)s] "
"[%(pathname)s:%(lineno)d] %(message)s",
datefmt="%Y/%m/%d %H:%M:%S")
logging.debug("test debug log")
logging.info("test info log")
logging.warning("test warning log")
logging.error("test error log")
logging.critical("test critical log")
运行结果:
写日志文件的Demo:
#!/usr/bin/env python3
# coding=utf-8
import logging
logging.basicConfig(level=logging.DEBUG,
format="[TEST][%(levelname)-8s] [%(asctime)s,%(msecs)d] [%(threadName)s] "
"[%(pathname)s:%(lineno)d] %(message)s",
datefmt="%Y/%m/%d %H:%M:%S",
filename="test_logging.log",
filemode="a")
logging.debug("test debug log")
logging.info("test info log")
logging.warning("test warning log")
logging.error("test error log")
logging.critical("test critical log")
生成的文件test_logging.log:
因为我指定的filemode=“a”,并执行了两次,而且控制台是不打印日志的:
参考:
logging — Logging facility for Python — Python 3.8.12 documentation