python日志对象

写了个测试接口日志模块:

import logging
class Log:
    def __init__(self,filename,level="INFO"):
        print ("start")
        self.filename=filename
        self.level=level
        self.logger=logging.getLogger() #得到logger实体
        self.logger.setLevel(logging.DEBUG)#设置日志最低输出级别默认为WARN
        self.formatter=logging.Formatter("[%(asctime)s - %(filename)s] - %(levelname)s : %(message)s")#设置日志格式

    def __createHandler(self):
        #创建FileHandler,日志输入到文件
        fh=logging.FileHandler(self.filename,'a')
        fh.setLevel(logging.DEBUG)
        fh.setFormatter(self.formatter)
        self.logger.addHandler(fh)

        # 创建FileHandler,日志输入到控制台
        ch = logging.StreamHandler()
        ch.setLevel(logging.DEBUG)
        ch.setFormatter(self.formatter)
        self.logger.addHandler(ch)
        return fh,ch

    def __console(self,message):
        if self.level == "INFO":
            self.logger.info(message)
        if self.level == "DEBUG":
            self.logger.debug(message)
        if self.level == "WARN":
            self.logger.warn(message)
        if self.level == "ERROR":
            self.logger.error(message)

    def __call__(self,fuc):
        def wrapper(*args,**kwargs):
            fh, ch=self.__createHandler()
            for i in range(len(args)):
                self.__console(args[i])
            self.logger.removeHandler(fh)
            self.logger.removeHandler(ch)
            fuc(*args, **kwargs)
        return wrapper

#测试代码
filename="test.log"
url="http://192.168.100.34:8325/business/metadata/city/get"
way="GET"
header="{'Hyaline-Auth-AccessHeader': {'sysCode':'che001'}"
params="{'code': u'04986580'}"

@Log(filename,level="INFO")
def writeLog(url,way,header,params):
    print ("其他操作")

writeLog(url,way,header,params)

1.getLogger():这是最基本的入口,该方法参数可以为空,默认的logger名称是root,如果在同一个程序中一直都使用同名的logger,其实会拿到同一个实例,使用这个技巧就可以跨模块调用同样的logger来记录日志。

2.Formatter对象定义了log信息的结构和内容,构造时需要带两个参数:

  • 一个是格式化的模板fmt,默认会包含最基本的level和 message信息
  • 一个是格式化的时间样式datefmt,默认为 2003-07-08 16:49:45,896 (%Y-%m-%d %H:%M:%S)

fmt中允许使用的变量可以参考下表。

  • %(name)s Logger的名字
  • %(levelno)s 数字形式的日志级别
  • %(levelname)s 文本形式的日志级别
  • %(pathname)s 调用日志输出函数的模块的完整路径名,可能没有
  • %(filename)s 调用日志输出函数的模块的文件名
  • %(module)s 调用日志输出函数的模块名|
  • %(funcName)s 调用日志输出函数的函数名|
  • %(lineno)d 调用日志输出函数的语句所在的代码行
  • %(created)f 当前时间,用UNIX标准的表示时间的浮点数表示|
  • %(relativeCreated)d 输出日志信息时的,自Logger创建以来的毫秒数|
  • %(asctime)s 字符串形式的当前时间。默认格式是“2003-07-08 16:49:45,896”。逗号后面的是毫秒
  • %(thread)d 线程ID。可能没有
  • %(threadName)s 线程名。可能没有
  • %(process)d 进程ID。可能没有
  • %(message)s 用户输出的消息Logging有如下级别: DEBUG,INFO,WARNING,ERROR,CRITICAL

3.SetLevel默认级别是WARNING,logging模块只会输出指定level以上的log。这样的好处, 就是在项目开发时debug用的log,在产品release阶段不用一一注释,只需要调整logger的级别就可以了,很方便。

4.Handler最常用的是StreamHandler和FileHandler, Handler用于向不同的输出端打log。

Logging包含很多handler, 可能用到的有下面几种

    • StreamHandler instances send error messages to streams (file-like objects).
    • FileHandler instances send error messages to disk files.
    • RotatingFileHandler instances send error messages to disk files, with support for maximum log file sizes and log file rotation.
    • TimedRotatingFileHandler instances send error messages to disk files, rotating the log file at certain timed intervals.
    • SocketHandler instances send error messages to TCP/IP sockets.
    • DatagramHandler instances send error messages to UDP sockets.
    • SMTPHandler instances send error messages to a designated email address.
posted @ 2018-03-06 17:32  若爱以星光为牢  阅读(474)  评论(0编辑  收藏  举报