使用Filter过滤python中的日志输出的实现方法


Posted in Python onJuly 17, 2019

事情是这样的,我写了一个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中的日志输出,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
Python httplib,smtplib使用方法
Sep 06 Python
python中getattr函数使用方法 getattr实现工厂模式
Jan 20 Python
Python内置函数之filter map reduce介绍
Nov 30 Python
Python中的各种装饰器详解
Apr 11 Python
使用Pyrex来扩展和加速Python程序的教程
Apr 13 Python
Python如何筛选序列中的元素的方法实现
Jul 15 Python
对python中不同模块(函数、类、变量)的调用详解
Jul 16 Python
python保留小数位的三种实现方法
Jan 07 Python
使用Python对Dicom文件进行读取与写入的实现
Apr 20 Python
.img/.hdr格式转.nii格式的操作
Jul 01 Python
python遍历路径破解表单的示例
Nov 21 Python
Python 游戏大作炫酷机甲闯关游戏爆肝数千行代码实现案例进阶
Oct 16 Python
纯python进行矩阵的相乘运算的方法示例
Jul 17 #Python
python中update的基本使用方法详解
Jul 17 #Python
python利用wx实现界面按钮和按钮监听和字体改变的方法
Jul 17 #Python
使用Python和Scribus创建一个RGB立方体的方法
Jul 17 #Python
python实现点击按钮修改数据的方法
Jul 17 #Python
python 批量添加的button 使用同一点击事件的方法
Jul 17 #Python
python实时检测键盘输入函数的示例
Jul 17 #Python
You might like
社区(php&amp;&amp;mysql)一
2006/10/09 PHP
Thinkphp使用mongodb数据库实现多条件查询方法
2014/06/26 PHP
浅谈PHP Cookie处理函数
2016/06/10 PHP
php基于mcrypt_encrypt和mcrypt_decrypt实现字符串加密解密的方法
2016/07/12 PHP
PHP实现一个简单url路由功能实例
2016/11/05 PHP
PHP实现电商订单自动确认收货redis队列
2017/05/17 PHP
Jquery 基础学习笔记之文档处理
2009/05/29 Javascript
javascript 动态table添加colspan\rowspan 参数的方法
2009/07/25 Javascript
javascript实例分享---具有立体效果的图片特效
2014/06/08 Javascript
探讨JavaScript语句的执行过程
2016/01/28 Javascript
js数组的五种迭代方法及两种归并方法(推荐)
2016/06/14 Javascript
基于JavaScript实现添加到购物车效果附源码下载
2016/08/22 Javascript
jquery层级选择器(匹配父元素下的子元素实现代码)
2016/09/05 Javascript
knockoutjs模板实现树形结构列表
2017/07/31 Javascript
Node.js readline模块与util模块的使用
2018/03/01 Javascript
JavaScript实现区块链
2018/03/14 Javascript
angularjs下ng-repeat点击元素改变样式的实现方法
2018/09/12 Javascript
少女风vue组件库的制作全过程
2019/05/15 Javascript
Vue常用传值方式、父传子、子传父及非父子实例分析
2020/02/24 Javascript
Vue实现返回顶部按钮实例代码
2020/10/21 Javascript
[01:01:43]EG vs VP 2018国际邀请赛淘汰赛BO3 第二场 8.24
2018/08/25 DOTA
在Python中使用判断语句和循环的教程
2015/04/25 Python
Queue 实现生产者消费者模型(实例讲解)
2017/11/13 Python
Python3实现的判断回文链表算法示例
2019/03/08 Python
Python如何避免文件同名产生覆盖
2020/06/09 Python
python rsa-oaep加密的示例代码
2020/09/23 Python
Python爬虫新手入门之初学lxml库
2020/12/20 Python
Origins悦木之源香港官网:雅诗兰黛集团高端植物护肤品牌
2018/03/21 全球购物
德国户外装备、登山运动和攀岩商店:tapir store
2020/02/12 全球购物
联强国际笔试题面试题
2013/07/10 面试题
Ruby中的保护方法和私有方法与一般面向对象程序设计语言的一样吗
2013/05/01 面试题
师范毕业生个人求职信
2013/12/09 职场文书
秘书专业自荐信范文
2013/12/26 职场文书
大学生创业计划书的用途
2014/01/08 职场文书
只需要这一行代码就能让python计算速度提高十倍
2021/05/24 Python
动画《平凡职业成就世界最强》宣布制作OVA
2022/04/01 日漫