久久亚洲精品国产精品_羞羞漫画在线版免费阅读网页漫画_国产精品久久久久久久久久久久_午夜dj免费观看在线视频_希崎杰西卡番号

stream.sys(streamsystem)

前沿拓展:

stream.sys

壓縮成zip文件上傳了。你自己解壓吧。
望能解決你的問題。
附件:stream.zip


stream.sys(streamsystem)

作者:東東 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,可以把日志記錄到標準輸出,文件,E-MAIL,甚至Twitter

StreamHandler

使用 StreamHandler記錄的日志會以流輸出,這里指定sys.stdout也就是記錄到標準輸出,與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嚴重錯誤,需要退出程序error錯誤,但在可控范圍內(nèi)warning警告notice大多數(shù)情況下希望看到的記錄info大多數(shù)情況不希望看到的記錄debug調(diào)試程序的時候詳細輸出的記錄

MailHandler

和日志文件同樣重要的就是 MailHandler了,當(dāng)出現(xiàn)了比較嚴重錯誤的時候就要發(fā)送郵寄進行通知

詳細的文檔見:

分別使用了 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ù)收到的郵件才會正確的顯示標題

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類可以在這里找到,詳細參數(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://www.cddhlm.com/41537.html