python学习笔记9--日志模块logging

咱们在写程序的时候常常会打一些日志来帮助咱们查找问题,此次学习一下logging模块,在python里面如何操做日志。
介绍一下logging模块,logging模块就是python里面用来操做日志的模块,logging模块中主要有4个类,分别负责不一样的工做:python

Logger 记录器,暴露了应用程序代码能直接使用的接口;简单点说就是一个建立一个办公室,让人在里头工做 函数

Handler 处理器,将(记录器产生的)日志记录发送至合适的目的地;这个简单点说就是办事的人,你能够指定是让在控制输出日志,仍是在文件里面打印日志,经常使用的有4种: 布局

                StreamHandler 控制台输出 学习

                FileHandler 文件输出编码

                下面两种须要导入线程

                        handlers
                        from logging import handlers debug

                        TimedRotatingFileHandler 按照时间自动分割日志文件 调试

                        RotatingFileHandler 按照大小自动分割日志文件,一旦达到指定的大小从新生成文件 日志

                Filter
过滤器,提供了更好的粒度控制,它能够决定输出哪些日志记录。(不经常使用) orm

                Formatter
格式化器,指明了最终输出中日志记录的布局。指定输出日志的格式

import logging
from logging import handlers
#只在控制台打印日志
logging.basicConfig(level=logging.ERROR,#控制台打印的日志级别
                    format=
                    '%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s'
                    #日志格式
                    )
logging.debug('debug级别,最低级别,通常开发人员用来打印一些调试信息')
logging.info('info级别,正常输出信息,通常用来打印一些正常的操做')
logging.warning('waring级别,通常用来打印警信息')
logging.error('error级别,通常用来打印一些错误信息')
logging.critical('critical级别,通常用来打印一些致命的错误信息')

日志级别 debug < info < warning < error < critical
设置了日志级别以后,会打印该级别以及比该级别高的全部日志,举个例子,若是日志级别是warning,那么就会打印warning、error、critical,这三个级别的日志,不会打印debug和info级别的,若是是debug,最低级别的日志,那么全部的日志都会打印。
上面的只是在控制台打印日志,并无把日志写在文件里面,通常咱们都会把日志写在日志文件里面,也很简单,只须要加个参数指定文件名就好了。

logging.basicConfig(level=logging.ERROR,#控制台打印的日志级别
                    filename='log.txt',#文件名
                    filemode='a',#模式,有w和a,w就是写模式,每次都会从新写日志,覆盖以前的日志
                    #a是追加模式,默认若是不写的话,就是追加模式
                    format=
                    '%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s'
                    #日志格式
                    )
logging.debug('debug级别,最低级别,通常开发人员用来打印一些调试信息')
logging.info('info级别,正常输出信息,通常用来打印一些正常的操做')
logging.warning('waring级别,通常用来打印警信息')
logging.error('error级别,通常用来打印一些错误信息')
能够指定日志的输出格式format,这个参数能够输出不少有用的信息,以下面的几种格式:
%(levelno)s: 打印日志级别的数值
 
 
%(levelname)s: 打印日志级别名称
 
 
%(pathname)s: 打印当前执行程序的路径,其实就是sys.argv[0]
 
 
%(filename)s: 打印当前执行程序名
 
 
%(funcName)s: 打印日志的当前函数
 
 
%(lineno)d: 打印日志的当前行号
 
 
%(asctime)s: 打印日志的时间
 
 
%(thread)d: 打印线程ID
 
 
%(threadName)s: 打印线程名称
 
 
%(process)d: 打印进程ID
 
 
%(message)s: 打印日志信息
 
 
我在工做中给的经常使用格式在前面已经看到了。就是:
format='%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s'
这个格式能够输出日志的打印时间,是哪一个文件第几行输出的,输出的日志级别是什么,以及输入的日志内容。

加上文件名以后就会发现控制台不会输出日志了,日志文件也产生了,那么如何既在控制台输出日志,也在文件中写入呢?

 

 

怎么实现呢,就得有个办公室,里面塞俩人,一个给负责往控制台输出日志,一个负责写文件,你把他俩往办公室一塞,他俩就能干活了。

