使⽤Filter过滤python中的⽇志输出的实现⽅法
事情是这样的,我写了⼀个tornado的服务,过程当中我⽤logging记录⼀些内容,由于⼀开始并没有仔细观察tornado⾃已的⽇志管理,所以我就⼀般⽤debug来记录普通⽇志,error记录有问题的⽇志,但是当服务跑起来以后才发现,tornado的访问⽇志的级别是info,也就是20,debug是10的,所以如果我定义了⽇志的级别是debug,那么默认情况下肯定也会输出到⽇志⽂件中的。
但是我现在并不关⼼访问⽇志,⽽且由于我这个服务可能每时每刻都会有访问,这样在我对⽇志信息进⾏搜索的时候就会有很⼤的影响。
该怎么办呢?
有以下⼏种办法
修改初始化⽇志时的级别
⼀种是修改我初始化时定义的⽇志级别,定成⽐info还⾼的,这样就不会再记录info的⽇志了
但是这种⽅法需要我将之前记录⽇志的 debug ⽅法也要修改为⽐info更⾼的级别,也就是要⼤于20。修改的地⽅有点多,且我已经习惯了⽤ debug 来记录,改起来成本有点⼤。
修改tornado 本⾝
可以到site-packages中修改tornado下的 web.py
def log_request(self, handler):
"""Writes a completed HTTP request to the logs.
By default writes to the python root logger. To change
this behavior either subclass Application and override this method,
or pass a function in the application settings dictionary as
``log_function``.
"""
if "log_function" in self.settings:
self.settings["log_function"](handler)
return
_status() < 400:
log_method = access_log.info
_status() < 500:
log_method = access_log.warning
else:
log_method =
request_time = 1000.0 * quest_time()
log_method("%d %s %.2fms", _status(),
handler._request_summary(), request_time)
其中log_method = access_log.info 可以修改它,access_log在log.py中定义,
access_log = Logger(“tornado.access”)
这⾥可以定义access_log的级别,然后再修改log_request的实现,想想都复杂,⽽且直接修改site-packes⾥的库⽂件是⼀个⽐较笨的⽅法,⽇后迁移会发⽣很多莫名其妙的问题。
使⽤logging.Filter设置过滤规则
其实logging早就有了相应的解决⽅法,logging库中有⼀个Filterer类,logging库中的Handler和Logger类都是继承⾃Filter类的
Filter类中有三个⽅法,addFilter(filter) , removeFilter(filter) 和 filter(record) ⽅法,这⾥主要使⽤addFilter和filter⽅法。
addFilter⽅法需要⼀个filter对象,这⾥我定义⼀个新的类,并且重写filter⽅法,
将⽇志名为 tornado.access 且⽇志级别是20的过滤掉。
class NoParsingFilter(logging.Filter):
def filter(self, record):
if record.name == 'tornado.access' and record.levelno == 20:
return False
return True
这样我在初始化 logging对象以后,将这个过滤器添加进去
logobj = Logger('server')
logobj.addFilter(NoParsingFilter())
这样添加⼀个过滤以后⽇志就会随⼼所欲的按照⾃已的⽅式来记录了,record也是logging的⼀个类 LogRecord ,常⽤的属性有name, level, pathname, lineno,msg, args, exc_info
name 就是初始化logger对象时传⼊的名字
level 是级别
python中lambda怎么使用
pathname 是哪个⽂件输出的这⾏⽇志
lineno 是⾏号
msg 是⽇志本⾝
ps:下⾯看下python中过滤器filter⽤法
#第⼀个参数是⼀个返回bool值的⼀般函数或lambda函数,第⼆个参数是⼀个可迭代对象
#最后返回⼀个可迭代对象,可以通过list获得
def is_positive(item):
return item>0
values = [1,-2,3,-4]
print(filter(is_poditive,values))
a = list(filter(is_positive,values))
print(a)
print(values)
#output
<filter object at 0x000002398A1AB4A8>
[1, 3]
[1, -2, 3, -4]
b = list(filter(lambda item:item>0,values))
print(b)
#output
[1,3]
总结
以上所述是⼩编给⼤家介绍的使⽤Filter过滤python中的⽇志输出,希望对⼤家有所帮助,如果⼤家有任何疑问请给我留⾔,⼩编会及时回复⼤家的。在此也⾮常感谢⼤家对⽹站的⽀持!
如果你觉得本⽂对你有帮助,欢迎转载,烦请注明出处,谢谢!