使用Filter過濾python中的日志輸出的實(shí)現(xiàn)方法
事情是這樣的,我寫了一個(gè)tornado的服務(wù),過程當(dāng)中我用logging記錄一些內(nèi)容,由于一開始并沒有仔細(xì)觀察tornado自已的日志管理,所以我就一般用debug來記錄普通日志,error記錄有問題的日志,但是當(dāng)服務(wù)跑起來以后才發(fā)現(xiàn),tornado的訪問日志的級(jí)別是info,也就是20,debug是10的,所以如果我定義了日志的級(jí)別是debug,那么默認(rèn)情況下肯定也會(huì)輸出到日志文件中的。
但是我現(xiàn)在并不關(guān)心訪問日志,而且由于我這個(gè)服務(wù)可能每時(shí)每刻都會(huì)有訪問,這樣在我對(duì)日志信息進(jìn)行搜索的時(shí)候就會(huì)有很大的影響。
該怎么辦呢?
有以下幾種辦法
修改初始化日志時(shí)的級(jí)別
一種是修改我初始化時(shí)定義的日志級(jí)別,定成比info還高的,這樣就不會(huì)再記錄info的日志了
但是這種方法需要我將之前記錄日志的 debug 方法也要修改為比info更高的級(jí)別,也就是要大于20。修改的地方有點(diǎn)多,且我已經(jīng)習(xí)慣了用 debug 來記錄,改起來成本有點(diǎn)大。
修改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的級(jí)別,然后再修改log_request的實(shí)現(xiàn),想想都復(fù)雜,而且直接修改site-packes里的庫文件是一個(gè)比較笨的方法,日后遷移會(huì)發(fā)生很多莫名其妙的問題。
使用logging.Filter設(shè)置過濾規(guī)則
其實(shí)logging早就有了相應(yīng)的解決方法,logging庫中有一個(gè)Filterer類,logging庫中的Handler和Logger類都是繼承自Filter類的
Filter類中有三個(gè)方法, addFilter(filter) , removeFilter(filter) 和 filter(record) 方法,這里主要使用addFilter和filter方法。
addFilter方法需要一個(gè)filter對(duì)象,這里我定義一個(gè)新的類,并且重寫filter方法,
將日志名為 tornado.access 且日志級(jí)別是20的過濾掉。
class NoParsingFilter(logging.Filter):
def filter(self, record):
if record.name == 'tornado.access' and record.levelno == 20:
return False
return True
這樣我在初始化 logging對(duì)象以后,將這個(gè)過濾器添加進(jìn)去
logobj = logging.getLogger('server')
logobj.addFilter(NoParsingFilter())
這樣添加一個(gè)過濾以后日志就會(huì)隨心所欲的按照自已的方式來記錄了,record也是logging的一個(gè)類 LogRecord ,常用的屬性有 name, level, pathname, lineno,msg, args, exc_info
name 就是初始化logger對(duì)象時(shí)傳入的名字
level 是級(jí)別
pathname 是哪個(gè)文件輸出的這行日志
lineno 是行號(hào)
msg 是日志本身
ps:下面看下python中過濾器filter用法
#第一個(gè)參數(shù)是一個(gè)返回bool值的一般函數(shù)或lambda函數(shù),第二個(gè)參數(shù)是一個(gè)可迭代對(duì)象 #最后返回一個(gè)可迭代對(duì)象,可以通過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中的日志輸出,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
如果你覺得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!
相關(guān)文章
Python GUI編程學(xué)習(xí)筆記之tkinter界面布局顯示詳解
這篇文章主要介紹了Python GUI編程學(xué)習(xí)筆記之tkinter界面布局顯示,結(jié)合實(shí)例形式分析了Python GUI編程中tkinter界面布局顯示的相關(guān)操作技巧與使用注意事項(xiàng),需要的朋友可以參考下2020-03-03
Pycharm社區(qū)版創(chuàng)建Flask項(xiàng)目的實(shí)現(xiàn)步驟
本文主要介紹了Pycharm社區(qū)版創(chuàng)建Flask項(xiàng)目,包括設(shè)置Python環(huán)境、安裝Flask庫以及創(chuàng)建基本的項(xiàng)目結(jié)構(gòu),具有一定的參考價(jià)值,感興趣的可以了解一下2024-06-06
Python小白學(xué)習(xí)爬蟲常用請(qǐng)求報(bào)頭
在本篇文章里小編給大家整理了關(guān)于Python小白學(xué)習(xí)爬蟲常用請(qǐng)求報(bào)頭的相關(guān)知識(shí)點(diǎn),需要的朋友們可以學(xué)習(xí)下。2020-06-06
Python?Web開發(fā)通信協(xié)議WSGI?uWSGI?uwsgi使用對(duì)比全面介紹
這篇文章主要為大家介紹了Python?Web開發(fā)通信協(xié)議WSGI?uWSGI?uwsgi使用對(duì)比全面介紹,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12
Python+Turtle實(shí)現(xiàn)繪制勾股樹
畢達(dá)哥拉斯樹,也叫“勾股樹”,是由畢達(dá)哥拉斯根據(jù)勾股定理所畫出來的一個(gè)可以無限重復(fù)的樹形圖形。本文將利用Python中的Turtle庫實(shí)現(xiàn)勾股樹的繪制,感興趣的可以了解一下2023-01-01
pandas 實(shí)現(xiàn)字典轉(zhuǎn)換成DataFrame的方法
今天小編就為大家分享一篇pandas 實(shí)現(xiàn)字典轉(zhuǎn)換成DataFrame的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-07-07