import logging
from logging import handlers
logger = logging.getLogger('my_log')
#先建立一个logger对象,至关于这个办公室,也就是上面说的Logger
logger.setLevel(logging.INFO)#设置日志的总级别
fh = logging.FileHandler('test.log',mode='a',encoding='utf-8')#建立一个文件处理器,也就是把日志写到文件里头
fh.setLevel(logging.INFO)#设置文件输出的级别
sh = logging.StreamHandler()#建立一个控制台输出的处理器,这两个就是上面说的Handler
sh.setLevel(logging.INFO)
#设置控制台输出的日志级别,这两个级别均可以单独设置,他们俩和logger的级别区别是若是logger设置的级别比里面的handler级别设置的高,那么就以logger的级别为准
th = handlers.TimedRotatingFileHandler('time',when='S',interval=1,backupCount=2)
#指定间隔时间自动生成文件的处理器
#interval是时间间隔,backupCount是备份文件的个数,若是超过这个超过这个个数,就会自动删除,when是间隔的时间单位,单位有如下几种:
            # S 秒
            # M 分
            # H 小时、
            # D 天、
            # W 每星期(interval==0时表明星期一)
            # midnight 天天凌晨
th.setLevel(logging.INFO)
formater = logging.Formatter('%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s')
#指定日志格式,上面我们写了经常使用的格式,直接指定了就好了,这也就是我们上面说的Formatter
sh.setFormatter(formater)
fh.setFormatter(formater)
th.setFormatter(formater)
#设置两个处理器的日志格式
 
logger.addHandler(sh)
logger.addHandler(fh)
logger.addHandler(th)
#把两个handler加入容器里头,至关于把工做人员培训完了,大家能够上班了
logger.debug('debug级别,最低级别,通常开发人员用来打印一些调试信息')
logger.info('info级别,正常输出信息,通常用来打印一些正常的操做')
logger.warning('waring级别,通常用来打印警信息')
logger.error('error级别,通常用来打印一些错误信息')
logger.critical('critical级别,通常用来打印一些致命的错误信息')

这样logger这个日志办公室已经搞好了,我们就能够直接用了,运行完发现文件也产生了,控制台也有日志。若是不设置日志级别的话,默认级别是waring。
下面咱们本身封装一个类来使用logging模块,方便使用,默认加一些配置

import logging
from logging import handlers
class Logger(object):
    level_relations = {
        'debug':logging.DEBUG,
        'info':logging.INFO,
        'warning':logging.WARN,
        'error':logging.ERROR,
        'crit':logging.CRITICAL
    }#日志级别关系映射
    def __init__(self,fp,level='debug',when='midnight',interval=1,backCount=5,encoding='utf-8'):
        '''
 
        :param fp:日志文件路径
        :param level: 日志级别 默认是debug
        :param when: 分割日志的单位 S 秒、M 分、 H 小时、 D 天、 W 每星期(interval==0时表明星期一)、midnight 天天凌晨
        :param interval: 时间间隔 默认天天凌晨
        :param backCount: 备份文件个数 默认5个
        :param encoding: 日志文件编码
        '''
        self.level = self.level_relations.get(level)
        self.logger = logging.getLogger(fp)
        self.logger.setLevel(self.level)
        fmt = logging.Formatter('%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s')
        sh = logging.StreamHandler()
        sh.setFormatter(fmt)
        sh.setLevel(self.level)
        th = handlers.TimedRotatingFileHandler(fp,when=when,interval=interval,backupCount=backCount,encoding=encoding)
        th.setFormatter(fmt)
        th.setLevel(self.level)
        self.logger.addHandler(th)
        self.logger.addHandler(sh)
    def debug(self,msg):
        self.logger.debug(msg)
    def info(self,msg):
        self.logger.info(msg)
    def warning(self,msg):
        self.logger.warning(msg)
    def error(self,msg):
        self.logger.error(msg)
    def crit(self,msg):
        self.logger.critical(msg)
if __name__ == '__main__':
    l = Logger('a.log')#实例化
    l.info('hehehe')#调用
相关文章
相关标签/搜索