python中的logging模塊應用

python中有系統自帶的logging模塊,使用起來很是方便,而且要在程序中常常要使用這個模塊,這樣出了問題能夠經過日誌很方便的查找在哪裏出了問題,比直接找代碼要方便些html

我記錄了一些常常用到的,不是很經常使用的能夠到python文檔中去查看 http://docs.python.org/2/library/logging.htmlpython

1. 初始化 logger = logging.getLogger("endlesscode"),getLogger()方法後面最好加上所要日誌記錄的模塊名字,後面的日誌格式中的%(name)s 對應的是這裏的模塊名字windows

2. 設置級別 logger.setLevel(logging.DEBUG),Logging中有NOTSET < DEBUG < INFO < WARNING < ERROR < CRITICAL這幾種級別,日誌會記錄設置級別以上的日誌less

3. Handler,經常使用的是StreamHandler和FileHandler,windows下你能夠簡單理解爲一個是console和文件日誌,一個打印在CMD窗口上,一個記錄在一個文件上函數

4. formatter,定義了最終log信息的順序,結構和內容,我喜歡用這樣的格式 '[%(asctime)s] [%(levelname)s] %(message)s', '%Y-%m-%d %H:%M:%S',spa

%(name)s Logger的名字.net

%(levelname)s 文本形式的日誌級別線程

%(message)s 用戶輸出的消息debug

%(asctime)s 字符串形式的當前時間。默認格式是 「2003-07-08 16:49:45,896」。逗號後面的是毫秒日誌

%(levelno)s 數字形式的日誌級別

%(pathname)s 調用日誌輸出函數的模塊的完整路徑名,可能沒有

%(filename)s 調用日誌輸出函數的模塊的文件名

%(module)s  調用日誌輸出函數的模塊名

%(funcName)s 調用日誌輸出函數的函數名

%(lineno)d 調用日誌輸出函數的語句所在的代碼行

%(created)f 當前時間,用UNIX標準的表示時間的浮 點數表示

%(relativeCreated)d 輸出日誌信息時的,自Logger建立以 來的毫秒數

%(thread)d 線程ID。可能沒有

%(threadName)s 線程名。可能沒有

%(process)d 進程ID。可能沒有

5. 記錄 使用object.debug(message)來記錄日誌

下面來寫一個實例,在CMD窗口上只打出error以上級別的日誌,可是在日誌中打出debug以上的信息

import logging
logger = logging.getLogger("simple_example")
logger.setLevel(logging.DEBUG)
# 創建一個filehandler來把日誌記錄在文件裏,級別爲debug以上
fh = logging.FileHandler("spam.log")
fh.setLevel(logging.DEBUG)
# 創建一個streamhandler來把日誌打在CMD窗口上,級別爲error以上
ch = logging.StreamHandler()
ch.setLevel(logging.ERROR)
# 設置日誌格式
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
ch.setFormatter(formatter)
fh.setFormatter(formatter)
#將相應的handler添加在logger對象中
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")

運行一下將會看到CMD窗口只記錄兩條,spam.log中記錄了五條日誌

log

 

當一個項目比較大的時候,不一樣的文件中都要用到Log,能夠考慮將其封裝爲一個類來使用

#! /usr/bin/env python
#coding=gbk
import logging,os

class Logger:
    def __init__(self, path,clevel = logging.DEBUG,Flevel = logging.DEBUG):
        self.logger = logging.getLogger(path)
        self.logger.setLevel(logging.DEBUG)
        fmt = logging.Formatter('[%(asctime)s] [%(levelname)s] %(message)s', '%Y-%m-%d %H:%M:%S')
        #設置CMD日誌
        sh = logging.StreamHandler()
        sh.setFormatter(fmt)
        sh.setLevel(clevel)
        #設置文件日誌
        fh = logging.FileHandler(path)
        fh.setFormatter(fmt)
        fh.setLevel(Flevel)
        self.logger.addHandler(sh)
        self.logger.addHandler(fh)

    def debug(self,message):
        self.logger.debug(message)

    def info(self,message):
        self.logger.info(message)

    def war(self,message):
        self.logger.warn(message)

    def error(self,message):
        self.logger.error(message)

    def cri(self,message):
        self.logger.critical(message)



if __name__ =='__main__':
    logyyx = Logger('yyx.log',logging.ERROR,logging.DEBUG)
    logyyx.debug('一個debug信息')
    logyyx.info('一個info信息')
    logyyx.war('一個warning信息')
    logyyx.error('一個error信息')
    logyyx.cri('一個致命critical信息')

這樣每次使用的時候只要實例化一個對象就能夠了

logobj = Logger(‘filename’,clevel,Flevel)

若是想在CMD窗口中對於error的日誌標紅,warning的日誌標黃,那麼能夠使用ctypes模塊

color

#! /usr/bin/env python
#coding=gbk
import logging,os
import ctypes

FOREGROUND_WHITE = 0x0007
FOREGROUND_BLUE = 0x01 # text color contains blue.
FOREGROUND_GREEN= 0x02 # text color contains green.
FOREGROUND_RED  = 0x04 # text color contains red.
FOREGROUND_YELLOW = FOREGROUND_RED | FOREGROUND_GREEN

STD_OUTPUT_HANDLE= -11
std_out_handle = ctypes.windll.kernel32.GetStdHandle(STD_OUTPUT_HANDLE)
def set_color(color, handle=std_out_handle):
    bool = ctypes.windll.kernel32.SetConsoleTextAttribute(handle, color)
    return bool


class Logger:
    def __init__(self, path,clevel = logging.DEBUG,Flevel = logging.DEBUG):
        self.logger = logging.getLogger(path)
        self.logger.setLevel(logging.DEBUG)
        fmt = logging.Formatter('[%(asctime)s] [%(levelname)s] %(message)s', '%Y-%m-%d %H:%M:%S')
        #設置CMD日誌
        sh = logging.StreamHandler()
        sh.setFormatter(fmt)
        sh.setLevel(clevel)
        #設置文件日誌
        fh = logging.FileHandler(path)
        fh.setFormatter(fmt)
        fh.setLevel(Flevel)
        self.logger.addHandler(sh)
        self.logger.addHandler(fh)

    def debug(self,message):
        self.logger.debug(message)

    def info(self,message):
        self.logger.info(message)

    def war(self,message,color=FOREGROUND_YELLOW):
        set_color(color)
        self.logger.warn(message)
        set_color(FOREGROUND_WHITE)

    def error(self,message,color=FOREGROUND_RED):
        set_color(color)
        self.logger.error(message)
        set_color(FOREGROUND_WHITE)

    def cri(self,message):
        self.logger.critical(message)



if __name__ =='__main__':
    logyyx = Logger('yyx.log',logging.WARNING,logging.DEBUG)
    logyyx.debug('一個debug信息')
    logyyx.info('一個info信息')
    logyyx.war('一個warning信息')
    logyyx.error('一個error信息')
    logyyx.cri('一個致命critical信息')

參考文章 http://blog.csdn.net/fxjtoday/article/details/6307285

相關文章
相關標籤/搜索