1. 程式人生 > >Python logging模組

Python logging模組

1.日誌級別

為了實現在不同的環境記錄不同詳細程度的日誌,這就需要用到日誌等級了。

2.輸出到控制檯

logging模組是Python的一個標準庫模組,logging模組定義的函式和類為應用程式和庫的開發實現了一個靈活的事件日誌系統。

(1)在error_test1.py中寫入程式碼

import logging  
logging.debug('this is a debug message')  
logging.info('this is a info message')  
logging.warning('this is a warning message')  
logging.error('this is a error message')  
logging.critical('this is a critical message') 

(2)控制檯輸出

可以看到,在預設情況下python的logging模組會將日誌列印在控制檯,且只顯示大於等於WARNING級別的日誌,這說明預設的日誌級別設定為WARNING。

3.使用logging.basicConfig配置日誌

logging.basicConfig()用於為logging日誌系統做一些基本配置。

格式:logging.basicConfig(配置引數)

(1)常用引數

引數

名稱

描述

level

指定日誌級別。

format

指定日誌格式字串,即指定日誌輸出時所包含的欄位資訊以及它們的順序。

datefmt

指定日期、時間格式,預設:datefmt="%Y-%m-%d %H:%M:%S"。

filename

指定日誌輸出目標檔案的檔名,指定該設定項後日志信心就不會被輸出到控制檯了。

filemode

指定日誌檔案開啟模式,預設為'a'。該選項在filename指定時才有效。

stream

指定日誌輸出目標stream,如sys.stdout、sys.stderr。需要注意stream和filename不能同時出現,否則會引發ValueError異常。

style

指定format格式字串的風格,可取值為'%'、'{'和'$',預設為'%'

(2)format格式化字串的欄位

欄位名稱

使用格式

描述

asctime

%(asctime)s

日誌事件發生的時間,預設如:2018-05-04 21:48:05,956。

created

%(created)f

日誌事件發生的時間--時間戳,就是當時呼叫time.time()函式返回的值。

msecs

%(msecs)d

日誌事件發生事件的毫秒部分

levelname

%(levelname)s

該日誌記錄的文字形式的日誌級('DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL')。

levelno

%(levelno)s

該日誌記錄的數字形式的日誌級別。

name

%(name)s

所使用的日誌器名稱,預設是'root',因為預設使用的是rootLogger。

message

%(message)s

日誌記錄的文字內容。

pathname

%(pathname)s

呼叫日誌記錄函式的原始碼檔案的全路徑。

filename

%(filename)s

pathname的檔名部分,包含檔案字尾。

module

%(module)s

filename的名稱部分,不包含字尾。

lineno

%(lineno)d

呼叫日誌記錄函式的原始碼所在的行號。

funcName

%(funcName)s

呼叫日誌記錄函式的函式名。

process

%(process)d

程序ID。

processName

%(processName)s

程序名稱。

thread

%(thread)d

執行緒ID。

threadName

%(thread)s

執行緒名稱。

4.輸出到檔案

(1)在error_test1.py中寫入程式碼

import logging  
logging.basicConfig(level=logging.DEBUG,  
                    format='%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s:%(message)s',  
                    filename='D:/st07/error/tmp/test.log',  
                    filemode='w')  
#日誌
logging.debug('this is a debug message')  
logging.info('this is a info message')  
logging.warning('this is a warning message')  
logging.error('this is a error message')  
logging.critical('this is a critical message')  
#測試程式碼
try:
    print("start")
    n=int(input("Please enter a number:"))
    share=12/n
    print('每一個股東的分紅是:{}億元。'.format(share))
except ValueError as e:
    logging.error(e)
except ZeroDivisionError as e:
    logging.error(e)
finally:
    print("end")

(2)控制檯輸出

(3)檢視test.log日誌檔案

2018-05-04 22:34:02,591 -error_test1.py[line:7] - DEBUG:this is a debugmessage

2018-05-04 22:34:02,591 -error_test1.py[line:8] - INFO:this is a infomessage

2018-05-04 22:34:02,591 -error_test1.py[line:9] - WARNING:this is awarning message

2018-05-04 22:34:02,591 -error_test1.py[line:10] - ERROR:this is a errormessage

2018-05-04 22:34:02,591 -error_test1.py[line:11] - CRITICAL:this is a critical message

2018-05-04 22:34:06,850 -error_test1.py[line:19] - ERROR:invalid literalfor int() with base 10: '3.5'

5.logging輸出日誌到控制檯和檔案

(1)在把DEBUG等級日誌輸出到檔案的同時,在控制檯只輸出ERROR等級日誌

在error1.py中寫入程式碼:

import logging

logging.basicConfig(level=logging.DEBUG,  
                    format='%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s:%(message)s',  
                    filename='D:/st07/error/tmp/test.log',  
                    filemode='w')        

