久久亚洲精品国产精品_羞羞漫画在线版免费阅读网页漫画_国产精品久久久久久久久久久久_午夜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這個(gè)包,介紹說是替代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來在一定作用域內(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可以把日志記錄到文件,這也是最常見的方式

# -*- 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文件

同時(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

另外,通過 level可以設(shè)置日志級(jí)別,級(jí)別如下,從下到上級(jí)別越來越高,如level設(shè)置為INFO, 則除了DEBUG外都會(huì)記錄,設(shè)置不同的級(jí)別,搭配各種Handler可以讓日志的記錄更加靈活,上邊使用的log.info可以使用不同的記錄級(jí)別

級(jí)別說明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ì)的文檔見:

分別使用了 163和qq郵箱發(fā)送郵件測(cè)試,使用的郵箱需要開啟**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ù)是可以自己指定的,比如編寫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,才能進(jìn)行記錄,record類可以在這里找到,詳細(xì)參數(shù)見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

更過日期格式化的設(shè)置參看:api/utilities – logbook.set_datetime_format(datetime_format)

threadbound與applicationbound

從最開始的例子來看,可以使用兩種方式來記錄日志,一種是在最開始使用 push_*來激活,另一種是使用的時(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來啟動(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

開機(jī)時(shí)多按幾次F8鍵進(jìn)安全模式殺毒

原創(chuàng)文章,作者:九賢生活小編,如若轉(zhuǎn)載,請(qǐng)注明出處:http://www.cddhlm.com/41537.html