Python 日誌元件Logging 使用手札 (一)
1 題外話
雖然Python很火很火,可是我也是最近一年才開始用Python的,在此之前我是很堅定的Java黨的,不過現在用上了Python,突然覺得Python是很有魔性的,所以漸漸的也用了多了起來。
很久之前,還準備把Java學好之後就好好在學下C++的,不過感覺現在自己的興趣點完全不在於那一丟丟的效能了,而是在乎與更加簡潔、方便,以及最重要的,能追隨潮流的,所以我還是老實Java和Python好了。
為什麼要用到日誌呢,因為很多時候我們在程式中出了一點什麼問題,其實也還是希望能夠反映出來的,而如果只是單純的print的話,一是不直觀不方便,二是管理也不方便,所以就用相應的日誌元件好了。
2 logging
在Python 2.7當中,自帶的庫logging就可以作為最基本的日誌記錄組建,使用起來也很簡單,注意預設情況下logging的輸出等級是warning,下面我們來看第一個case:
# -*- coding:utf-8 -*-
import logging as LOG
def case_1():
'''
預設情況下logging僅僅顯示warning級別的日誌
其中級別是:CRITICAL > ERROR > WARNING > INFO > DEBUG > NOTSET
:return:
'''
LOG.debug('This is a debug message')
LOG.info('This is a info message')
LOG.warning('This is a warning message')
case_1()
而我們預期輸出的結果只是這樣的,因為預設只輸出warning等級的日誌
C:\Python27\python.exe C:/Users/72770/PycharmProjects/CamSonar/Log/LogTest.py
WARNING:root:This is a warning message
Process finished with exit code 0
而如果我們需要自定義日誌的訊息格式和內容時應該怎麼辦呢?畢竟這太簡單了,滿足不了我們的需求,對吧?
我們可以調整logging的引數,以達到自定義效果的方法,其中按照如下的方法
def case_2():
'''
使用basicConfig做引數配置
:return:
'''
LOG.basicConfig(level= LOG.DEBUG)
LOG.debug('This is a debug message')
LOG.info('This is a info message')
LOG.warning('This is a warning message')
如果這時候執行,我們就可以看到:
C:\Python27\python.exe C:/Users/72770/PycharmProjects/CamSonar/Log/LogTest.py
DEBUG:root:This is a debug message
INFO:root:This is a info message
WARNING:root:This is a warning message
Process finished with exit code 0
是不是比起之前來說,多了其他警告等級的資訊。
3 引數配置
很多情況下,我們需要連帶輸出時間啊,行號啊,這時候需要怎麼處理呢?其實方法很簡單,還是使用上文的那個配置方法,但是需要傳入更多的引數
def case_3():
'''
使用basicConfig做引數配置
:return:
'''
LOG.basicConfig(level=LOG.DEBUG,
format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
datefmt='%a, %d %b %Y %H:%M:%S')
LOG.debug('This is a debug message')
LOG.info('This is a info message')
LOG.warning('This is a warning message')
在這裡,我們使用了format去規定了其輸出的格式,並且指定了相應的時間輸出格式。
C:\Python27\python.exe C:/Users/72770/PycharmProjects/CamSonar/Log/LogTest.py
Mon, 11 Jul 2016 20:42:08 LogTest.py[line:34] DEBUG This is a debug message
Mon, 11 Jul 2016 20:42:08 LogTest.py[line:35] INFO This is a info message
Mon, 11 Jul 2016 20:42:08 LogTest.py[line:36] WARNING This is a warning message
Process finished with exit code 0
關於這裡的具體格式,我從網路摘抄到一些配置,供大家參考:
filename: 用指定的檔名建立FiledHandler(後邊會具體講解handler的概念),這樣日誌會被儲存在指定的檔案中。
filemode: 檔案開啟方式,在指定了filename時使用這個引數,預設值為“a”還可指定為“w”。
format: 指定handler使用的日誌顯示格式。
datefmt: 指定日期時間格式。
level: 設定rootlogger(後邊會講解具體概念)的日誌級別
stream: 用指定的stream建立StreamHandler。可以指定輸出到sys.stderr,sys.stdout或者檔案,預設為sys.stderr。
若同時列出了filename和stream兩個引數,則stream引數會被忽略。
format引數中可能用到的格式化串:
%(name)s Logger的名字
%(levelno)s 數字形式的日誌級別
%(levelname)s 文字形式的日誌級別
%(pathname)s 呼叫日誌輸出函式的模組的完整路徑名,可能沒有
%(filename)s 呼叫日誌輸出函式的模組的檔名
%(module)s 呼叫日誌輸出函式的模組名
%(funcName)s 呼叫日誌輸出函式的函式名
%(lineno)d 呼叫日誌輸出函式的語句所在的程式碼行
%(created)f 當前時間,用UNIX標準的表示時間的浮 點數表示
%(relativeCreated)d 輸出日誌資訊時的,自Logger建立以 來的毫秒數
%(asctime)s 字串形式的當前時間。預設格式是 “2003-07-08 16:49:45,896”。逗號後面的是毫秒
%(thread)d 執行緒ID。可能沒有
%(threadName)s 執行緒名。可能沒有
%(process)d 程序ID。可能沒有
%(message)s 使用者輸出的訊息
4 輸出到檔案
日誌這種東西,除了在螢幕上看到,我們更希望的是在檔案中檢視,以方便我們隨時檢視問題。
輸出到檔案,其實從上面一章當中可以看到有相關的引數可以完成,這裡就直接給出程式碼,試試執行後是不是在目錄下多了一個log檔案了?
def case_4():
'''
使用basicConfig做引數配置
:return:
'''
LOG.basicConfig(level=LOG.DEBUG,
format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
datefmt='%a, %d %b %Y %H:%M:%S',
filename='test.log',
filemode='w')
LOG.debug('This is a debug message')
LOG.info('This is a info message')
LOG.warning('This is a warning message')
5 參照
更新待續