1. 程式人生 > >Python中模塊之logging & subprocess的講解

Python中模塊之logging & subprocess的講解

ace 級別 free stream mea ctime ces roo ssa

subprocess & logging模塊的介紹

1. subprocess

該模塊替代了os.system & os.pawn*所實現的功能。

2. logging

1. 日誌五大級別

    level              means               levelno
1. DEBUG            詳細信息,調試時用         10
2. INFO             工作預期內容              20
3. WARNING(WARN)    警告,程序運行正常         30
4. ERROR            錯誤,程序部分功能不能實現  40
5. CRITICAL(FATAL)  致命錯誤,程序不能正常運行  50

2. 格式化

    格式                  表示
1. %(name)s             Logger的名字(一般為root)
2. %(levelno)s          數字形式的日誌級別
3. %(levelname)s        文本形式的日誌級別
4. %(pathname)s         調用日誌輸出函數的模塊的完整路徑,帶後綴
5. %(filename)s         調用日誌輸出函數的模塊的文件名,帶後綴
6. %(module)s           調用日誌輸出函數的模塊名,不帶後綴
7. %(funcName)s         調用日誌輸出的函數的函數名,可能沒有,(需要使用函數調)
8. %(lineno)d           調用日誌輸出函數的語句所在的代碼行
9. %(create)f           當前時間,用unix標準的時間的浮點數表示
10. %(relativeCreated)d 輸出日誌信息時,自Logger創建以來的毫秒
11. %(asctime)s         字符串形式的當前時間,默認格式是 “2003-07-08 16:49:45,896”。逗號後面的是毫秒
12. %(thread)d          線程ID
13. %(threadName)s      線程名
14. %(process)d         進程ID
15. %(message)s         用戶輸入的信息,該內容為級別後面用戶輸入的信息

3.時間格式

對於時間的字符串格式可以參考time模塊的介紹,這裏不做過多講解。

4. 方法

  1. 創建日誌文件

    方法:basicConfig(**kwargs)
    返回值:None
    #該方法接收字典類型的關鍵字參數。對於該方法的關鍵字參數主要有:filename,filemode,format,datefmt,style,level,stream,handlers。對於filemode關鍵字默認是‘a‘模塊打開日誌文件,如果指定是‘r‘模式將不能進行寫入日誌。
    
  2. 日誌級別

    1. logging.debug(msg)#輸出調試級別日誌 
    2. logging.info(msg)#輸出工作級別日誌
    3. logging.warning(msg)#輸出警告級別日誌
    4. logging.error(msg)#輸出錯誤級別日誌
    5. logging.critical(msg)#輸出嚴重級別日誌
    
  3. 常用方法

    1. logging.StreamHandler()#設置日誌輸出到屏幕
    2. logging.FileHandler(file)#設置日誌輸出到指定文件
    3. logging.getLogger(name=None)#創建一個Logger對象
    

