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