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

(0)

相关推荐

  • Python使用logging结合decorator模式实现优化日志输出的方法

    本文实例讲述了Python使用logging结合decorator模式实现优化日志输出的方法.分享给大家供大家参考,具体如下: python内置的loging模块非常简便易用, 很适合程序运行日志的输出. 而结合python的装饰器模式,则可实现简明实用的代码.测试代码如下所示: #! /usr/bin/env python2.7 # -*- encoding: utf-8 -*- import logging logging.basicConfig(format='[%(asctime)s]

  • Python过滤函数filter()使用自定义函数过滤序列实例

    filter函数: filter()函数可以对序列做过滤处理,就是说可以使用一个自定的函数过滤一个序列,把序列的每一项传到自定义的过滤函数里处理,并返回结果做过滤.最终一次性返回过滤后的结果. filter()函数有两个参数: 第一个,自定函数名,必须的 第二个,需要过滤的列,也是必须的 DEMO 需求,过滤大于5小于10的数: 复制代码 代码如下: # coding=utf8 # 定义大于5小于10的函数 def guolvhanshu(num):     if num>5 and num<

  • Python同时向控制台和文件输出日志logging的方法

    本文实例讲述了Python同时向控制台和文件输出日志logging的方法.分享给大家供大家参考.具体如下: python提供了非常方便的日志模块,可实现同时向控制台和文件输出日志的功能. #-*- coding:utf-8 -*- import logging # 配置日志信息 logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s', datefmt

  • Python向日志输出中添加上下文信息

    除了传递给日志记录函数的参数(如msg)外,有时候我们还想在日志输出中包含一些额外的上下文信息.比如,在一个网络应用中,可能希望在日志中记录客户端的特定信息,如:远程客户端的IP地址和用户名.这里我们来介绍以下几种实现方式: 通过向日志记录函数传递一个extra参数引入上下文信息 使用LoggerAdapters引入上下文信息 使用Filters引入上下文信息 一.通过向日志记录函数传递一个extra参数引入上下文信息 前面我们提到过,可以通过向日志记录函数传递一个extra参数来实现向日志输出

  • Python数组条件过滤filter函数使用示例

    使用filter函数,实现一个条件判断函数即可. 比如想过滤掉字符串数组中某个敏感词,示范代码如下: #filter out some unwanted tags def passed(item): try: return item != "techbrood" #can be more a complicated condition here except ValueError: return False org_words = [["this","is

  • python实现分析apache和nginx日志文件并输出访客ip列表的方法

    本文实例讲述了python实现分析apache和nginx日志文件并输出访客ip列表的方法.分享给大家供大家参考.具体如下: 这里使用python分析apache和nginx日志文件输出访客ip列表 ips = {} fh = open("/var/log/nginx/access.log", "r").readlines() for line in fh: ip = line.split(" ")[0] if 6 < len(ip) &l

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

    事情是这样的,我写了一个tornado的服务,过程当中我用logging记录一些内容,由于一开始并没有仔细观察tornado自已的日志管理,所以我就一般用debug来记录普通日志,error记录有问题的日志,但是当服务跑起来以后才发现,tornado的访问日志的级别是info,也就是20,debug是10的,所以如果我定义了日志的级别是debug,那么默认情况下肯定也会输出到日志文件中的. 但是我现在并不关心访问日志,而且由于我这个服务可能每时每刻都会有访问,这样在我对日志信息进行搜索的时候就会

  • python中使用print输出中文的方法

    看Python简明教程,学习使用print打印字符串,试了下打印中文,不行. 编辑环境:IDLE 上网搜了下解决办法,各种说法,试了两种: print u"学习" print (unicode("学习", encoding="utf-8")) 保存时均还是会提示 shell输出: ѧϰ ѧϰ 说明第二种还是有编码但还是不对. 最后,加上最前面一行就好了,虽然现在还不明白第一行为什么,不是说#是注释么... # encoding: utf-8

  • Python中logger日志模块详解

    1 logging模块简介 logging模块是Python内置的标准模块,主要用于输出运行日志,可以设置输出日志的等级.日志保存路径.日志文件回滚等:相比print,具备如下优点: 可以通过设置不同的日志等级,在release版本中只输出重要信息,而不必显示大量的调试信息: print将所有信息都输出到标准输出中,严重影响开发者从标准输出中查看其它数据:logging则可以由开发者决定将信息输出到什么地方,以及怎么输出: Logger从来不直接实例化,经常通过logging模块级方法(Modu

  • Python中logging日志库实例详解

    logging的简单使用 用作记录日志,默认分为六种日志级别(括号为级别对应的数值) NOTSET(0) DEBUG(10) INFO(20) WARNING(30) ERROR(40) CRITICAL(50) special 在自定义日志级别时注意不要和默认的日志级别数值相同 logging 执行时输出大于等于设置的日志级别的日志信息,如设置日志级别是 INFO,则 INFO.WARNING.ERROR.CRITICAL 级别的日志都会输出. |2logging常见对象 Logger:日志,

  • Python中logging日志记录到文件及自动分割的操作代码

    日志作为项目开发和运行中必备组件,python提供了内置的logging模块来完成这个工作:借助 TimedRotatingFileHandler 可以按日期自动分割日志,自动保留日志文件数量等,下面是对日志的一个简单封装和测试. import logging import os from logging import handlers class Logger(object): # 日志级别关系映射 level_relations = { 'debug': logging.DEBUG, 'in

  • Python中logging日志的四个等级和使用

    1. logging日志的介绍 在现实生活中,记录日志非常重要,比如:银行转账时会有转账记录:飞机飞行过程中,会有个黑盒子(飞行数据记录器)记录着飞机的飞行过程,那在咱们python程序中想要记录程序在运行时所产生的日志信息,怎么做呢? 可以使用 logging 这个包来完成 记录程序日志信息的目的是: 1. 可以很方便的了解程序的运行情况 2. 可以分析用户的操作行为.喜好等信息 3. 方便开发人员检查bug 2. logging日志级别介绍 日志等级可以分为5个,从低到高分别是: 1. DE

  • python中的格式化输出用法总结

    本文实例总结了python中的格式化输出用法.分享给大家供大家参考,具体如下: Python一共有两种格式化输出语法. 一种是类似于C语言printf的方式,称为 Formatting Expression >>> '%s %d-%d' % ('hello', 7, 1) 'hello 7-1' 另一种是类似于C#的方式,称为String Formatting Method Calls >>> '{0} {1}:{2}'.format('hello', '1', '7'

  • Python中format()格式输出全解

    格式化输出:format() format():把传统的%替换为{}来实现格式化输出 1.使用位置参数:就是在字符串中把需要输出的变量值用{}来代替,然后用format()来修改使之成为想要的字符串,位置参数就是把传统的%改为{},按照位置顺序自动进行替换 'My name is {},age:{}'.format('Anxc',18) 'My name is Anxc,age:18' 2.使用位置参数:在原有基础上,通过位置的改变来让替换的值根据位置改变(自我感觉没什么用,还不如第一个好用)

  • python中for循环输出列表索引与对应的值方法

    如下所示: list = ['a','b','c'] 想用for循环输出list的元素以及对应的索引. 代码及结果如下: 以上这篇python中for循环输出列表索引与对应的值方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

  • 在python中实现求输出1-3+5-7+9-......101的和

    第一种: i=0 sum=0 a=0 while i<102: if i>=1 and i%4==1: sum+=i elif i%2!=0 and i!=1: a=a+i i+=1 print(sum-a) 第二种: a=1 b=-3 sum1=0 sum2=0 while a<=101and b>=-99: sum1+=a sum2+=b a+=+4 b+=-4 print(sum1+sum2+101) 第三种: print(sum(range(1,102,4))-sum(ra

随机推荐