Python的Logging日志模块

不配置的时候,默认日志级别是warning的,使用的rootlogger,并通过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")

运行结果:

50AA3D41-ED6A-968C-9DF0-39E6DEAECC07.png

可以使用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:向rootlogger添加多个可迭代的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")

运行结果:

C169C15A-716C-ADAC-8B7F-952FCFD021EA.png

写日志文件的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:

393717C7-082D-3429-126E-E04ABCDFFDA8.png

因为我指定的filemode=“a”,并执行了两次,而且控制台是不打印日志的:

BC4E7075-BF85-09B9-6F7C-B1702D970F2F.png

收藏 (0)
评论列表
正在载入评论列表...
我是有底线的
为您推荐
    暂时没有数据