#在控制檯輸出ERROR等級日誌,在logging.basicConfig中的引數配置會成為預設配置
#建立一個logger,定義輸出到控制檯的log等級開關為ERROR  
logger = logging.getLogger()      
con = logging.StreamHandler()
con.setLevel(logging.ERROR)  
#定義handler的輸出格式  
format1 = logging.Formatter("%(asctime)s  %(filename)s[line:%(lineno)d]  %(levelname)s: %(message)s")  
con.setFormatter(format1)   
#將logger新增到handler裡面  
logger.addHandler(con) 
                                       
#日誌              
logging.debug('debug message')  
logging.info('info message')  
logging.warning('warning message')  
logging.error('error message')  
logging.critical('critical message')  

#測試程式碼
try:
    print("start")
    n=int(input("Please enter a number:"))
    share=12/n
    print('每一個股東的分紅是:{}億元。'.format(share))
except ValueError as e:
    logging.error(e)
except ZeroDivisionError as e:
    logging.error(e)
finally:
    print("end")

(2)在控制檯輸出:

(3)檢視test.log日誌檔案:

2018-05-04 23:05:16,612 -error1.py[line:20] - DEBUG:debug message

2018-05-04 23:05:16,612 -error1.py[line:21] - INFO:info message

2018-05-04 23:05:16,612 -error1.py[line:22] - WARNING:warning message

2018-05-04 23:05:16,612 -error1.py[line:23] - ERROR:error message

2018-05-04 23:05:16,612 -error1.py[line:24] - CRITICAL:critical message

2018-05-04 23:05:46,735 -error1.py[line:33] - ERROR:invalid literal for int() with base 10: '2.5'

6.logging模組元件

(1)logging模組的四大元件

元件名稱

對應類名

描述

日誌器

Logger

提供了應用程式可一直使用的介面。

處理器

Handler

將logger建立的日誌記錄傳送到合適的目的輸出。

過濾器

Filter

提供了更細粒度的控制工具來決定輸出哪條日誌記錄,丟棄哪條日誌記錄。

格式器

Formatter

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

(2)Logger物件常用方法

方法

描述

Logger.setLevel()

設定日誌器將會處理的日誌訊息的最低嚴重級別。

Logger.addHandler()

為該logger物件新增handler物件。

Logger.removeHandler()

為該logger物件移除handler物件。

Logger.addFilter()

為該logger物件新增filter物件。

Logger.removeFilter()

為該logger物件移除個filter物件。

怎樣得到一個Logger物件呢?

通常用: logger = logging.getLogger()

logging.getLogger()方法有一個可選引數name,該引數表示將要返回的日誌器的名稱標識,如果不提供該引數,則其值為'root'。

name相同:只要logging.getLogger(name)中name相同,則返回的Logger例項就是同一個,最後logger的輸出遵從後來設定的日誌級別。

(3)Handler物件常用方法

方法

描述

Handler.setLevel()

設定handler將會處理的日誌訊息的最低嚴重級別。

Handler.setFormatter()

為handler設定一個格式器物件。

Handler.addFilter()

為handler新增一個過濾器物件。

Handler.removeFilter()

為handler刪除一個過濾器物件。

一些常用的Handler子類

Handler

描述

logging.StreamHandler

將日誌訊息傳送到Stream。

logging.FileHandler

將日誌訊息傳送到磁碟檔案,預設情況下檔案大小會無限增長。

logging.handlers.RotatingFileHandler

將日誌訊息傳送到磁碟檔案,並支援日誌檔案按大小切割。

logging.hanlders.TimedRotatingFileHandler

將日誌訊息傳送到磁碟檔案,並支援日誌檔案按時間切割。

logging.handlers.HTTPHandler

將日誌訊息以GET或POST的方式傳送給一個HTTP伺服器。

logging.handlers.SMTPHandler

將日誌訊息傳送給一個指定的email地址。

例如:

con = logging.StreamHandler()

con.setLevel(logging.ERROR)   

經常需要將日誌訊息傳送到磁碟檔案,並支援日誌檔案按時間切割:logging.hanlders.TimedRotatingFileHandler的建構函式定義如下:
     TimedRotatingFileHandler(filename[,when [,interval [,backupCount]]])
filename是輸出日誌檔名,when是一個字串:

 “S”:Seconds

“M”: Minutes
“H”: Hours
“D”: Days
“W”: Week day (0=Monday)
“midnight”: Roll over at midnight

interval是指等待多少個單位when的時間後,Logger會自動重建檔案(這個檔案的建立取決於filename+suffix,若這個檔案跟之前的檔案有重名,則會自動覆蓋掉以前的檔案)。

backupCount是保留日誌個數,預設的0不會自動刪除日誌。若設10,則在檔案的建立過程中庫會判斷是否有超過10個,若超過則會從最先建立的開始刪除。

