Python的日志模块2

基本使用方法

调用函数

  • Logger 记录器,直接提供日志接口。
  • Handler 处理器,将(记录器产生的)日志记录发送至合适的目的地。
  • Formatter 格式化器,指明了最终输出中日志记录的布局。
  • Filter 过滤器,提供了更好的粒度控制,它可以决定输出哪些日志记录。

Logger 记录器

创建方法:

 logger = logging.getLogger(logger_name)

创建Logger实例后,可以使用以下方法进行日志级别设置,增加处理器Handler。

logger.setLevel(logging.ERROR) # 设置日志级别为ERROR,即只有日志级别大于等于ERROR的日志才会输出
logger.addHandler(handler_name) # 为Logger实例增加一个处理器
logger.removeHandler(handler_name) # 为Logger实例删除一个处理器

Handler 处理器

Handler处理器类型有很多种,比较常用的有三个,StreamHandlerFileHandlerNullHandler,详情可以访问Python logging.handlers
创建方法:

sh = logging.StreamHandler(stream=None) #创建StreamHandler,输出到控制台
fh = logging.FileHandler(filename, mode='a', encoding=None, delay=False)#创建FileHandler,输出到文件

Formatter 格式化器

Formatter指定的是每一条日志记录的抬头信息,也就是你可以指定日志记录的时间格式、进程号、文件名、函数名等信息。可以用这个方法来创建一个Formatter对象:

logging.Formatter.__init__( fmt=None, datefmt=None)

fmt参数指定进程号、文件名、函数名等信息是否出现以及格式, datefmt为日期时间格式,默认的日期格式精确到微秒,例如‘2003-07-08 16:49:45,896’。fmt中可以指定多个字段,每个字段的格式为“%(<dictionary key>)s”, 例如你想打印时间、日志级别、日志信息可以用下面的format:

'%(asctime)s - %(levelname)s - %(message)s'

在记录爬虫系统日志的时候需要定义记录日志的级别,级别越高表示打出来的日志越详细。我们可以用一个字典来设置不同级别对应的不同日志信息:

#用字典保存日志级别
format_dict = {
   1 : logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'),
   2 : logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'),
   3 : logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'),
   4 : logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'),
   5 : logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
}

Filter 过滤器

Handlers和Loggers可以使用Filters来完成比级别更复杂的过滤。Filter基类只允许特定Logger层次以下的事件。例如用‘A.B’初始化的Filter允许Logger ‘A.B’, ‘A.B.C’, ‘A.B.C.D’, ‘A.B.D’等记录的事件,logger‘A.BB’, ‘B.A.B’ 等就不行。 如果用空字符串来初始化,所有的事件都接受。

filter = logging.Filter(name='')

将本文开始的代码封装在一个类中

#开发一个日志系统, 既要把日志输出到控制台, 还要写入日志文件   
class Logger():
    def __init__(self, logname, loglevel, logger):
        '''
           指定保存日志的文件路径,日志级别,以及调用文件
           将日志存入到指定的文件中
        '''
        
        # 创建一个logger
        self.logger = logging.getLogger(logger)
        self.logger.setLevel(logging.DEBUG)
        
        # 创建一个handler,用于写入日志文件
        fh = logging.FileHandler(logname)
        fh.setLevel(logging.DEBUG)
        
        # 再创建一个handler,用于输出到控制台
        ch = logging.StreamHandler()
        ch.setLevel(logging.DEBUG)
        
        # 定义handler的输出格式
        #formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
        formatter = format_dict[int(loglevel)]
        fh.setFormatter(formatter)
        ch.setFormatter(formatter)
        
        # 给logger添加handler
        self.logger.addHandler(fh)
        self.logger.addHandler(ch)
        
    
    def getlog(self):
        return self.logger

再通过以下方式调用,便是一个简单的日志系统了

logger = Logger(logname='log.txt', loglevel=1, logger="fox").getlog()
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 本文章是我大概三年前,在上家单位使用 Python 工作时结合官方文档做的整理。现在 Python 官方文档听说已...
    好吃的野菜阅读 217,578评论 14 232
  • 本文首发于Gevin的博客 原文链接:Python 日志功能详解 未经 Gevin 授权,禁止转载 软件开发中通过...
    Gevin阅读 5,008评论 1 24
  • 本文翻译自logging howto 基础教程 日志是跟踪软件运行时发生事件的一种手段。Python开发者在代码中...
    大蟒传奇阅读 4,276评论 0 17
  • 改变 光芒万丈 情感关系的改变 骄傲 骄傲把自己的美展现出来 新的东西 内心那个很对 如何保持
    治愈的卡其色亮亮虾阅读 278评论 0 0
  • 父母年轻的时候都喜欢写写画画,用现在流行的词来说,大概算是一枚文艺青年。现在在家里柜子最里层的小盒子里还放着当初他...
    高小千阅读 191评论 0 0