初学Python:logging日志模块

本人只是Python的初学者,阐述不到位或者不对之处,敬请见谅!

一、概述

1、logging日志模块四个主要类:
  logger #提供了应用程序可以直接使用的接口;
  handler #将(logger创建的)日志记录发送到合适的目的输出;
  formatter #决定日志记录的最终输出格式
  filter #提供了细度设备来决定输出哪条日志记录;(备注:这个暂时不懂)

2、模块级函数:
  logging.getLogger([name]): #返回一个logger对象,如果没有指定名字将返回root logger,最常用
  logging.debug()、logging.info()、logging.warning()、logging.error()、logging.critical(): #logger的日志级别
  logging.basicConfig(): #给logger对象的配置管理函数 ;(备注:这个暂时不懂)

二、logging代码演示:

# /usr/bin/python
# -*- coding:utf-8 -*-
######################
#Log.py
######################

import logging

#创建一个logger,命名为bingoLogger,下文中通过"%(name)s"可以调用这个名字
mylogger = logging.getLogger('bingoLogger') #我理解这儿logging像一个模块,调用内部的getLogger类,创建一个日志对象,mylogger代指bingoLogger,更像是一个具体对象(object)
mylogger.setLevel(logging.DEBUG) #日志对象调用类或者对象自带的函数setLevel,确定输出日志的级别
formatter = logging.Formatter('%(asctime)s - %(name)s - %(filename)s- %(levelname)s - %(message)s') #定义日志输出格式formatter,输出具体内容见下文

#创建一个handler,用于写入日志文件,只输出debug级别以上的日志,并调用定义的输出格式
fh = logging.FileHandler('test.log')
fh.setLevel(logging.DEBUG)
fh.setFormatter(formatter)

#再创建一个handler,用于输出到控制台, 一般不用
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
ch.setFormatter(formatter)

# 给我们开始实例化的logger对象添加handler
mylogger.addHandler(fh)
mylogger.addHandler(ch)

# 直接在本模块中调用记录两条日志——生产环境会封装成函数调用
mylogger.info('good')
mylogger.debug('just a test ')

执行:python Log.py
输出结果:

2019-08-04 15:29:47,511 - bingoLogger - Log.py- INFO - good
2019-08-04 15:29:47,512 - bingoLogger - Log.py- DEBUG - just a test

三、logging模块的API

1、logging.getLogger([name])

返回一个logger实例,如果没有指定name,返回root logger。只要name相同,返回的logger实例都是同一个而且只有一个,即name和logger实例是一一对
应的。这意味着,无需把logger实例在各个模块中传递。只要知道name,就能得到同一个logger实例

2:logger.setLevel(lvl)——设置logger的level,

level有以下几个级别:
NOTSET < DEBUG < INFO < WARNING < ERROR < CRITICAL
不同日志级别对应的数字对照
级别 数值
CRITICAL 50
ERROR 40
WARNING 30
INFO 20
DEBUG 10
NOTSET 0
如果把logger的级别设置为INFO, 那么小于INFO级别的日志都不输出, 大于等于INFO级别的日志都输出。也就意味着同一个logger实例,如果多个地方调用,会
出现很多重复的日志
logger.debug(“debug”) # 不输出
logger.info(“info”) # 输出
logger.warning(“warning”) # 输出
logger.error(“error”) # 输出
logger.critical(“critical”) # 输出

3:logger.addHandler(hd)—— logger雇佣handler来帮它处理日志

handler对象负责发送相关的信息到指定目的地。Python的日志系统有多种Handler可以使用。有些Handler可以把信息输出到控制台,有些Handler可以把信息输出到文件,还有些 Handler可以把信息发送到网络上。如果觉得不够用,还可以编写自己的Handler。可以通过addHandler()方法添加多个多handler

handler主要有以下几种:

logging.StreamHandler: #日志输出到流即控制台,可以是sys.stderr、sys.stdout
logging.FileHandler: #日志输出到文件
logging.handlers.RotatingFileHandler #日志输出到文件,并按照设定的日志文件大小切割(见下述代码示例)
logging.handlers.TimedRotatingFileHandler #日志输出到文件,并按设定的时间切割日志文件
logging.handlers.SocketHandler: #远程输出日志到TCP/IP sockets
logging.handlers.DatagramHandler: #远程输出日志到UDP sockets
logging.handlers.SMTPHandler: #远程输出日志到邮件地址
logging.handlers.SysLogHandler: #日志输出到syslog
logging.handlers.NTEventLogHandler: #远程输出日志到Windows NT/2000/XP的事件日志
logging.handlers.MemoryHandler: #日志输出到内存中的制定buffer
由于StreamHandler和FileHandler是常用的日志处理方式,所以直接包含在logging模块中,而其他方式则包含在logging.handlers模块中

handle常见调用

Handler.setLevel(lel) #指定被处理的信息级别,低于lel级别的信息将被忽略
Handler.setFormatter() #给这个handler选择一个格式
Handler.addFilter(filt)、Handler.removeFilter(filt):#新增或删除一个filter对象(暂时没尝试过,不懂)

sample:

import logging
from logging.handlers import RotatingFileHandler

def create_logger(log_file):
    #Handler把日志输出到文件中,将参数日志名称传进来,按照maxBytes = 100M大小存储日志,并且只备份2个日志
    rh = RotatingFileHandler(log_file, maxBytes=100 * 1024 * 1024, backupCount=2)
    rh.setLevel(logging.INFO)
    rh.setFormatter(logging.Formatter("[%(levelname)s %(asctime)s %(module)s:%(lineno)d] %(message)s"))

    ch = logging.StreamHandler()
    ch.setLevel(logging.INFO)
    ch.setFormatter(logging.Formatter("[%(levelname)s %(asctime)s %(module)s:%(lineno)d] %(message)s"))

    logger = logging.getLogger(__name__) #__name__名称是__main__
    logger.setLevel(logging.INFO)
    logger.addHandler(rh)
    logger.addHandler(ch)
    return logger
发布了37 篇原创文章 · 获赞 2 · 访问量 7631

猜你喜欢

转载自blog.csdn.net/bingozb/article/details/98468726
今日推荐