Python_logging模块
日志:方便用戶了解系統、軟件或應用的運行情況,及時發現問題并快速定位、解決問題。
一個日志信息對應的是一個事件的發生,而一個事件需要包括的幾個內容:
- 事件發生時間
- 事件發生位置
- 事件發生嚴重程度(日志級別)
- 事件內容
還可以包括其他信息如:ID,進程名稱,線程ID,線程名稱等
logging模塊日志等級(日志等級依次升高,日志信息量依次減少):
注:logging模塊中,程序指定一個日志級別后,應用程序只會記錄并輸出大于或者等于該指定日志級別的日志信息,小于該等級的日志記錄將會被丟棄
?1.logging模塊定義的模塊級別的常用函數
| logging.debug(msg,*args,**kwargs) | 創建一條嚴重級別為DEBUG的日志記錄 |
| logging.info(msg,*args,**kwargs) | 創建一條嚴重級別為INFO的日志記錄 |
| logging.warning(msg,*args,**kwargs) | 創建一條嚴重級別為WARNING的日志記錄 |
| logging.error(msg,*args,**kwargs) | 創建一條嚴重級別為ERROR的日志記錄 |
| logging.critical(msg,*args,**kwargs) | 創建一條嚴重級別為CRITICAL的日志記錄 |
| logging.log(level,*args,**kwargs) | 創建一條嚴重級別為level的日志記錄 |
| logging.basicConfig(**kwargs) | 對“要記錄的日志級別”、“日志格式”、“日志輸出位置”、“日志文件打開模式”等信息進行一次性配置 ? ? ? ? ? ? ? |
注:日志記錄函數只打印級別比日志器設置的級別高的日志記錄,而比日志器設置的級別低的日志記錄將會被丟棄
其中,logging.debug(),logging.info()等方法的定義中,**kwargs參數支持3個關鍵字參數
| exc_info: ?布爾值,若為True,則會將異常信息添加到日志消息中,如果沒有異常信息則添加None到日志信息中 | |
| stack_info: ?布爾值, 默認為False,若為True,棧信息將會被添加到日志信息中 | |
| extra: ?字典(dict)參數,用于自定義消息格式中所包含的字段,但它的key不能和logging模塊定義的字段沖突 |
?logging.basicConfig()函數
?可接收的關鍵字參數:
| filename | 指定日志輸出目標文件的文件名,指定該設置項后日志信息不會被輸出到控制臺 |
| filemode | 指定日志文件的打開模式,默認為“a”,注:只有filename指定時該選項才有效 |
| format | 指定日志輸出時所包含的字段信息以及它們的順序,即指定日志格式字符串 |
| datefmt | 指定日期/時間格式,注:只有format中包含時間字段%(asctime)時該選項才有效 |
| level | 指定日志器的日志級別 |
| stream | 指定日志輸出目標流,如sys.stdout等,注:stream和filename不能同時提供,否則會報錯 |
| style | 指定format格式字符串的風格,可取值為‘%’、‘{’和‘$’,默認為‘%’ |
| dandlers | 指定該選項,則創建多個Headler的可迭代對象,都將會被添加到根日志下,注:filename、stream和handlers只能存在一個 |
注:logging.basecConfig()只有第一次調用該函數才會起作用,
實例:
logging.basicConfig(filename='example.log', level=logging.INFO, format='%(asctime)s %(message)s', datefmt='%Y-%m-%d %H:%M:%S') # basicConfig()對打印的日志信息進行一次性配置 logging.debug("debug ") logging.info("info ") logging.warning("waring ") example 2018-10-13 17:22:52 info 2018-10-13 17:22:52 waring result?2.logging模塊相關類
1>.logger類:日志器,提供了應用程序可一直使用的接口
常用的配置方法:
| Logger.setLevel() | 設置日志器將會處理的日志消息的最低嚴重級別,小于設置的最低嚴重級別的級別消息將會被丟棄 |
| Logger.addHandler() 和 Logger.removeHandler() | 為該Logger對象添加 和 移除一個Handler對象 |
| Logger.addFilter() 和 Logger.removeFilter() | 為該Logger對象添加 和 移除一個Filter對象 |
配置完成后,創建日志記錄的方法:
| Logger.debug(), Logger.info(), Logger.warning(), Logger.error(), Logger.critical() | 創建一個與它們的方法名對應級別的日志記錄 |
| Logger.exception() | 創建一個類似與Logger.error()的日志消息,但它將會多輸出堆棧追蹤信息,通常只是在exception handler中調用該方法 |
| Logger.log() | 需要獲取一個明確的日志level參數來創建一個日志記錄 |
其中,logging.getLogger()方法有一個可選參數name,該參數表示將要返回的日志器的名稱標識,如果不提供該參數,則其值默認為root,若以相同的name參數多次調用getLogger方法,將會返回指向同一個logger對象的引用
2>.Handler類:處理器,將logger創建的日志記錄發送到合適的目的輸出
相關配置方法:(內建handler對象)
| Handler.setLevel() | 設置handler將會處理的日志消息的最低嚴重級別 |
| Handler.setFormatter() | 為handler設置一個格式器對象 |
| Handler.addFilter() 和 Handler.removeFilter() | 為handler添加 和 刪除一個過濾器對象 |
常用的Handler接口:
| logging.StreamHandler | 將日志消息發送到輸出到Stream(流),如std.out,std.err或任何file-like對象 |
| logging.FileHandler | 將日志消息發送到磁盤文件,默認情況下文件大小會無限增長 |
| logging.handlers.RotatingFileHandler | 將日志消息發送到磁盤文件,并支持日志文件按大小切割 |
| logging.handlers.HTTPHandler | 將日志消息以GET或POST的方式發送給一個HTTP服務器 |
| logging.handlers.SMTPHandler | 將日志消息發送給一個指定的email地址 |
| logging.NullHandler | 該Handler實例會忽略error messages通常被想使用logging的library開發者使用來避免“No handlers could be found for logger XXX”信息出現 |
3>.Filter類:過濾器,提供了更細粒度的控制工具來決定輸出那一條日志記錄,丟棄那一條日志記錄
logging.Filter(name=‘ ’):若name的值為空字符串,則允許所有的日志事件通過過濾
filter(record):用于具體控制傳遞的record記錄是否能通過過濾,返回值為0表示不能通過過濾,返回值非零表示可以通過過濾
?注:在filter()方法內部改變record可以添加、刪除或修改一些屬性
?4>.Formatter 類:格式器,決定日志記錄的最終輸出格式
Formatter類的構造方法:
logging.Formatter.__init__(fmt=None,datefmt=None,style="%")- fmt: 指定消息格式化字符串,如果不指定該參數則默認使用message的原始值
- datefmt:指定日期格式字符串,如果不指定該參數則默認使用“%Y-%m-%d %H: %M: %S”
- ?style:可取值為‘%’,‘{’和‘$’,如果不指定默認使用‘%’
實例:把日志同時打印到屏幕和文件里
import logginglogger = logging.getLogger('Test_log') # 生成logger對象 logger.setLevel(logging.DEBUG) # 這里的debug為全局的控制級別,優先級最高 ch = logging.StreamHandler() # 屏幕輸出 ch.setLevel(logging.DEBUG) # 級別為debug,注釋了也打印debug級別,因為全局的為debug fh = logging.FileHandler('text.log') # 把日志寫在文件里 fh.setLevel(logging.WARNING) # 級別為warning formatter = logging.Formatter('%(asctime)s-%(name)s-%(levelname)s-%(message)s')ch.setFormatter(formatter) # 把格式賦給屏幕 fh.setFormatter(formatter) # 把格式賦給文件 logger.addHandler(ch) logger.addHandler(fh)logger.debug('debug message') logger.info('info message') logger.warn('warn message') logger.error('error message') logger.critical('critical message') example 2018-10-13 17:41:14,159-Test_log-DEBUG-debug message 2018-10-13 17:41:14,159-Test_log-INFO-info message 2018-10-13 17:41:14,159-Test_log-WARNING-warn message 2018-10-13 17:41:14,159-Test_log-ERROR-error message 2018-10-13 17:41:14,159-Test_log-CRITICAL-critical message 屏幕結果 2018-10-13 17:41:40,072-Test_log-WARNING-warn message 2018-10-13 17:41:40,072-Test_log-ERROR-error message 2018-10-13 17:41:40,072-Test_log-CRITICAL-critical message 文件里結果3.logging模塊定義的字符串字段(在format格式字符串中的字段)
| 屬性名 | 使用格式 | ? |
| asctime | %(asctime)s | 日志事件發生的時間,如:2018-10-13 17:46:45 |
| create | %(created)f | 日志事件發生的時間--時間戳 |
| relativeCreated | %(relativeCreated)d | 日志事件發生的時間相對與logging模塊加載時間的相對毫秒數 |
| msecs | %(msecs)d | 日志事件發生時間的毫秒部分 |
| levelname | %(levelname)s | 該日志記錄的文字形式的日子級別 |
| levelno | %(levelno)s | 該日志記錄的數字形式 |
| name | %(name)s | 所使用的日志器名稱,默認為root,因為默認使用的是rootLogger |
| message | %(message)s | 日志記錄的文本內容(用戶輸出的消息),通過 msg%args 計算得到 |
| pathname | %(pathname)s | 調用日志輸出函數(記錄函數)的模塊的完整路徑名,可能沒有 |
| filename | %(filename)s | 調用日志輸出函數(記錄函數)的模塊的文件名,包含文件后綴 |
| module | %(module)s | 調用日志輸出函數(記錄函數)的模塊名 |
| funcName | %(funcName)s | 調用日志輸出函數(記錄函數)的函數名 |
| lineno | %(lineno)s | 調用日志輸出函數(記錄函數)的語句所在的代碼行號 |
| process | %(process)d | 進程ID |
| processName | %(processName)s | 進程名稱,Python3.1新增 |
| thread | %(thread)d | 線程ID |
| threadName | %(thread)s | 線程名稱 |
?
?
?
?
參考筆記:https://www.cnblogs.com/yyds/p/6901864.html
轉載于:https://www.cnblogs.com/Vera-y/p/9786649.html
總結
以上是生活随笔為你收集整理的Python_logging模块的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: double salary = wage
- 下一篇: 试除法的妙用【O(√N) 复杂度】