(4)Formater物件

Formater物件用於配置日誌資訊的最終順序、結構和內容。

例如:

#定義handler的輸出格式

format1 =logging.Formatter("%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s: %(message)s")

con.setFormatter(format1)

(5)Filter物件

Filter可以被Handler和Logger用來做比level更細粒度的、更復雜的過濾功能。

7.例項

(1)需求

(a)要求將所有級別的日誌都寫入磁碟檔案中

(b)all.log檔案中記錄所有的日誌資訊

(c)error.log檔案中單獨記錄error及以上級別的日誌資訊

(d)要求all.log,每秒一個log檔案,超過10個log就刪除。

程式碼:

import logging
import logging.handlers
import time
import threading
def log_test():
    #1.建立一個logger,設定Log等級總開關
    logger = logging.getLogger('mylogger')
    logger.setLevel(logging.DEBUG)
    
    #2.設定輸出到all.log的引數
    f1 = logging.handlers.TimedRotatingFileHandler('D:/st07/error/tmp1/all.log', when='S', 
    interval=1, backupCount=10)
    format1=logging.Formatter('%(asctime)s - %(filename)s - %(levelname)s:%(message)s')
    f1.setFormatter(format1)
    f1.suffix = "%Y-%m-%d_%H-%M-%S.log" 
    
    #3.設定輸出到error.log的等級開關和格式
    f2 = logging.FileHandler('D:/st07/error/tmp1/error.log')
    f2.setLevel(logging.ERROR)
    format2 = logging.Formatter("%(asctime)s  %(filename)s[line:%(lineno)d]  %(levelname)s: %(message)s") 
    f2.setFormatter(format2)
    #4.把logger新增到handler裡面 
    logger.addHandler(f1)
    logger.addHandler(f2)
    
    #日誌
    logger.debug('logger debug message')  
    logger.info('logger info message')  
    logger.warning('logger warning message')  
    logger.error('logger error message')  
    logger.critical('logger critical message')

    #為了測試,重複構造定時器
    global timer
    timer = threading.Timer(1, log_test)
    timer.start()
        
#測試(用定時器來實現)
timer = threading.Timer(1, log_test)
timer.start()

注意:filehanlder.suffix的格式,如果設定是天應該寫成“%Y-%m-%d.log”,寫成其他格式會導致不能刪除舊檔案。

檢視生成的log檔案個數:

(2)在error_test1.py寫程式碼:

import logging  
  
# 建立logger    
logger = logging.getLogger()  
logger.setLevel(logging.DEBUG) 
 
logger1 = logging.getLogger('mylogger')  
logger1.setLevel(logging.INFO)  

logger2 = logging.getLogger('mylogger.child1')  
logger2.setLevel(logging.WARNING)  
 
f = logging.FileHandler('D:/st07/error/tmp/all.log',mode='w')   
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s:%(message)s')  
f.setFormatter(formatter)  
logger.addHandler(f)

f1 = logging.FileHandler('D:/st07/error/tmp/some.log',mode='w')    
f1.setFormatter(formatter)  
logger1.addHandler(f1)
logger2.addHandler(f1)  
# 日誌    
logger.debug('logger debug message')  
logger.info('logger info message')  
logger.warning('logger warning message')  
logger.error('logger error message')  
logger.critical('logger critical message')  
  
logger1.debug('logger1 debug message')  
logger1.info('logger1 info message')  
logger1.warning('logger1 warning message')  
logger1.error('logger1 error message')  
logger1.critical('logger1 critical message') 

logger2.debug('logger2 debug message')  
logger2.info('logger2 info message')  
logger2.warning('logger2 warning message')  
logger2.error('logger2 error message')  
logger2.critical('logger2 critical message')

開啟all.log和some.log,可以看到:



相關推薦

Pythonlogging模組知多少

  我們在寫程式的時候經常會打一些日誌來幫助我們查詢問題,這次學習一下logging模組,在python裡面如何操作日誌。 介紹一下logging模組,logging模組就是python裡面用來操作日誌的模組,logging模組中主要有4個類,分別負責不同的工作: Logger 記錄器,暴露了

python-logging模組的簡單使用:如何同時輸出到控制檯和本地日誌檔案

本文簡單記錄logging模組使用方法。參考部落格 提供兩種記錄日誌的方式: 使用logging提供的模組級別的函式 使用logging模組的四大元件 一、簡單使用——函式 下面是常用函式 logging.debug() logging.info() l

python logging模組講解

日誌欄位資訊與日誌格式 一條日誌資訊對應的是一個事件的發生,而一個事件通常需要包括以下幾個內容: 事件發生時間 事件發生位置 事件的嚴重程度--日誌級別 事件內容 上面這些都是一條日誌記錄中可能包含的欄位資訊,當然還可以包括一些其他資訊,如程

