接口自动化—认识日志logger

python的logging模块提供了通用的日志系统,可以方便第三方模块、应用使用。logging是python内置的标准模块,主要是用于输出运行日志i,设置输出日志等级、日志保存路径、日志文件回滚等。

1 认识logging

logging模块提供logger、handler、filter、formatter
1)logger:给需要使用的代码提供日志接口。logging.getLogger(name)获取logger对象,不指定name就会返回root对象。
2)handler:是把日志记录发送到目的地,logger对象可以通过addHandler方法添加多个handler,每个handler可以定义不同日志级别,,来实现分级过滤显示。

3)filter:是提供优雅的方式判断一个日志记录是否发送给handler。

4)formatter:指定日志记录输出的具体格式。formatter构造方法需要两个参数,包含消息的格式字符串和日期字符串。

logging可以输出到指定位置、输出格式,方便开发人员查看日志信息,开发人员可以根据日志等级来查看输出信息。

2 python中配置logging有三种方式

1)基础配置:logging.basicConfig(filename=“config.log”,filemode=“w”,format="%(asctime)s-%(name)s-%(levelname)s-%(message)s",level=logging.INFO)。

2)使用配置文件的方式配置logging:fileConfig(filename,defaults=None,disable_existing_loggers=Ture )函数来读取配置文件。

3)使用一个字典方式来写配置信息:dictConfig(dict,defaults=None, disable_existing_loggers=Ture )函数来瓦按成logging的配置.

3 logging中包含的handler

handler名称:位置;作用
StreamHandler:logging.StreamHandler;日志输出到流,可以是sys.stderr,sys.stdout或者文件
FileHandler:logging.FileHandler;日志输出到文件
BaseRotatingHandler:logging.handlers.BaseRotatingHandler;基本的日志回滚方式
RotatingHandler:logging.handlers.RotatingHandler;日志回滚方式,支持日志文件最大数量和日志文件回滚
TimeRotatingHandler:logging.handlers.TimeRotatingHandler;日志回滚方式,在一定时间区域内回滚日志文件
SocketHandler:logging.handlers.SocketHandler;远程输出日志到TCP/IP sockets
DatagramHandler:logging.handlers.DatagramHandler;远程输出日志到UDP sockets
SMTPHandler:logging.handlers.SMTPHandler;远程输出日志到邮件地址
SysLogHandler:logging.handlers.SysLogHandler;日志输出到syslog
NTEventLogHandler:logging.handlers.NTEventLogHandler;远程输出日志到Windows NT/2000/XP的事件日志
MemoryHandler:logging.handlers.MemoryHandler;日志输出到内存中的指定buffer
HTTPHandler:logging.handlers.HTTPHandler;通过"GET"或者"POST"远程输出到HTTP服务器

4 format输出格式

#基础配置,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:打印日志信息
 logging.basicConfig(level=logging.DEBUG,format='%(lineno)d)%(asctime)s-%(name)s-%(levelname)s-%(message)s')



5 日志等级信息

FATAL:致命错误
CRITICAL:特别糟糕的事情,如内存耗尽、磁盘空间为空,一般很少使用
ERROR:发生错误时,如IO操作失败或者连接问题
WARNING:发生很重要的事件,但是并不是错误时,如用户登录密码错误
INFO:处理请求或者状态变化等日常事务
DEBUG:调试过程中使用DEBUG等级,如算法中每个循环的中间状态

6 实践代码

#coding:utf-8
import logging
from logging.handlers import RotatingFileHandler
#输出日志对象
logger=logging.getLogger(__name__)
#设置最低日志级别:分别低到高有debug、info、warning、error以及critical
logger.setLevel(level=logging.INFO)

#将设置的级别日志放在指定文件里面
handler=logging.FileHandler("testlog1.txt")

#定义一个RotaingFileHandler,最多备份3个日志文件,每个日志文件最多1k
# handler=RotatingFileHandler('testlog1.txt',maxBytes=1*1024,backupCount=3)
#指定被处理的信息级别,低于设置级别的信息将被忽略
handler.setLevel(logging.INFO)
#设置输出日志格式
formatter=logging.Formatter('%(lineno)d)%(asctime)s-%(name)s-%(levelname)s-%(message)s')
#给handler添加输出的日志格式
handler.setFormatter(formatter)

