使用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中将阿拉伯数字转换成中文的实现代码
May 19 Python
Python中每次处理一个字符的5种方法
May 21 Python
python实现给数组按片赋值的方法
Jul 28 Python
使用Mixin设计模式进行Python编程的方法讲解
Jun 21 Python
使用Python多线程爬虫爬取电影天堂资源
Sep 23 Python
Python实现基于PIL和tesseract的验证码识别功能示例
Jul 11 Python
浅谈python写入大量文件的问题
Nov 09 Python
WIn10+Anaconda环境下安装PyTorch(避坑指南)
Jan 30 Python
python实现修改固定模式的字符串内容操作示例
Dec 30 Python
基于python判断字符串括号是否闭合{}[]()
Sep 21 Python
Python基础之教你怎么在M1系统上使用pandas
May 08 Python
Python实现天气查询软件
Jun 07 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
SONY SRF-M100的电路分析
2021/03/02 无线电
第六节--访问属性和方法
2006/11/16 PHP
用Zend Encode编写开发PHP程序
2010/02/21 PHP
PHP函数spl_autoload_register()用法和__autoload()介绍
2012/02/04 PHP
PHP Global变量定义当前页面的全局变量实现探讨
2013/06/05 PHP
对PHP新手的一些建议(PHP学习经验总结)
2014/08/20 PHP
关于PHP 如何用 curl 读取 HTTP chunked 数据
2016/02/26 PHP
ThinkPHP 5.1 跨域配置方法
2019/10/11 PHP
javaScript同意等待代码实现心得
2011/01/01 Javascript
javascript模拟枚举的简单实例
2014/03/06 Javascript
js实现绿白相间竖向网页百叶窗动画切换效果
2015/03/02 Javascript
在JS方法中返回多个值的方法汇总
2015/05/20 Javascript
浅析JavaScript 箭头函数 generator Date JSON
2016/05/23 Javascript
基于d3.js实现实时刷新的折线图
2016/08/03 Javascript
BootStrap 超链接变按钮的实现方法
2016/09/25 Javascript
如何用JS/HTML将时间戳转换为“xx天前”的形式
2017/02/06 Javascript
xmlplus组件设计系列之选项卡(Tabbar)(5)
2017/05/03 Javascript
vue引入swiper插件的使用实例
2017/07/19 Javascript
Node.js五大应用性能技巧小结(必须收藏)
2017/08/09 Javascript
vue 2.0项目中如何引入element-ui详解
2017/09/06 Javascript
Vue按需加载的具体实现
2017/12/02 Javascript
移动端 Vue+Vant 的Uploader 实现上传、压缩、旋转图片功能
2019/06/10 Javascript
javascript 代码是如何被压缩的示例代码
2020/05/06 Javascript
基于JQuery实现页面定时弹出广告
2020/05/08 jQuery
python通过微信发送邮件实现电脑关机
2018/06/20 Python
Python初学者需要注意的事项小结(python2与python3)
2018/09/26 Python
Python 进程操作之进程间通过队列共享数据,队列Queue简单示例
2019/10/11 Python
详解css3使用transform出现字体模糊的解决办法
2020/10/16 HTML / CSS
美国受欢迎的眼影品牌:BH Cosmetics
2016/10/25 全球购物
阿里巴巴Oracle DBA笔试题答案-备份恢复类
2013/11/20 面试题
一些高难度的SQL面试题
2016/11/29 面试题
Java中的基本数据类型所占存储空间大小固定的吗
2012/02/15 面试题
毕业实习指导教师评语
2014/12/31 职场文书
导游词之广西漓江
2019/11/02 职场文书
话题作文之呼唤
2019/12/18 职场文书
解决SpringBoot文件上传临时目录找不到的问题
2021/07/01 Java/Android