使用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中使用md5sum检查目录中相同文件代码分享
Feb 02 Python
Python爬虫利用cookie实现模拟登陆实例详解
Jan 12 Python
python解析html提取数据,并生成word文档实例解析
Jan 22 Python
Python中elasticsearch插入和更新数据的实现方法
Apr 01 Python
JavaScript中的模拟事件和自定义事件实例分析
Jul 27 Python
Python中的函数式编程:不可变的数据结构
Oct 08 Python
pandas DataFrame索引行列的实现
Jun 04 Python
Python实现报警信息实时发送至邮箱功能(实例代码)
Nov 11 Python
python求绝对值的三种方法小结
Dec 04 Python
Tensorflow进行多维矩阵的拆分与拼接实例
Feb 07 Python
python 如何快速复制序列
Sep 07 Python
python动态规划算法实例详解
Nov 22 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代码
2013/12/03 PHP
PHP利用func_get_args和func_num_args函数实现函数重载实例
2014/11/12 PHP
php curl获取到json对象并转成数组array的方法
2018/05/31 PHP
YII框架关联查询操作示例
2019/04/29 PHP
laravel-admin 实现在指定的相册下添加照片
2019/10/21 PHP
经典的带阴影的可拖动的浮动层
2006/06/26 Javascript
超越Jquery_01_isPlainObject分析与重构
2010/10/20 Javascript
jQuery实用函数用法总结
2014/08/29 Javascript
使用jQuery中的wrap()函数操作HTML元素的教程
2016/05/24 Javascript
JS简单实现DIV相对于浏览器固定位置不变的方法
2016/06/17 Javascript
JavaScript中 ES6 generator数据类型详解
2016/08/11 Javascript
Vue.js每天必学之方法与事件处理器
2016/09/06 Javascript
Bootstrap列表组学习使用
2017/02/09 Javascript
JavaScript实现的商品抢购倒计时功能示例
2017/04/17 Javascript
使用jQuery,Angular实现登录界面验证码详解
2017/04/27 jQuery
聊聊Vue.js的template编译的问题
2017/10/09 Javascript
浅谈vue,angular,react数据双向绑定原理分析
2017/11/28 Javascript
jQuery+ajax读取json数据并按照价格排序示例
2018/03/28 jQuery
nodejs实现获取本地文件夹下图片信息功能示例
2019/06/22 NodeJs
vue实现滑动切换效果(仅在手机模式下可用)
2020/06/29 Javascript
通过vue写一个瀑布流插件代码实例
2019/09/07 Javascript
一篇文章看懂JavaScript中的回调
2021/01/05 Javascript
Django框架中数据的连锁查询和限制返回数据的方法
2015/07/17 Python
Python中内置数据类型list,tuple,dict,set的区别和用法
2015/12/14 Python
python3.5实现socket通讯示例(TCP)
2017/02/07 Python
详解python里使用正则表达式的分组命名方式
2017/10/24 Python
NLTK 3.2.4 环境搭建教程
2018/09/19 Python
PyQt5下拉式复选框QComboCheckBox的实例
2019/06/25 Python
python3+PyQt5 自定义窗口部件--使用窗口部件样式表的方法
2019/06/26 Python
python中if及if-else如何使用
2020/06/02 Python
Pycharm编辑器功能之代码折叠效果的实现代码
2020/10/15 Python
CSS3制作炫酷的自定义发光文字
2016/03/28 HTML / CSS
廉洁使者实施方案
2014/03/29 职场文书
安全负责人任命书
2014/06/06 职场文书
环境卫生标语
2014/06/09 职场文书
就业证明函
2015/06/17 职场文书