使用Filter過濾python中的日志輸出的實現(xiàn)方法
事情是這樣的,我寫了一個tornado的服務(wù),過程當中我用logging記錄一些內(nèi)容,由于一開始并沒有仔細觀察tornado自已的日志管理,所以我就一般用debug來記錄普通日志,error記錄有問題的日志,但是當服務(wù)跑起來以后才發(fā)現(xiàn),tornado的訪問日志的級別是info,也就是20,debug是10的,所以如果我定義了日志的級別是debug,那么默認情況下肯定也會輸出到日志文件中的。
但是我現(xiàn)在并不關(guān)心訪問日志,而且由于我這個服務(wù)可能每時每刻都會有訪問,這樣在我對日志信息進行搜索的時候就會有很大的影響。
該怎么辦呢?
有以下幾種辦法
修改初始化日志時的級別
一種是修改我初始化時定義的日志級別,定成比info還高的,這樣就不會再記錄info的日志了
但是這種方法需要我將之前記錄日志的 debug 方法也要修改為比info更高的級別,也就是要大于20。修改的地方有點多,且我已經(jīng)習(xí)慣了用 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的實現(xiàn),想想都復(fù)雜,而且直接修改site-packes里的庫文件是一個比較笨的方法,日后遷移會發(fā)生很多莫名其妙的問題。
使用logging.Filter設(shè)置過濾規(guī)則
其實logging早就有了相應(yīng)的解決方法,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用法
#第一個參數(shù)是一個返回bool值的一般函數(shù)或lambda函數(shù),第二個參數(shù)是一個可迭代對象 #最后返回一個可迭代對象,可以通過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]
總結(jié)
以上所述是小編給大家介紹的使用Filter過濾python中的日志輸出,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!
相關(guān)文章
Python打包文件執(zhí)行報錯:ModuleNotFoundError: No module 
這篇文章給大家介紹了Python打包文件執(zhí)行報錯:ModuleNotFoundError: No module named ‘pymssql‘的解決方法,如果有遇到相同問題的朋友可以參考閱讀一下本文2023-10-10如何在keras中添加自己的優(yōu)化器(如adam等)
這篇文章主要介紹了在keras中實現(xiàn)添加自己的優(yōu)化器(如adam等)方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-06-06解決pyinstaller打包exe可執(zhí)行文件后運行找不到pandas或者XXX模塊
這篇文章主要介紹了解決pyinstaller打包exe可執(zhí)行文件后運行找不到pandas或者XXX模塊問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-11-11Django 解決新建表刪除后無法重新創(chuàng)建等問題
這篇文章主要介紹了Django 解決新建表刪除后無法重新創(chuàng)建等問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-05-05解決Python保存文件名太長OSError: [Errno 36] File
這篇文章主要介紹了解決Python保存文件名太長OSError: [Errno 36] File name too lon問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-05-05python定時任務(wù)apscheduler的詳細使用教程
APScheduler的全稱是Advanced?Python?Scheduler,它是一個輕量級的?Python定時任務(wù)調(diào)度框架,下面這篇文章主要給大家介紹了關(guān)于python定時任務(wù)apscheduler的詳細使用教程,需要的朋友可以參考下2022-02-02