5. logging中的常用類

  1. Logger

    提供了應用程序可以直接使用的接口

    1. logging.Logger.setLevel(level)#設置日誌的最低級別
    2. logging.Logger.addFilter(filter)#增加指定的filter
    3. logging.Logger.removeFilter(filter)#刪除指定的filter
    4. logging.Logger.addHandler(handler)#增加指定的handler
    5. logging.Logger.removeHandler(handler)#刪除指定的handler
    6. logging.Logger.debug(msg)#輸出調試級別日誌 
    7. logging.Logger.info(msg)#輸出工作級別日誌
    8. logging.Logger.warning(msg)#輸出警告級別日誌
    9. logging.Logger.error(msg)#輸出錯誤級別日誌
    10. logging.Logger.critical(msg)#輸出嚴重級別日誌
    
  2. Handler

    將(logger創建的)日誌記錄發送到合適的目的輸出

    1. logging.Handler.setLevel(level)#指定被處理的最低日誌級別
    2. logging.Handler.setFormatter(fmt)#指定被處理日誌的格式
    3. logging.Handler.addFilter(filter)#增加一個filter對象
    4. logging.Handler.removeFilter(filter)#刪除一個filter對象
    5. logging.handler.
    
  3. Filter

    提供了細度,設備來決定輸出哪條日誌記錄

  4. Formatter

    決定了日誌記錄的最終輸出格式

    方法與上述的格式類似,比format多了一個‘%(msecs)d‘,表示創建時間的毫秒部分。
    

    常用三類的整合實例如下:

    logger = logging.getLogger(‘Test.log‘)#創建logger對象
    logger.setLevel(logging.DEBUG)#設置logger級別
    ch = logging.StreamHandler()#創建日誌處理輸出到屏幕的對象
    ch.setLevel(logging.DEBUG)#設置日誌處理輸出到屏幕輸的日誌級別
    fh = logging.FileHandler("test.log")#創建日誌處理輸出到文件的對象
    fh.setLevel(logging.WARNING)#設置日誌處理輸出到文件的日誌級別
    formatter1 = logging.Formatter(‘%(name)s - %(levelname)s - %(message)s‘)
    formatter2 = logging.Formatter(‘%(asctime)s - %(name)s - %(levelname)s - %(message)s‘)#設置日誌的格式
    ch.setFormatter(formatter1)#調用日誌格式1到輸出到屏幕對象中
    fh.setFormatter(formatter2)#調用日誌格式2到輸出到文件對象中
    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‘)
    

6. handlers子模塊

該模塊主要用於對於日誌文件進行自動截斷保存,主要分為按時間和大小進行截斷。使用前需要先導入該模塊,一般使用方法為:from logging import handlers

  1. handlers.RotatingFileHandler

    方法:handlers.RotatingFileHandler(filename[, mode[, maxBytes[, backupCount]]])
    參數:
        maxBytes用於指定日誌文件的最大文件大小。如果maxBytes為0,意味著日誌文件可以無限大,這時上面描述的重命名過程就不會發生。
        backupCount用於指定保留的備份文件的個數。比如,如果指定為2,當上面描述的重命名過程發生時,原有的chat.log.2並不會被更名,而是被刪除。
    

    實例如下:

    from logging import handlers
    logger = logging.getLogger(__name__)#創建logger對象
    log_file = "timelog.log"#聲明一個文件名
    fh = handlers.RotatingFileHandler(filename=log_file,maxBytes=5,backupCount=2)#日誌文件按大小截斷,每個文件最大5個字節,之保留2分日誌文件,自動刪除較早生成的日誌文件。
    formatter = logging.Formatter(‘%(asctime)s %(module)s:%(lineno)d %(message)s‘)
    fh.setFormatter(formatter)#調用格式到日誌處理輸出到文件
    logger.addHandler(fh)#增加一個日誌處理輸出到文件
    logger.warning("test1")
    logger.warning("test12")
    logger.warning("test13")
    logger.warning("test14")
    
  2. handlers.TimedRotatingFileHandler

    方法:handlers.TimedRotatingFileHandler(filename [,when [,interval [,backupCount]]])
    參數: 
        when表示時間,具體取值如下(不區分大小寫):
        when == S 秒         interval取值為[1,59]
                M 分                      [60,60*60)
                H 小時                    [60*60,60*60*24)
                D 天                      [60*60*24,∞)
                W 每星期                  [60*60*24*1,60*60*24*7](interval==0時代表星期一)
                midnight 每天淩晨          不指定
    

實例如下:

    import time
    from logging import handlers
    logger = logging.getLogger(__name__)#創建logger對象
    log_file = "timelog.log"#聲明一個文件名
    fh = handlers.TimedRotatingFileHandler(filename=log_file,when="S",interval=2,backupCount=3)#每2秒生成一個日誌文件,之保留3份日誌文件。
    formatter = logging.Formatter(‘%(asctime)s %(module)s:%(lineno)d %(message)s‘)
    fh.setFormatter(formatter)#調用格式到日誌處理輸出到文件
    logger.addHandler(fh)#增加一個日誌處理輸出到文件
    logger.warning("test1")
    time.sleep(2)
    logger.warning("test12")
    time.sleep(2)
    logger.warning("test13")
    time.sleep(2)
    logger.warning("test14")

Python中模塊之logging & subprocess的講解