使用Filter过滤python中的日志输出的实现方法
作者:杨彦星 发布时间:2022-08-25 06:37:43
事情是这样的,我写了一个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
if handler.get_status() < 400:
log_method = access_log.info
elif handler.get_status() < 500:
log_method = access_log.warning
else:
log_method = access_log.error
request_time = 1000.0 * handler.request.request_time()
log_method("%d %s %.2fms", handler.get_status(),
handler._request_summary(), request_time)
其中 log_method = access_log.info
可以修改它,access_log
在log.py中定义,
access_log = logging.getLogger(“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 = logging.getLogger('server')
logobj.addFilter(NoParsingFilter())这样添加一个过滤以后日志就会随心所欲的按照自已的方式来记录了,record也是logging的一个类 LogRecord ,常用的属性有
name, level, pathname, lineno,msg, args, exc_info
name 就是初始化logger对象时传入的名字
level 是级别
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中的日志输出,网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
来源:https://www.yangyanxing.com/article/use_filter_in_python_logging.html


猜你喜欢
- easy_install 和 pip的介绍:easy_install和pip都是用来下载安装Python一个公共资源库PyPI 的相关资源包
- 一、字典转dataFrame1、字典转dataFrame比较简单,直接给出示例:import pandas as pddic = {'
- 前言我们知道,enigma机是德军二战中重要的情报加密机器,其有许多特点。首先,它是一台加解密一体机其次,它有排己性,虽然多次输入同一明文可
- 本文实例讲述了Python实现监控Nginx配置文件的不同并发送邮件报警功能。分享给大家供大家参考,具体如下:因为项目中经常涉及到多个Ngi
- 目录1. 字符串拆分函数.split()2. 字符串拼接函数.join()扩展:理解" ".join(s.split(&
- 这篇文章主要介绍了python实现XML解析的方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋
- 先上一段代码,如下所示:select distinct b.OrgID,b.CompanyID,b.AreaID,b.CustC
- 导读:SQL Server数据迁移的知识之前已经为大家介绍了很多,比如SQL Server数据库迁移方法,接下来就为大家详细介绍SQL Se
- 此方法创建了请求另一个URL的HTML超文本链接。语法string.link( hrefname )下面是参数的详细信息:&nb
- 下面都是我学习W3C School教程中有关JavaScript写的学习笔记,每个方法我都亲身测试过,每个方法的用途和参数列表,我都是在经过
- 海量数据库的查询优化及分页算法方案 原出处不详 摘自:www.21php.com 随着“ * ”建设的逐步深入和 * 信息化的高
- 这是Pygame zero 最全集合安装Windows系统:按下win+r,输入pip install pyzeropip install
- Web抓取Web站点使用HTML描述,这意味着每个web页面是一个结构化的文档。有时从中 获取数据同时保持它的结构是有用的。web站点不总是
- 代码如下:<% function GetBot() '查询蜘蛛 dim s_
- 在使用Tensor时,我们首先要掌握如何使用Tensor来定义不同数据类型的变量。Tensor时张量
- 公司安排了个任务,爬取ppt资源,我爬取后打开ppt发现,最后一页是站点的宣传,需要删除。仔细阅读了python-pptx的api和国内的教
- 本文实例为大家分享了python实现大转盘抽奖的具体代码,供大家参考,具体内容如下选择转盘中的某一个方框,来进行抽奖import tkint
- 观察者模式首先,提到观察者模式,这不禁让我想到了MVVM,MVVM架构模式感觉用到了观察者的思想。我们还是按照惯例,了解一下什么是观察者模式
- 在 PHP 中实现异步定时多任务消息推送的方式有多种,其中一种常用的方式是使用异步任务队列。以下是一个简单的步骤:安装和配置消息队列服务(如
- 回文数就是指整数倒过来和原整数相等。Example 1:Input: 121Output: trueExample 2:Input: -12