logging模块是python自带的库,不需要重新安装,导入方式为
import logging该模块下面有四大常用类,分别是logger、handler、filter、formatter。四大类主要用法含义如下:
logger:产生日志的对象,负责产生日志 ; Filter:过滤日志的对象; Handler:负责发送相关的日志到指定目的地,比如将日志存在文件中、打印在终端显示(FileHandler用来将日志存在文件中,StreamHandler用来打印到终端); Formatter:可以定制不同的日志格式对象,然后绑定给不同的Handler对象使用,以此来控制不同的Handler的日志格式。
[logging模块定义的模块级别常用函数]
logging.basicConfig()为指定logging指定全局配置,比如配置日志等级、将日志存在文件中、设置日志输出格式等。
logging.basicConfig()函数中通过具体参数来更改logging模块默认行为, 可用参数有 filename:用指定的文件名创建FiledHandler(后边会具体讲解handler的概念),这样日志会被存储在指定的文件中。 filemode:文件打开方式,在指定了filename时使用这个参数,默认值为“a”还可指定为“w”。 format:指定handler使用的日志显示格式。 datefmt:指定日期时间格式。 level:设置rootlogger(后边会讲解具体概念)的日志级别 stream:用指定的stream创建StreamHandler。可以指定输出到sys.stderr,sys.stdout或者文件,默认为sys.stderr。若同时列出了filename和stream两个参数,则stream参数会被忽略。
其中format格式有 %(name)s:Logger的名字,并非用户名,详细查看 %(levelno)s:数字形式的日志级别 %(levelname)s:文本形式的日志级别 %(pathname)s:调用日志输出函数的模块的完整路径名,可能没有 %(filename)s:调用日志输出函数的模块的文件名 %(module)s:调用日志输出函数的模块名 %(funcName)s:调用日志输出函数的函数名 %(lineno)d:调用日志输出函数的语句所在的代码行 %(created)f:当前时间,用UNIX标准的表示时间的浮 点数表示 %(relativeCreated)d:输出日志信息时的,自Logger创建以 来的毫秒数 %(asctime)s:字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒 %(thread)d:线程ID。可能没有 %(threadName)s:线程名。可能没有 %(process)d:进程ID。可能没有 %(message)s:用户输出的消息
例1
import logging import time logging.basicConfig(level=logging.DEBUG,filename='0703.txt',filemode='w',format='%(asctime)s - %(filename)s - %(levelname)s - %(message)s') #设置日志等级为debug及以上均输出,写入0703txt文件中。 logging.debug('This is a debug') logging.info('This is a info') time.sleep(2) logging.warning('This is a warning') logging.error('This is a error') logging.critical('This is a critical')#运行结果
0703.txt文件内容 2020-07-03 23:25:48,158 - test1.py - DEBUG - This is a debug 2020-07-03 23:25:48,158 - test1.py - INFO - This is a info 2020-07-03 23:25:50,158 - test1.py - WARNING - This is a warning 2020-07-03 23:25:50,158 - test1.py - ERROR - This is a error 2020-07-03 23:25:50,158 - test1.py - CRITICAL - This is a critical总共分为8个等级,默认为warnning,其中WARN = WARNING 、FATAL = CRITICAL 等级为一致,故一般为6个日志等级,等个等级都有一个值,输出日志的原则是若设定输出日志等级为debug,则大于等于debug的值的日志均输出(请见上面的案例)。
NOTSET = 0 #不设置 DEBUG = 10 INFO = 20 WARNING = 30 #WARN = WARNING ERROR = 40 CRITICAL = 50 #FATAL = CRITICAL
正常日志的输出流程为:logger对象:负责产生日志,然后交给Filter过滤,然后交给不同的Handler输出。 logger用法 每个程序在输出信息之前都要获得一个Logger(记录器的意思)。Logger通常对应了程序的模块名。主要使用logging.getLogger(_ file _)来创建logger。 例2:
import logging #创建logger logger = logging.getLogger('test2') print(logger) #输出结果 <Logger test2 (WARNING)>Filter对象不常用,暂时未找到相关用法。 handler用法 Handler对象:接收logger传来的日志,然后控制输出。 每个Logger可以附加多个Handler。接下来我们就来介绍一些常用的Handler:
(1) logging.StreamHandler 使用这个Handler可以向类似与sys.stdout或者sys.stderr的任何文件对象(file object)输出信息;也即打印到终端的意思。它的构造函数是: StreamHandler([strm]) 其中strm参数是一个文件对象。默认是sys.stderr
(2) logging.FileHandler 和StreamHandler类似,用于向一个文件输出日志信息。不过FileHandler会帮你打开这个文件。它的构造函数是: FileHandler(filename[,mode]) filename是文件名,必须指定一个文件名。 mode是文件的打开方式。参见Python内置函数open()的用法。默认是’a’,即添加到文件末尾。
(3) logging.handlers.RotatingFileHandler 这个Handler类似于上面的FileHandler,但是它可以管理文件大小。当文件达到一定大小之后,它会自动将当前日志文件改名,然后创建 一个新的同名日志文件继续输出。比如日志文件是chat.log。当chat.log达到指定的大小之后,RotatingFileHandler自动把 文件改名为chat.log.1。不过,如果chat.log.1已经存在,会先把chat.log.1重命名为chat.log.2。。。最后重新创建 chat.log,继续输出日志信息。它的构造函数是: RotatingFileHandler( filename[, mode[, maxBytes[, backupCount]]]) 其中filename和mode两个参数和FileHandler一样。 maxBytes用于指定日志文件的最大文件大小。如果maxBytes为0,意味着日志文件可以无限大,这时上面描述的重命名过程就不会发生。 backupCount用于指定保留的备份文件的个数。比如,如果指定为2,当上面描述的重命名过程发生时,原有的chat.log.2并不会被更名,而是被删除。
(4) logging.handlers.TimedRotatingFileHandler 这个Handler和RotatingFileHandler类似,不过,它没有通过判断文件大小来决定何时重新创建日志文件,而是间隔一定时间就自动创建新的日志文件。重命名的过程与RotatingFileHandler类似,不过新的文件不是附加数字,而是当前时间。它的构造函数是: TimedRotatingFileHandler( filename [,when [,interval [,backupCount]]]) 其中filename参数和backupCount参数和RotatingFileHandler具有相同的意义。 interval是时间间隔。 when参数是一个字符串。表示时间间隔的单位,不区分大小写。它有以下取值: S 秒 M 分 H 小时 D 天 W 每星期(interval==0时代表星期一) midnight 每天凌晨
例3:
import logging #创建logger对象 logger = logging.getLogger('test3') #print(logger) #Handler对象 h1 = logging.FileHandler('t1.txt',encoding='utf-8') #打印到txt文件 #Formatter对象 f1 = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s -%(module)s.py - %(message)s',datefmt='%Y-%m-%d %H:%M:%S %p') #为Handler对象绑定格式 h1.setFormatter(f1) #将Handler添加给logger并设置日志级别 logger.addHandler(h1) logger.setLevel(10) #测试 logger.debug('This is a debug') logger.info('This is a info') logger.warning('This is a warning') logger.error('This is a error') logger.critical('This is a critical') #运行结果 t1.txt文件内容如下 2020-07-04 23:45:35 PM - test3 - DEBUG -test3.py - This is a debug 2020-07-04 23:45:35 PM - test3 - INFO -test3.py - This is a info 2020-07-04 23:45:35 PM - test3 - WARNING -test3.py - This is a warning 2020-07-04 23:45:35 PM - test3 - ERROR -test3.py - This is a error 2020-07-04 23:45:35 PM - test3 - CRITICAL -test3.py - This is a critical需要注意的是当时logger与handler同时设置等级时,要看设置具体等级而定,例如当logger设置等级为DEBUG时,handler设置等级为INFO时,这时输出的日志为INFO及以上日志信息,因为Logger是第一个根据级别过滤消息的工具,然后再是handler过滤;当logger设置等级为INFO时,handler设置等级为DEBUG时,同样输出的日志为INFO及以上日志信息。
例4
import logging logger = logging.getLogger(__name__) #创建logger #print(logger) logger.setLevel(20) #这里设置logger等级,同时也设置handler等级 #Handler对象 h1 = logging.FileHandler('t1.log',encoding='utf-8',mode='a') #打印到log文件 f1 = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(module)s.py - %(message)s',datefmt='%Y-%m-%d %H:%M:%S %p') h1.setFormatter(f1) logger.addHandler(h1) h1.setLevel(10) #设置handler等级 #测试 logger.debug('This is a debug') logger.info('This is a info') logger.warning('This is a warning') logger.error('This is a error') 输出结果为t1.log 2020-07-16 22:02:20 PM - __main__ - INFO - test4.py - This is a info 2020-07-16 22:02:20 PM - __main__ - WARNING - test4.py - This is a warning 2020-07-16 22:02:20 PM - __main__ - ERROR - test4.py - This is a error比如读取excel中数据时输出日志信息。 Excel数据如下 代码 代码如下: mylogs.py文件代码
import logging #创建logger对象 logger = logging.getLogger(__name__) print(logger) #Handler对象 h1 = logging.StreamHandler() f1 = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s -%(module)s.py - %(message)s',datefmt='%Y-%m-%d %H:%M:%S %p') h1.setFormatter(f1) logger.addHandler(h1) logger.setLevel(10)demo.py文件代码
import openpyxl import glob import mylogs file_list = glob.glob('*.xlsx') #print(file_list[0]) wb = openpyxl.load_workbook(file_list[0]) ws = wb['Sheet1'] for each in ws.iter_rows(min_row=2,min_col=1,max_col=2): mylogs.logger.info(each[0].value)输出结果为
<Logger mylogs (WARNING)> 2020-07-16 22:12:24 PM - mylogs - INFO -demo.py - 苹果 2020-07-16 22:12:24 PM - mylogs - INFO -demo.py - 香蕉 2020-07-16 22:12:24 PM - mylogs - INFO -demo.py - helloworld 2020-07-16 22:12:24 PM - mylogs - INFO -demo.py - orange 2020-07-16 22:12:24 PM - mylogs - INFO -demo.py - 火龙果 2020-07-16 22:12:24 PM - mylogs - INFO -demo.py - 凤梨 2020-07-16 22:12:24 PM - mylogs - INFO -demo.py - 桃子参考文档: https://blog.csdn.net/u011463646/article/details/78013993 https://www.cnblogs.com/linhaifeng/articles/6384466.html#_label12