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

 更新时间:2019年07月17日 09:41:26   作者:杨彦星  
这篇文章主要介绍了使用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
  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高级用法总结

    Python很棒,它有很多高级用法值得细细思索,学习使用。本文将根据日常使用,总结介绍Python的一组高级特性,包括:列表推导式、迭代器和生成器、装饰器
    2018-05-05
  • Python打包文件执行报错:ModuleNotFoundError: No module named ‘pymssql‘的解决方法

    Python打包文件执行报错:ModuleNotFoundError: No module 

    这篇文章给大家介绍了Python打包文件执行报错:ModuleNotFoundError: No module named ‘pymssql‘的解决方法,如果有遇到相同问题的朋友可以参考阅读一下本文
    2023-10-10
  • Python编程pygal绘图实例之XY线

    Python编程pygal绘图实例之XY线

    这篇文章主要介绍了Python编程pygal绘图实例之XY线,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12
  • 如何在keras中添加自己的优化器(如adam等)

    如何在keras中添加自己的优化器(如adam等)

    这篇文章主要介绍了在keras中实现添加自己的优化器(如adam等)方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-06-06
  • 解决pyinstaller打包exe可执行文件后运行找不到pandas或者XXX模块

    解决pyinstaller打包exe可执行文件后运行找不到pandas或者XXX模块

    这篇文章主要介绍了解决pyinstaller打包exe可执行文件后运行找不到pandas或者XXX模块问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • Django 解决新建表删除后无法重新创建等问题

    Django 解决新建表删除后无法重新创建等问题

    这篇文章主要介绍了Django 解决新建表删除后无法重新创建等问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-05-05
  • 解决Python保存文件名太长OSError: [Errno 36] File name too lon

    解决Python保存文件名太长OSError: [Errno 36] File 

    这篇文章主要介绍了解决Python保存文件名太长OSError: [Errno 36] File name too lon问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05
  • python实现数据图表

    python实现数据图表

    plotly是现代平台的敏捷商业智能和数据科学库,它作为一款开源的绘图库,可以应用于Python、R、MATLAB、Excel、JavaScript和jupyter等多种语言,主要使用的js进行图形绘制,实现过程中主要就是调用plotly的函数接口,底层实现完全被隐藏,便于初学者的掌握。
    2017-07-07
  • python定时任务apscheduler的详细使用教程

    python定时任务apscheduler的详细使用教程

    APScheduler的全称是Advanced Python Scheduler,它是一个轻量级的 Python定时任务调度框架,下面这篇文章主要给大家介绍了关于python定时任务apscheduler的详细使用教程,需要的朋友可以参考下
    2022-02-02
  • Python实现获取当前日期的所属信息

    Python实现获取当前日期的所属信息

    在Python中,处理日期和时间是一个常见的任务,它涉及到许多方面,例如获取日期的年、月、日、星期几等等,本文将详细介绍如何使用Python来获取当前日期的各种相关信息,需要的可以了解下
    2024-01-01

最新评论