008、日志模块(一) logging的使用
一、日志模块 logging的使用
logging 模块
1)日志搜集器:
定义日志搜集器:要从代码当中按照要求,搜集对应的日志 ,并输出到渠道当中 。
logging模块有一个默认的日志搜集器 root,root默认收集的日志级别:warning及warning以上 ;
2)日志级别: debug——>info——>warning——>error——>critical (FATA) 调试 基本 警告 错误 严重错误 3)日志显示的格式: 时间、日志级别、代码文件、第几行:信息 等,还可以添加其他信息 ;
4)日志输出渠道 (Handle): 文件(FileHandle) 、控制台 (StreamHandle)
1、root 日志收集器 ( logging模块中默认的日志搜集器 )
a、默认搜集的日志级别:warning 及 warning 以上 ;
b、默认格式:日志级别:日志搜集器名:输出内容 ( 比如:WARNING:root:logging日志搜集===warning )
c、输出渠道:默认是控制台 ;
示例代码如下:
# logging模块中默认的日志收集器:root ; # root默认收集的日志级别:warning及warning以上 ; import logging class Cat(): def __init__(self, name): self.name = name def func(self): print('{} 的 print函数'.format(self.name)) logging.debug('logging日志搜集===debug') logging.info('logging日志搜集===info') logging.warning('logging日志搜集===warning') logging.error('logging日志搜集===error') logging.critical('logging日志搜集===critical') c = Cat('加菲') c.func()
执行结果如下:
D:\SkyWorkSpace\WorkSpace\Pytest\Temp\day10\venv\Scripts\python.exe D:/SkyWorkSpace/WorkSpace/Pytest/Temp/day10/test_01/test_07.py 加菲 的 print函数 WARNING:root:logging日志搜集===warning ERROR:root:logging日志搜集===error CRITICAL:root:logging日志搜集===critical Process finished with exit code 0
2、自定义日志搜集器
第一步:创建一个日志搜集器:
logger = logging.getLogger()
第二步:自定义日志级别、输出格式、输出渠道 :
a、定义日志级别 ; logger.setLevel(logging.INFO)
b、定义日志输出格式, 使用Formatter类实例化一个日志格式类 ;
c、实例化渠道(Handler) ;输出到 控制台 或 文件
第三步:将渠道与日志搜集器绑定 ;
a、把日志输出到 控制台 (StreamHandler),实例代码如下 :
import logging """ 第一步:创建一个日志搜集器: logger = logging.getLogger() 第二步:自定义日志级别、输出格式、输出渠道; a、定义日志级别; b、定义日志输出格式, 使用Formatter类实例化一个日志格式类; c、实例化渠道(Handler); 第三步:将渠道与日志搜集器绑定 """ # 第一步:创建一个日志搜集器: logger = logging.getLogger('自定义的日志搜集器') # 第二步:自定义日志级别、输出格式、输出渠道 # a、定义日志级别 logger.setLevel(logging.INFO) # b、定义日志输出格式, 使用Formatter类实例化一个日志格式类; fmt = '%(asctime)s, %(levelname)s %(pathname)s,line=%(lineno)d, %(message)s, %(name)s' formatter = logging.Formatter(fmt) # c、实例化渠道(Handler) # 控制台(StreamHandler) handle1 = logging.StreamHandler() # 设置渠道当中的日志格式 handle1.setFormatter(formatter) # 第三步:将渠道与日志搜集器绑定 logger.addHandler(handle1) class Cat(): def __init__(self, name): self.name = name def func(self): print('我的名字是: {0}'.format(self.name)) logger.info('自定义日志搜集器success') c = Cat('加菲') c.func()
执行结果如下:
D:\SkyWorkSpace\WorkSpace\Pytest\Temp\day10\venv\Scripts\python.exe D:/SkyWorkSpace/WorkSpace/Pytest/Temp/day10/test_01/test_08.py 我的名字是: 加菲 2021-08-02 13:34:45,409, INFO D:/SkyWorkSpace/WorkSpace/Pytest/Temp/day10/test_01/test_08.py,line=47, 自定义日志搜集器success, 自定义的日志搜集器 Process finished with exit code 0
b、把日志输出到 文件 (FileHandler) ,实例代码如下 :
与把日志输出到 控制台 的区别:输出渠道不一样 ,文件用 FileHandler ;其他都一样 。
import logging """ 第一步:创建一个日志搜集器: logger = logging.getLogger() 第二步:自定义日志级别、输出格式、输出渠道; a、定义日志级别; b、定义日志输出格式, 使用Formatter类实例化一个日志格式类; c、实例化渠道(Handler); 第三步:将渠道与日志搜集器绑定 """ # 第一步:创建一个日志搜集器: logger = logging.getLogger('自定义的日志搜集器') # 第二步:自定义日志级别、输出格式、输出渠道 # a、定义日志级别 logger.setLevel(logging.INFO) # b、定义日志输出格式, 使用Formatter类实例化一个日志格式类; fmt = '%(asctime)s, %(levelname)s %(pathname)s,line=%(lineno)d, %(message)s, %(name)s' formatter = logging.Formatter(fmt) # c、实例化渠道(Handler) # # 控制台(StreamHandler) # handle1 = logging.StreamHandler() # # 设置渠道当中的日志格式 # handle1.setFormatter(formatter) # 输出到文件() filehandle = logging.FileHandler('testlog.txt', mode='a') filehandle.setFormatter(formatter) # 第三步:将渠道与日志搜集器绑定 logger.addHandler(filehandle) class Cat(): def __init__(self, name): self.name = name def func(self): print('我的名字是: {0}'.format(self.name)) logger.info('日志搜集器调试success') c = Cat('加菲') c.func()
执行结果,在同级目录下生成 有日志信息的 testlog.txt 文件 。 如果把带有中文的日志信息输出到 .log后缀名的文件 , 在pycharm中双击打不开 ;
c、在 控制台 + 文件 同时输出日志 ;
# 第三步:将渠道与日志搜集器绑定 # 可以绑定多个输出渠道 logger.addHandler(filehandle) logger.addHandler(streamHandler)
完整代码如下:
import logging """ 第一步:创建一个日志搜集器: logger = logging.getLogger() 第二步:自定义日志级别、输出格式、输出渠道; a、定义日志级别; b、定义日志输出格式, 使用Formatter类实例化一个日志格式类; c、实例化渠道(Handler); 第三步:将渠道与日志搜集器绑定 """ # 第一步:创建一个日志搜集器: logger = logging.getLogger('自定义的日志搜集器') # 第二步:自定义日志级别、输出格式、输出渠道 # a、定义日志级别 logger.setLevel(logging.INFO) # b、定义日志输出格式, 使用Formatter类实例化一个日志格式类; fmt = '%(asctime)s, %(levelname)s %(pathname)s,line=%(lineno)d, %(message)s, %(name)s' formatter = logging.Formatter(fmt) # c、实例化渠道(Handler) # 控制台(StreamHandler) streamHandler = logging.StreamHandler() # 设置渠道当中的日志格式 streamHandler.setFormatter(formatter) # 输出到文件() filehandle = logging.FileHandler('testlog.txt', mode='a') filehandle.setFormatter(formatter) # 第三步:将渠道与日志搜集器绑定 # 可以绑定多个输出渠道 logger.addHandler(filehandle) logger.addHandler(streamHandler) class Cat(): def __init__(self, name): self.name = name def func(self): print('我的名字是: {0}'.format(self.name)) logger.info('日志搜集器调试success') c = Cat('加菲') c.func()
执行结果,在控制台 和 testlog.txt 都有日志文件输出 ;
d、把 error 日志单独输出在 errorlog.txt 文件 :
实例代码如下:
import logging """ 第一步:创建一个日志搜集器: logger = logging.getLogger() 第二步:自定义日志级别、输出格式、输出渠道; a、定义日志级别; b、定义日志输出格式, 使用Formatter类实例化一个日志格式类; c、实例化渠道(Handler); 第三步:将渠道与日志搜集器绑定 """ # 第一步:创建一个日志搜集器: logger = logging.getLogger('自定义的日志搜集器') # 第二步:自定义日志级别、输出格式、输出渠道 # a、定义日志级别 logger.setLevel(logging.DEBUG) # b、定义日志输出格式, 使用Formatter类实例化一个日志格式类; fmt = '%(asctime)s, %(levelname)s %(pathname)s,line=%(lineno)d, %(message)s, %(name)s' formatter = logging.Formatter(fmt) # c、实例化渠道(Handler) # 控制台(StreamHandler) streamHandler = logging.StreamHandler() # 设置渠道当中的日志格式 streamHandler.setFormatter(formatter) # 输出到文件() # 把 debug 日志输出到 debug.txt 文件 filehandle_debug = logging.FileHandler('debuglog.txt', mode='a') filehandle_debug.setLevel(logging.DEBUG) filehandle_debug.setFormatter(formatter) # 把 error 日志输出到 errorlog.txt 文件 filehandle_error = logging.FileHandler('errorlog.txt', mode='a') filehandle_error.setLevel(logging.ERROR) filehandle_error.setFormatter(formatter) # 第三步:将渠道与日志搜集器绑定 # 可以绑定多个输出渠道 logger.addHandler(filehandle_debug) logger.addHandler(filehandle_error) logger.addHandler(streamHandler) class Cat(): def __init__(self, name): self.name = name def func(self): print('我的名字是: {0}'.format(self.name)) logger.debug('debug日志') logger.error('error日志') c = Cat('加菲') c.func()
执行结果如下,同时生成 errorlog.txt 和 debuglog.txt 2个文件,分别包含对应日志级别的信息 ;
D:\SkyWorkSpace\WorkSpace\Pytest\Temp\day10\venv\Scripts\python.exe D:/SkyWorkSpace/WorkSpace/Pytest/Temp/day10/test_01/test_08.py 我的名字是: 加菲 2021-08-02 14:14:34,522, DEBUG D:/SkyWorkSpace/WorkSpace/Pytest/Temp/day10/test_01/test_08.py,line=61, debug日志, 自定义的日志搜集器 2021-08-02 14:14:34,523, ERROR D:/SkyWorkSpace/WorkSpace/Pytest/Temp/day10/test_01/test_08.py,line=62, error日志, 自定义的日志搜集器 Process finished with exit code 0
e、日志 滚动生成 ;
a、需要引入下面的 类 和 修改输出渠道, 如下:
b、RotatingFileHandler 是用来生成滚动日志的,适用于需要控制日志文件大小的场景。
c、maxBytes:控制单个日志文件的大小,单位是字节,也就是当单个文件大小超过这个数值时,就创建一个新的文件。
backupCount:用于控制日志文件的数量,如果创建的日志文件数量多于这个数值,就删除最老的。
# 日志 滚动生成需要引入下面的 类 from logging import handlers # handlers.RotatingFileHandler # handlers.TimedRotatingFileHandler
# 输出到文件()
# 把 debug 日志 滚动输出到 debug.txt 文件
filehandle_debug = handlers.RotatingFileHandler('debuglog.txt', mode='a', maxBytes=1, backupCount=2)
日志 滚动生成的代码如下 (根据文件大小):
import logging # 日志 滚动生成需要引入下面的 类 from logging import handlers # handlers.RotatingFileHandler # handlers.TimedRotatingFileHandler # 第一步:创建一个日志搜集器: logger = logging.getLogger('自定义的日志搜集器') # 第二步:自定义日志级别、输出格式、输出渠道 # a、定义日志级别 logger.setLevel(logging.DEBUG) # b、定义日志输出格式, 使用Formatter类实例化一个日志格式类; fmt = '%(asctime)s, %(levelname)s %(pathname)s,line=%(lineno)d, %(message)s, %(name)s' formatter = logging.Formatter(fmt) # c、实例化渠道(Handler) # 控制台(StreamHandler) streamHandler = logging.StreamHandler() # 设置渠道当中的日志格式 streamHandler.setFormatter(formatter) # 输出到文件() # 把 debug 日志 滚动输出到 debug.txt 文件 filehandle_debug = handlers.RotatingFileHandler('debuglog.txt', mode='a', maxBytes=1, backupCount=2) filehandle_debug.setLevel(logging.DEBUG) filehandle_debug.setFormatter(formatter) # 第三步:将渠道与日志搜集器绑定 # 可以绑定多个输出渠道 logger.addHandler(filehandle_debug) logger.addHandler(streamHandler) class Cat(): def __init__(self, name): self.name = name def func(self): print('我的名字是: {0}'.format(self.name)) logger.debug('debug日志111') logger.debug('debug日志222') logger.debug('debug日志333') logger.debug('debug日志11111') logger.debug('debug日志22222') logger.debug('debug日志33333') logger.error('error日志') c = Cat('加菲') c.func()
执行结果如下: