1. 程式人生 > >Python 日誌元件Logging 使用手札 (一)

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 參照

更新待續