前沿拓展:
stream.sys
壓縮成zip文件上傳了。你自己解壓吧。
希望能解決你的問(wèn)題。
附件:stream.zip
作者:東東 yasking
來(lái)源:https://blog.yasking.org/a/python-logbook.html
Python 本身有l(wèi)ogging日志記錄模塊,之前發(fā)現(xiàn)了logbook這個(gè)包,介紹說(shuō)是替代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記錄的日志會(huì)以流輸出,這里指定sys.stdout也就是記錄到標(biāo)準(zhǔn)輸出,與print一樣
(一)可以使用 with來(lái)在一定作用域內(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
(二)也可以指定作用于整個(gè)應(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可以把日志記錄到文件,這也是最常見(jiàn)的方式
# -*- 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
日志就寫(xiě)到了 app.log文件
同時(shí)輸出到文件與STDOUT
同時(shí)把記錄輸出到多個(gè)地方可以方便查閱和記錄,初始化 Handler的時(shí)候設(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
另外,通過(guò) level可以設(shè)置日志級(jí)別,級(jí)別如下,從下到上級(jí)別越來(lái)越高,如level設(shè)置為INFO, 則除了DEBUG外都會(huì)記錄,設(shè)置不同的級(jí)別,搭配各種Handler可以讓日志的記錄更加靈活,上邊使用的log.info可以使用不同的記錄級(jí)別
級(jí)別說(shuō)明critical嚴(yán)重錯(cuò)誤,需要退出程序error錯(cuò)誤,但在可控范圍內(nèi)warning警告notice大多數(shù)情況下希望看到的記錄info大多數(shù)情況不希望看到的記錄debug調(diào)試程序的時(shí)候詳細(xì)輸出的記錄
MailHandler
和日志文件同樣重要的就是 MailHandler了,當(dāng)出現(xiàn)了比較嚴(yán)重錯(cuò)誤的時(shí)候就要發(fā)送郵寄進(jìn)行通知
詳細(xì)的文檔見(jiàn):
分別使用了 163和qq郵箱發(fā)送郵件測(cè)試,使用的郵箱需要開(kāi)啟**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中的用大括號(hào)的會(huì)進(jìn)行數(shù)值替換,Subject字段上邊的“和下邊需要空一行,這樣解析參數(shù)收到的郵件才會(huì)正確的顯示標(biāo)題
Record Processors
上邊發(fā)送郵件的例子,參數(shù)里面有一個(gè) record.extra[url],這個(gè)參數(shù)是可以自己指定的,比如編寫(xiě)WSGI的程序,處理URL,每一條記錄都希望記錄到訪問(wèn)者的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,才能進(jìn)行記錄,record類可以在這里找到,詳細(xì)參數(shù)見(jiàn)logbook.LogRecord
Output:
[2016-12-13 12:20:46] IP:127.0.0.1 ERROR: test: something error
日期格式
上邊在介紹的自定義日志格式的時(shí)候使用的時(shí)間是雖然指定了格式但是是 UTC格式,跟北京時(shí)間是差了8個(gè)小時(shí)的。所以需要設(shè)置讓它記錄本地的時(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
更過(guò)日期格式化的設(shè)置參看:api/utilities – logbook.set_datetime_format(datetime_format)
threadbound與applicationbound
從最開(kāi)始的例子來(lái)看,可以使用兩種方式來(lái)記錄日志,一種是在最開(kāi)始使用 push_*來(lái)激活,另一種是使用的時(shí)候用with構(gòu)造上下文,現(xiàn)在進(jìn)行一些補(bǔ)充
pushwithpoppush_applicationapplicationboundpop_applicationpush_threadthreadboundpop_threadboundpush_greenletgreenletboundpop_greenlet
使用 pop_*可以取消記錄的上下文
application作用于整個(gè)應(yīng)用,thread只針對(duì)當(dāng)前線程
handler = MyHandler
handler.push_application
# all here goes to that handler
handler.pop_application
消除嵌套
使用多個(gè)Handler的時(shí)候,使用 push_方式啟動(dòng)的上下文不會(huì)形成嵌套,但是使用with啟動(dòng)的上下文會(huì)形成嵌套,可以使用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)
])
使用的時(shí)候就只需要一個(gè) with來(lái)啟動(dòng)
with setup.threadbound:
log.info(‘something logging’)
logbook是個(gè)不錯(cuò)的包,記錄日志靈活方便,比自己包裝發(fā)送郵件方便了不少,整理了一些基本用法,還有不少值得學(xué)習(xí)的功能,暫時(shí)能用到的基本上就這么多,之后用到高級(jí)的功能再繼續(xù)研究補(bǔ)充。
題圖:pexels,CC0 授權(quán)。
拓展知識(shí):
stream.sys
你可以用冰刃試試(iceword)把**文件徹底刪除,http://www.crsky.com/soft/6947.html
stream.sys
開(kāi)機(jī)時(shí)多按幾次F8鍵進(jìn)安全模式殺毒
原創(chuàng)文章,作者:九賢生活小編,如若轉(zhuǎn)載,請(qǐng)注明出處:http://www.drmqd.com.cn/41537.html