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 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.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值