日志模块---logging

一日志的级别

一般日志默认有五种级别分别对应紧急程度:

debug:一般为调试日志  级别号:10

info     :一般为正常信息  级别号:20

warning:一般为警告信息 级别号:30

error    :一般为错误信息 级别号:40

critical  :一般为严重的错误信息 级别号:50

二日志格式的简单配置 logging.basicConfig

日志不可能只打印信息,还有有相应的比如说时间啊,访问的地方等等

所以配置日志的格式还是很必要的,其级别不设置,默认打印级别是warning

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
'''
View Code

上面的level也可以改成 level=logging.DEBUG

但是上面的方法有几个缺点:

1 编码格式不能设置,输出到文件后,中文会变成乱码

2 不能同上输出到文件和屏幕

三 logging的对象方式

logging的对象方式可以设置同时在文件和屏幕输出,并且文件的内容和屏幕的内容可以设置记录和输出不同的级别,还可以设置绑定不同的日志格式。

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('完蛋了')
View Code

其流程图如下:

配置参数如下:

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用户输出的消息
View Code

猜你喜欢

转载自www.cnblogs.com/mmyy-blog/p/9279532.html