您好,登錄后才能下訂單哦!
小編這次要給大家分享的是如何使用Python日志logging模塊,文章內容豐富,感興趣的小伙伴可以來了解一下,希望大家閱讀完這篇文章之后能夠有所收獲。
logging模塊的介紹:
基本 | 中文意義 | 觸發情況 |
DEBUG | 調試 | 調試時期 |
INFO | 提示 | 正常運行時 |
WARINING | 警告 | 現在可運行,但未來可能發生錯誤時(例如未來存儲空間可能不足) |
ERROR | 錯誤 | 當程序發生錯誤,無法執行某些功能時 |
CRITICAL | 嚴重的、致命的 | 當程序發生嚴重錯誤,無法繼續運行時 |
默認是WARNING。
這個表述可能不是很清晰,但意義類似程序報錯信息,(假如)普通的異常信息只有一個報錯原因,(那么為了方便觀看)可能還需要一些如錯誤地點,錯誤事件等信息,而這些附加的統一的時間不應該由生產錯誤信息的部分來添加(可能有很多個模塊),而應該將這個信息給專門做這事的部分來處理(交個formatter來處理)。
1.支持普通字符串%格式化,例如:
logging.info('Started %s'%tag)
2.支持普通字符串format格式化,例如:
logging.info('{} started '.format(tag))
3.logging自帶的,例如:
logging.info('%s start in', tag) logging.info('%s start in %s',tag,address)
根據不同的style,可以使用%(message)s或{message}或$message類似的格式來標注指定位置使用指定信息來取代。
%(asctime)s
%(funcName)s
%(levelname)s
%(message)s
%(lineno)d
%(module)s
%(name)s
官方文檔:
https://docs.python.org/3.6/library/logging.html
設置format中特殊字符asctime(日期時間)的輸出格式
使用自己想要的分隔符和順序來定義日期時間的格式,例如:
datefmt='%m/%d/%Y %I:%M:%S %p'
不使用format的:
import logging def show(): print("wechat running...") return "wechat" def main(): logging.basicConfig(filename='myapp.log', level=logging.INFO) tag=show() logging.info('Started %s'%tag) logging.info('Finished %s'%tag) if __name__ == '__main__' : main()
使用format和datefmt的:
import logging def show(): print("wechat running...") return "wechat" def main(): logging.basicConfig(filename='myapp.log', format='%(asctime)s %(message)s', datefmt='%m/%d/%Y %I:%M:%S %p',level=logging.INFO) tag=show() logging.info('%s start in', tag) logging.info('%s Finished',tag) if __name__ == '__main__' : main()
PS:雖然上面沒有說到logger對象,handler對象(默認方向是標準輸出流),formatter對象,但實際上,它是有默認的。不要因為默認值而搞錯。所以不建議混雜基礎版的和擴展版的使用。
import logging
logger = logging.getLogger("AppName")
【這里根據不同的名字定義不同的logger對象,默認為root。】
在模塊中使用時,官方文檔中有一個這樣的代碼,有點意思:
logger = logging.getLogger(__name__)
logger.setlevel()
例如:
logger.setLevel(logging.INFO)
handler用于處理日志信息的輸出方向,可以添加多個handler,代表同時向多個方向輸出信息
輸出方向為文件,使用FileHandler,例如:
logging.FileHandler("test.log")
輸出方向為流,使用StreamHandler,例如:
logging.StreamHandler(sys.stdout)
PS:想了解更多Handler,可以自己查看官方文檔https://docs.python.org/3.6/howto/logging.html
例如:
logger.addHandler(handler)
例如:
logger.removeHandler(handler)
5.定義handler的輸出格式formatter并綁定到handler上,formatter的設置方法類似上面基礎使用中的format:
例如:
formatter = logging.Formatter('%(asctime)s %(levelname)s: %(message)s')
handler.setFormatter(formatter) 或handler.formatter=formatter
6.將handle綁定到logger對象上。
logger.addHandler(file_handler) logger.addHandler(console_handler)
7.輸出日志:
調試級別: logger.debug(信息)
提示級別: logger.info(信息)
警告級別: logger.warn(信息)
錯誤級別:
logger.error(信息)
logger.exception(信息)【與error不同的是,還附帶堆棧信息,一般用在發生異常時】
嚴重級別:
logger.fatal(信息) 【fatal是critical的別名】
logger.critical(信息)
import logging def demo(): #獲取logger對象 logger=logging.getLogger("WeChat") #設置日志等級 logger.setLevel(logging.DEBUG) #創建綁定handler handler=logging.FileHandler('wechat.log') logger.addHandler(handler) # 創建綁定formatter formatter = logging.Formatter('%(asctime)s %(levelname)s: %(message)s') formatter.datefmt = '%m/%d/%Y %I:%M:%S %p' #可選的 handler.setFormatter(formatter) #嘗試輸出錯誤信息 logger.debug("debug message") logger.info("info message") logger.warning("warining message") logger.error("error message") logger.critical("critical message") if __name__=="__main__" : demo()
使用方法1:建立子類
下面的例子可能不是很符合應用,僅用于舉例:
過濾非允許用戶的日志信息:
import logging import sys class ContextFilter(logging.Filter): def filter(self, record): if record.role=="admin" : return True else: return False if __name__ == '__main__': logger=logging.getLogger("Wechat") logger.setLevel(logging.DEBUG) handler=logging.StreamHandler(sys.stdout) formatter=logging.Formatter('%(asctime)s %(levelname)s: %(message)s Role: %(role)s') handler.setFormatter(formatter) logger.addHandler(handler) #創建綁定fiter f = ContextFilter() logger.addFilter(f) logger.info('An info message with %s', 'some parameters',extra={"role":"admin"}) logger.info('An info message with %s', 'some parameters',extra={"role":"hacker"})#hacker的被過濾掉了
官網版的加信息版本:
import logging from random import choice class ContextFilter(logging.Filter): """ This is a filter which injects contextual information into the log. Rather than use actual contextual information, we just use random data in this demo. """ USERS = ['jim', 'fred', 'sheila'] IPS = ['123.231.231.123', '127.0.0.1', '192.168.0.1'] def filter(self, record): record.ip = choice(ContextFilter.IPS) record.user = choice(ContextFilter.USERS) return True if __name__ == '__main__': levels = (logging.DEBUG, logging.INFO, logging.WARNING, logging.ERROR, logging.CRITICAL) logging.basicConfig(level=logging.DEBUG, format='%(asctime)-15s %(name)-5s %(levelname)-8s IP: %(ip)-15s User: %(user)-8s %(message)s') a1 = logging.getLogger('a.b.c') a2 = logging.getLogger('d.e.f') f = ContextFilter() a1.addFilter(f) a2.addFilter(f) a1.debug('A debug message') a1.info('An info message with %s', 'some parameters') for x in range(10): lvl = choice(levels) lvlname = logging.getLevelName(lvl) a2.log(lvl, 'A message at %s level with %d %s', lvlname, 2, 'parameters')
使用方法2:使用filter函數
python3.2后,可以使用filter函數來做到上面方法1的效果
例子1:
import logging import sys def myfilter(record): if record.role == "admin": return True else: return False if __name__ == '__main__': logger=logging.getLogger("Wechat") logger.setLevel(logging.DEBUG) handler=logging.StreamHandler(sys.stdout) formatter=logging.Formatter('%(asctime)s %(levelname)s: %(message)s Role: %(role)s') handler.setFormatter(formatter) logger.addHandler(handler) #創建綁定fiter f = logging.Filter() f.filter=myfilter logger.addFilter(f) logger.info('An info message with %s', 'some parameters',extra={"role":"admin"}) logger.info('An info message with %s', 'some parameters',extra={"role":"hacker"})#hacker的被過濾掉了
例子2,利用lambda:
logger=logging.getLogger("Wechat") logger.setLevel(logging.DEBUG) handler=logging.StreamHandler(sys.stdout) formatter=logging.Formatter('%(asctime)s %(levelname)s: %(message)s Role: %(role)s') handler.setFormatter(formatter) logger.addHandler(handler) #創建綁定fiter # f = ContextFilter() f = logging.Filter() f.filter=lambda record: record.role=="admin" logger.addFilter(f) logger.info( 'An info message with %s', 'some parameters',extra={"role":"admin"}) logger.info('An info message with %s', 'some parameters',extra={"role":"hacker"})#hacker的被過濾掉了
注意:logging默認使用的logger對象叫做root
config文件配置方式:
import logging import logging.config logging.config.fileConfig('logging.conf') # create logger logger = logging.getLogger('simpleExample') # 'application' code logger.debug('debug message') logger.info('info message') logger.warn('warn message') logger.error('error message') logger.critical('critical message')
文件內容:
[loggers] keys=root,simpleExample [handlers] keys=consoleHandler [formatters] keys=simpleFormatter [logger_root] level=DEBUG handlers=consoleHandler [logger_simpleExample] level=DEBUG handlers=consoleHandler qualname=simpleExample propagate=0 [handler_consoleHandler] class=StreamHandler level=DEBUG formatter=simpleFormatter args=(sys.stdout,) [formatter_simpleFormatter] format=%(asctime)s - %(name)s - %(levelname)s - %(message)s datefmt=
PS:也支持YAML方式,這里不講述
如果留意到過濾器例子的話,你可以發現
輸出信息時,附加一個參數extra,附加的參數可以被formatter使用
import logging import sys class ContextFilter(logging.Filter): def filter(self, record): if record.role=="admin" : return True else: return False if __name__ == '__main__': logger=logging.getLogger("Wechat") logger.setLevel(logging.DEBUG) handler=logging.StreamHandler(sys.stdout) formatter=logging.Formatter('%(asctime)s %(levelname)s: %(message)s Role: %(role)s') handler.setFormatter(formatter) logger.addHandler(handler) #創建綁定fiter f = ContextFilter() logger.addFilter(f) logger.info('An info message with %s', 'some parameters',extra={"role":"admin"}) logger.info('An info message with %s', 'some parameters',extra={"role":"hacker"})#hacker的被過濾掉了
看完這篇關于如何使用Python日志logging模塊的文章,如果覺得文章內容寫得不錯的話,可以把它分享出去給更多人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。