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.