赞
踩
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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。