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.