前沿拓展:
stream.sys
壓縮成zip文件上傳了。你自己解壓吧。
希望能解決你的問題。
附件:stream.zip
作者:東東 yasking
來源:https://blog.yasking.org/a/python-logbook.html
Python 本身有l(wèi)ogging日志記錄模塊,之前發(fā)現(xiàn)了logbook這個包,介紹說是替代logging,索性整理一下,方便之后使用
>>> from logbook import Logger, StreamHandler
>>> import sys
>>> StreamHandler(sys.stdout).push_application
>>> log = Logger(‘Logbook’)
>>> log.info(‘Hello, World!’)
[2015-10-05 18:55:56.937141] INFO: Logbook: Hello, World!
上邊這是文檔中給出的例子,它定義了許多的Handler,可以把日志記錄到標(biāo)準(zhǔn)輸出,文件,E-MAIL,甚至Twitter
StreamHandler
使用 StreamHandler記錄的日志會以流輸出,這里指定sys.stdout也就是記錄到標(biāo)準(zhǔn)輸出,與print一樣
(一)可以使用 with來在一定作用域內(nèi)記錄日志
# -*- coding: utf-8 -*-
from logbook import Logger, StreamHandler
import logbook
import sys
handler = StreamHandler(sys.stdout)
log = Logger(‘test’)
def main:
log.info(‘something logging’)
if __name__ == ‘__main__’:
with handler.applicationbound:
main
(二)也可以指定作用于整個應(yīng)用
# -*- coding: utf-8 -*-
from logbook import Logger, StreamHandler
import logbook
import sys
handler = StreamHandler(sys.stdout)
handler.push_application
log = Logger(‘test’)
def main:
log.info(‘something logging’)
if __name__ == ‘__main__’:
main
FileHandler
使用 FileHandler可以把日志記錄到文件,這也是最常見的方式
# -*- coding: utf-8 -*-
from logbook import Logger, FileHandler
import logbook
import sys
handler = FileHandler(‘app.log’)
handler.push_application
log = Logger(‘test’)
def main:
log.info(‘something logging’)
if __name__ == ‘__main__’:
main
日志就寫到了 app.log文件
同時輸出到文件與STDOUT
同時把記錄輸出到多個地方可以方便查閱和記錄,初始化 Handler的時候設(shè)置bubble參數(shù)就可以使得其它Handler也可以接收到記錄
from logbook import Logger, StreamHandler, FileHandler
import logbook
import sys
”’
記錄日志到文件和STDOUT
”’
StreamHandler(sys.stdout, level=’DEBUG’).push_application
FileHandler(‘app.log’, bubble=True, level=’INFO’).push_application
log = Logger(‘test’)
def main:
log.info(‘hello world’)
if __name__ == ‘__main__’:
main
另外,通過 level可以設(shè)置日志級別,級別如下,從下到上級別越來越高,如level設(shè)置為INFO, 則除了DEBUG外都會記錄,設(shè)置不同的級別,搭配各種Handler可以讓日志的記錄更加靈活,上邊使用的log.info可以使用不同的記錄級別
級別說明critical嚴(yán)重錯誤,需要退出程序error錯誤,但在可控范圍內(nèi)warning警告notice大多數(shù)情況下希望看到的記錄info大多數(shù)情況不希望看到的記錄debug調(diào)試程序的時候詳細(xì)輸出的記錄
MailHandler
和日志文件同樣重要的就是 MailHandler了,當(dāng)出現(xiàn)了比較嚴(yán)重錯誤的時候就要發(fā)送郵寄進行通知
詳細(xì)的文檔見:
分別使用了 163和qq郵箱發(fā)送郵件測試,使用的郵箱需要開啟**TP權(quán)限,代碼如下(163和qq發(fā)送參數(shù)稍有不同)
# -*- coding: utf-8 -*-
from logbook import Logger, MailHandler
import logbook
import sys
sender = ‘Logger’
recipients = [‘dongdong@163.com’]
email_user = ‘dongdong@qq.com’
email_pass = ‘password’
mail_handler = MailHandler(sender, recipients,
server_addr=’**tp.qq.com’,
starttls=False,
secure = True,
credentials=(email_user, email_pass),
format_string=u”’
Subject: {record.level_name} on My Application
Message type: {record.level_name}
Location: {record.filename}:{record.lineno}
Module: {record.module}
Function: {record.func_name}
Time: {record.time:%Y-%m-%d %H:%M:%S}
Remote IP: {record.extra[ip]}
Request: {record.extra[url]} [{record.extra[method]}]
Message: {record.message}
”’,
bubble=True)
log = Logger(‘test’)
def main:
log.info(‘something logging’)
if __name__ == ‘__main__’:
with mail_handler.threadbound:
main
內(nèi)容 format_string中的用大括號的會進行數(shù)值替換,Subject字段上邊的“和下邊需要空一行,這樣解析參數(shù)收到的郵件才會正確的顯示標(biāo)題
Record Processors
上邊發(fā)送郵件的例子,參數(shù)里面有一個 record.extra[url],這個參數(shù)是可以自己指定的,比如編寫WSGI的程序,處理URL,每一條記錄都希望記錄到訪問者的IP,可以這樣做:
# -*- coding: utf-8 -*-
from logbook import Logger, StreamHandler, Processor
import logbook
import sys
handler = StreamHandler(sys.stdout)
handler.format_string = ‘[{{record.time:%Y-%m-%d %H:%M:%S}}] IP:{record.extra[ip]} {record.level_name}: {record.channel}: {record.message}’
handler.formatter
log = Logger(‘test’)
def inject_ip(record):
record.extra[‘ip’] = ‘127.0.0.1’
with handler.applicationbound:
with Processor(inject_ip).applicationbound:
log.error(‘something error’)
使用自定義參數(shù),需要重新設(shè)置 format_string,才能進行記錄,record類可以在這里找到,詳細(xì)參數(shù)見logbook.LogRecord
Output:
[2016-12-13 12:20:46] IP:127.0.0.1 ERROR: test: something error
日期格式
上邊在介紹的自定義日志格式的時候使用的時間是雖然指定了格式但是是 UTC格式,跟北京時間是差了8個小時的。所以需要設(shè)置讓它記錄本地的時間
在剛才的例子前面加上如下代碼即可
logbook.set_datetime_format(‘local’) # <= 新加入行
handler = StreamHandler(sys.stdout)
handler.format_string = ‘[{record.time:%Y-%m-%d %H:%M:%S}] IP:{record.extra[ip]} {record.level_name}: {record.channel}: {record.message}’
handler.formatter
更過日期格式化的設(shè)置參看:api/utilities – logbook.set_datetime_format(datetime_format)
threadbound與applicationbound
從最開始的例子來看,可以使用兩種方式來記錄日志,一種是在最開始使用 push_*來激活,另一種是使用的時候用with構(gòu)造上下文,現(xiàn)在進行一些補充
pushwithpoppush_applicationapplicationboundpop_applicationpush_threadthreadboundpop_threadboundpush_greenletgreenletboundpop_greenlet
使用 pop_*可以取消記錄的上下文
application作用于整個應(yīng)用,thread只針對當(dāng)前線程
handler = MyHandler
handler.push_application
# all here goes to that handler
handler.pop_application
消除嵌套
使用多個Handler的時候,使用 push_方式啟動的上下文不會形成嵌套,但是使用with啟動的上下文會形成嵌套,可以使用nested handler
import os
from logbook import NestedSetup, Handler, FileHandler,
MailHandler, Processor
def inject_information(record):
record.extra[‘cwd’] = os.getcwd
setup = NestedSetup([
# Handler避免stderr接受消息
Handler(),
FileHandler(‘application.log’, level=’WARNING’),
MailHandler(‘servererrors@example.com’, [‘admin@example.com’],
level=’ERROR’, bubble=True),
Processor(inject_information)
])
使用的時候就只需要一個 with來啟動
with setup.threadbound:
log.info(‘something logging’)
logbook是個不錯的包,記錄日志靈活方便,比自己包裝發(fā)送郵件方便了不少,整理了一些基本用法,還有不少值得學(xué)習(xí)的功能,暫時能用到的基本上就這么多,之后用到高級的功能再繼續(xù)研究補充。
題圖:pexels,CC0 授權(quán)。
拓展知識:
stream.sys
你可以用冰刃試試(iceword)把**文件徹底刪除,http://www.crsky.com/soft/6947.html
stream.sys
開機時多按幾次F8鍵進安全模式殺毒
原創(chuàng)文章,作者:九賢生活小編,如若轉(zhuǎn)載,請注明出處:http://xiesong.cn/41537.html