#将日志输出到控制台
console=logging.StreamHandler()
console.setFormatter(formatter)
console.setLevel(logging.INFO)

#添加handler
logger.addHandler(handler)
logger.addHandler(console)

#日志对象输出的信息
logger.info('Start print logs---------------')
logger.debug('Do something')
logger.warning('There are warning')
#捕获traceback模块被用于跟踪异常返回信息,能够在logging中记录下traceback
try:
    open('test_traceback.txt','rb')
except(SystemExit,KeyboardInterrupt):
    raise
except Exception:
    # logger.exception(msg, _args)等价于logger.error(msg,exc_info = True,_args)
    # logger.error("Faild to open test_traceback.txt from logger.error",exc_info=True)
    logger.exception("Faild to open test_traceback.txt from logger.Exception")
logger.info('Finish print logs ---------------')

7 多模块使用logging

定义父模块并进行配置,可以在解释器进程里面其他地方通过getLogger(‘fatherModule’)得到的对象都是一样的,不需要重新配置,可以直接使用;
定义的该logger的子logger,都可以共享父logger的定义和配置,所谓的父子logger是通过命名来识别,任意以’fatherModule’开头的logger都是它的子logger,例如’fatherModule.son’。

sonModule.py

#coding:utf-8
'''
学习使用Python的logging日志模块-多模块使用logging
'''
import logging
#父模块的子logger
module_logger=logging.getLogger("fatherModule.son")
class SonModuleClass(object):
    def __init__(self):
        self.logger=logging.getLogger("fatherModule.son.module")
        self.logger.info("creating an instance in SonModuleClass")
    def doSomething(self):
        self.logger.info("do something in SonModule")
        a=[]
        a.append(1)
        self.logger.debug("list a="+str(a))
        self.logger.info("finish something in SonModuleClass")
def test_function():
    module_logger.info("call function some function")

fatherModule.py

#coding:utf-8
from logs.sonModule import *
'''
定义父模块并进行配置,可以在解释器进程里面其他地方通过getLogger('fatherModule')得到的对象都是一样的,不需要重新配置,可以直接使用;
定义的该logger的子logger,都可以共享父logger的定义和配置,所谓的父子logger是通过命名来识别,任意以'fatherModule'开头的logger都是它的子logger,例如'fatherModule.son'。
'''


from logging.handlers import RotatingFileHandler
#输出日志对象
logger=logging.getLogger("fatherModule")
#设置最低日志级别:分别低到高有debug、info、warning、error以及critical
logger.setLevel(level=logging.INFO)

#将设置的级别日志放在指定文件里面
handler=logging.FileHandler("testlog1.txt")
#定义一个RotaingFileHandler,最多备份3个日志文件,每个日志文件最多1k
# handler=RotatingFileHandler('testlog1.txt',maxBytes=1*1024,backupCount=3)
#指定被处理的信息级别,低于设置级别的信息将被忽略
handler.setLevel(logging.INFO)
#设置输出日志格式
formatter=logging.Formatter('%(lineno)d)%(asctime)s-%(name)s-%(levelname)s-%(message)s')
#给handler添加输出的日志格式
handler.setFormatter(formatter)

#将日志输出到控制台
console=logging.StreamHandler()
console.setFormatter(formatter)
console.setLevel(logging.INFO)

#添加handler
logger.addHandler(handler)
logger.addHandler(console)

#日志对象输出的信息
logger.info('crating an instance of sunModule.sonModuleClass')
a=SonModuleClass()
logger.info('calling somModule.sonModuleClass.doSomething')
a.doSomething()
logger.info('done with sonMoudle.sonModuleClass.doSomething')

logger.info('calling sonModule.test_function()')
test_function()
logger.info('done with sonModule.test_function()')

本文参考了一些网上资料(呜呜呜,现在没有找到那个链接,若有类似请见谅)
此文纯是自我学习总结

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值