一日志的级别
一般日志默认有五种级别分别对应紧急程度:
debug:一般为调试日志 级别号:10
info :一般为正常信息 级别号:20
warning:一般为警告信息 级别号:30
error :一般为错误信息 级别号:40
critical :一般为严重的错误信息 级别号:50
二日志格式的简单配置 logging.basicConfig
日志不可能只打印信息,还有有相应的比如说时间啊,访问的地方等等
所以配置日志的格式还是很必要的,其级别不设置,默认打印级别是warning
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
logging.basicConfig( # filename='access.log', #这里写了就会输出到文件,没写就会输出到屏幕 format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s', datefmt='%Y-%m-%d %H:%M:%S %p', level=10) #level表示级别也即是debug级别及以上 logging.debug('测试着玩') logging.info('运行还算正常') logging.warning('可能要有bug了') logging.error('不好了,出bug了') logging.critical('完蛋了') ''' 结果: 2018-07-08 10:23:33 AM - root - DEBUG -练习: 测试着玩 2018-07-08 10:23:33 AM - root - INFO -练习: 运行还算正常 2018-07-08 10:23:33 AM - root - WARNING -练习: 可能要有bug了 2018-07-08 10:23:33 AM - root - ERROR -练习: 不好了,出bug了 2018-07-08 10:23:33 AM - root - CRITICAL -练习: 完蛋了 默认打印级别是warning,上面没有指定名称默认为root '''
上面的level也可以改成 level=logging.DEBUG
但是上面的方法有几个缺点:
1 编码格式不能设置,输出到文件后,中文会变成乱码
2 不能同时输出到文件和屏幕
三 logging的对象方式
logging的对象方式可以设置同时在文件和屏幕输出,并且文件的内容和屏幕的内容可以设置记录和输出不同的级别,还可以设置绑定不同的日志格式。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import logging #1产生日志 logger1=logging.getLogger('访问日志') #相当于实例化了一个对象 #括号内的内容是给一个名称 sh=logging.StreamHandler() #打印到终端 fh1=logging.FileHandler('s1.log',encoding='utf-8') #打印到文件 fh2=logging.FileHandler('s2.log',encoding='utf-8') ##打印到文件 #日志格式,设置不同的日志格式 formatter1=logging.Formatter(fmt='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s',datefmt='%Y-%m-%d %H:%M:%S %p',) formatter2=logging.Formatter( fmt='%(asctime)s : %(message)s', datefmt='%Y-%m-%d %H:%M:%S %p', ) formatter3=logging.Formatter( fmt='%(asctime)s : %(module)s : %(message)s', datefmt='%Y-%m-%d %H:%M:%S %p', ) #为handler绑定日志格式 sh.setFormatter(formatter1) fh1.setFormatter(formatter2) fh2.setFormatter(formatter3) #为logger绑定handler logger1.addHandler(sh) logger1.addHandler(fh1) logger1.addHandler(fh2) #设置日志级别:logger对象的日志级别应该 <= handler的日志级别 #因为如果大于的话,handler设置的级别就没有意义,别logger过滤掉了 logger1.setLevel(10) #这个级别要小于下面的handler日志级别 sh.setLevel(10) fh1.setLevel(10) fh2.setLevel(10) #测试 logger1.debug('测试着玩') logger1.info('运行还算正常') logger1.warning('可能要有bug了') logger1.error('不好了,出bug了') logger1.critical('完蛋了')
其流程图如下:
配置参数如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
logging.basicConfig()函数中可通过具体参数来更改logging模块默认行为,可用参数有: filename:用指定的文件名创建FiledHandler,这样日志会被存储在指定的文件中。 filemode:文件打开方式,在指定了filename时使用这个参数,默认值为“a”还可指定为“w”。 format:指定handler使用的日志显示格式。 datefmt:指定日期时间格式。 level:设置rootlogger(后边会讲解具体概念)的日志级别 stream:用指定的stream创建StreamHandler。可以指定输出到sys.stderr,sys.stdout或者文件(f=open(‘test.log’,’w’)),默认为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用户输出的消息