Python--logging模組總結

在實際開發中logging模組會經常使用,但是對於類似Django的日誌配置,之前自己一致都沒有好好整理,這次在這裡進行重新彙總整理。參考 Django官方文件 和 Python官方文件. 1. logging文件說明 logging模組為應用程式提供了靈活的手段記錄事件、錯誤、

python -logging 模組

概述 logging 是python自帶的日誌模組,既可以輸出到控制檯,也可以輸出到檔案中。 用法 import logging   # 建立一個logger   logger = logging.getLogger('mylogger')   logger.

python logging 模組 使用總結

logging python 中的日誌模組 最近嘗試使用了python中的日誌庫 logging, 作簡單使用總結 有什麼問題或建議請留言告知 , 感謝閱讀 簡單理解就是 logger 相當於申明瞭一個外殼 Handler 類似於 logger 的一套規則,來填充 l

Python logging模組

1.日誌級別為了實現在不同的環境記錄不同詳細程度的日誌,這就需要用到日誌等級了。2.輸出到控制檯logging模組是Python的一個標準庫模組,logging模組定義的函式和類為應用程式和庫的開發實現了一個靈活的事件日誌系統。(1)在error_test1.py中寫入程式碼

Python logging模組 捕獲異常,並儲存為 logging 檔案

____tz_zs logging模組簡單使用 basicConfig . #!/usr/bin/python2.7 # -*- coding:utf-8 -*- """ @author: tz_zs """ import logging import ti

Python Logging模組-配置檔案說明

首先直接來看一個配置檔案 [loggers] keys=root,simpleExample [handlers] keys=consoleHandler,fileHandler [formatters] keys=simpleFormatter [

python logging模組程式碼示例:實現日誌輸出到控制檯, 並且寫入日誌檔案中

import logging class Logger(object): def __init__(self, log_file_name, log_level, logger_name):

Python——logging模組學習

一、logging.basicConfig設定日誌輸出格式及路徑:輸出到檔案 日誌級別大小關係為:CRITICAL > ERROR > WARNING > INFO > DE

Python logging 模組和使用經驗

記錄下常用的一些東西,每次用總是查文件有點小麻煩。 py2.7 日誌應該是生產應用的重要生命線,誰都不應該掉以輕心 有益原則 級別分離 日誌系統通常有下面幾種級別,看情況是使用 FATAL - 導致程式退出的嚴重系統級錯誤,不

python logging模組使用總結

目錄 logging模組 日誌級別 logging.basicConfig()函式中的具體引數含義 format引數用到的格式化資訊 使用logging列印日誌到標準輸出 使用

python三十九:logging模組

import logging logging.basicConfig( level=logging.DEBUG # 設定日誌級別, 預設為 WARNING ,filename="logger.log" # 將日誌資訊輸出到檔案中 ,filemode="w" # 檔案

Learning-Python【21】:Python常用模組(4)—— re、logging、hashlib、subprocess

re 模組:與正則相關的模組 在使用 re 模組之前,需要先了解正則表示式(regular expression),描述了一種字串匹配的模式(pattern),可以用來檢查一個字串是否含有某個子字串、將匹配的子字串替換或者從某個字串中取出符合某個條件的子字串等。 import

Appium-python日誌logging模組的簡介和應用(2)

Python的logging模組定義的函式和類為應用程式和庫的開發實現提供了一個靈活的事件日誌系統。   Logging模組提供了兩種記錄日誌的方式: 第一種是使用logging提供的模組級別的函式 第二種是使用logging日誌系統的四大元件 此文主要使用

Appium-python日誌模組logging(1)

背景: 在除錯指令碼時,可直接使用pycharm IDE展示指令碼執行的日誌,如下圖: 但是,在指令碼完成後,每日定時執行自動化指令碼時,不會開啟pycharm,故會存在看不到日誌的情況,此時需要使用python日誌系統。 Python的日誌模組是logging模組。 Pyth

python學習第五十二天logging模組的使用

   很多程式都有記錄日誌的需求,並且日誌包含的資訊即有正常的程式訪問日誌,還可能有錯誤,警告等資訊輸出,python的 logging模組提供了標準的日誌介面,你可以通過它儲存各種格式的日誌,logging的日誌可以分debug(),info() warning() error()

Pythonlogging模組

1、日誌級別 日誌級別 數值 Critical 50 Error 40 Warning 30 Info 20

Python--day29--logging模組(日誌模組)

重要程度六顆星,比如一個小視窗的廣告如果因為你沒有日誌的問題導致點選量沒有記錄下來,幾十分鐘那就會損失幾十萬了,這責任誰負得起。 希望離開一個公司是因為有了更好的去處而不是因為各種各樣的原因被開掉,那樣整個日子的心情就不好了 logging的作用: logging的五個級別: basiconf