zoukankan      html  css  js  c++  java
  • 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.
  • 相关阅读:
    二维图像的DCT变换
    Shell脚本加密--shc/gzexe
    vim python插件--vim python mode
    移动端图片裁剪解决方案
    移动端压缩并ajax上传图片解决方案
    html5拖拽实现
    html5的触摸事件
    js循环添加事件的问题
    h5上传图片
    thinkphp加载第三方类库
  • 原文地址:https://www.cnblogs.com/letmeiscool/p/8515647.html
Copyright © 2011-2022 走看看