日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

13、logging模块

發布時間:2025/5/22 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 13、logging模块 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
很多程序都有記錄日志的需求,并且日志中包含的信息即有正常的程序訪問日志,還可能有錯誤、警告等信息輸出,python的logging模塊提供了標準的日志接口,你可以通過它存儲各種格式的日志,logging的日志可以分為 debug(), info(), warning(), error() and critical()5個級別,下面我們看一下怎么用。

最簡單用法

import logginglogging.warning("user [alex] attempted wrong password more than 3 times") logging.critical("server is down") 輸出 WARNING:root:user [alex] attempted wrong password more than 3 times CRITICAL:root:server is down

  

看一下這幾個日志級別分別代表什么意思
Level When it’s used
DEBUG Detailed information, typically of interest only when diagnosing problems.
INFO Confirmation that things are working as expected.
WARNING An indication that something unexpected happened, or indicative of some problem in the near future (e.g. ‘disk space low’). The software is still working as expected.
ERROR Due to a more serious problem, the software has not been able to perform some function.
CRITICAL A serious error, indicating that the program itself may be unable to continue running.

如果想把日志寫到文件里,也很簡單

import logginglogging.basicConfig(filename='example.log',level=logging.INFO) logging.debug('This message should go to the log file') logging.info('So should this') logging.warning('And this, too')

  

其中下面這句中的level=loggin.INFO意思是,把日志紀錄級別設置為INFO,也就是說,只有比日志是INFO或比INFO級別更高的日志才會被紀錄到文件里,在這個例子, 第一條日志是不會被紀錄的,如果希望紀錄debug的日志,那把日志級別改成DEBUG就行了。 logging.basicConfig(filename='example.log',level=logging.INFO)

自定義日志格式

感覺上面的日志格式忘記加上時間啦,日志不知道時間怎么行呢,下面就來加上! import logging logging.basicConfig(format='%(asctime)s %(message)s', datefmt='%m/%d/%Y %I:%M:%S %p') logging.warning('is when this event was logged.')

?

#輸出 12/12/2010 11:46:36 AM is when this event was logged. 除了加時間,還可以自定義一大堆格式,下表就是所有支持的格式
%(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 用戶輸出的消息

日志同時輸出到屏幕和文件

如果想同時把log打印在屏幕和文件日志里,就需要了解一點復雜的知識 了 Python 使用logging模塊記錄日志涉及四個主要類,使用官方文檔中的概括最為合適:
  • logger提供了應用程序可以直接使用的接口;
  • handler將(logger創建的)日志記錄發送到合適的目的輸出;
  • filter提供了細度設備來決定輸出哪條日志記錄;
  • formatter決定日志記錄的最終輸出格式。

他們之間的關系是這樣的

每個組件的主要功能

logger

每個程序在輸出信息之前都要獲得一個Logger。Logger通常對應了程序的模塊名,比如聊天工具的圖形界面模塊可以這樣獲得它的Logger: LOG=logging.getLogger(”chat.gui”)

  

而核心模塊可以這樣: LOG=logging.getLogger(”chat.kernel”)

  

還可以綁定handler和filters Logger.setLevel(lel):指定最低的日志級別,低于lel的級別將被忽略。debug是最低的內置級別,critical為最高 Logger.addFilter(filt)、Logger.removeFilter(filt):添加或刪除指定的filter Logger.addHandler(hdlr)、Logger.removeHandler(hdlr):增加或刪除指定的handler

  

Logger.debug()、Logger.info()、Logger.warning()、Logger.error()、Logger.critical():可以設置的日志級別

handler

handler對象負責發送相關的信息到指定目的地。Python的日志系統有多種Handler可以使用。有些Handler可以把信息輸出到控制臺,有些Handler可以把信息輸出到文件,還有些 Handler可以把信息發送到網絡上。如果覺得不夠用,還可以編寫自己的Handler??梢酝ㄟ^addHandler()方法添加多個多handler Handler.setLevel(lel):指定被處理的信息級別,低于lel級別的信息將被忽略 Handler.setFormatter():給這個handler選擇一個格式 Handler.addFilter(filt)、Handler.removeFilter(filt):新增或刪除一個filter對象

  

每個Logger可以附加多個Handler。接下來我們就來介紹一些常用的Handler:
  • logging.StreamHandler 使用這個Handler可以向類似與sys.stdout或者sys.stderr的任何文件對象(file object)輸出信息。
  • logging.FileHandler 和StreamHandler 類似,用于向一個文件輸出日志信息。不過FileHandler會幫你打開這個文件
  • logging.handlers.RotatingFileHandler 這個Handler類似于上面的FileHandler,但是它可以管理文件大小。當文件達到一定大小之后,它會自動將當前日志文件改名,然后創建 一個新的同名日志文件繼續輸出。比如日志文件是chat.log。當chat.log達到指定的大小之后,RotatingFileHandler自動把 文件改名為chat.log.1。不過,如果chat.log.1已經存在,會先把chat.log.1重命名為chat.log.2。。。最后重新創建 chat.log,繼續輸出日志信息。它的函數是: RotatingFileHandler( filename[, mode[, maxBytes[, backupCount]]])

      

    其中filename和mode兩個參數和FileHandler一樣。
    • maxBytes用于指定日志文件的最大文件大小。如果maxBytes為0,意味著日志文件可以無限大,這時上面描述的重命名過程就不會發生。
    • backupCount用于指定保留的備份文件的個數。比如,如果指定為2,當上面描述的重命名過程發生時,原有的chat.log.2并不會被更名,而是被刪除。
    logging.handlers.TimedRotatingFileHandler 這個Handler和RotatingFileHandler類似,不過,它沒有通過判斷文件大小來決定何時重新創建日志文件,而是間隔一定時間就 自動創建新的日志文件。重命名的過程與RotatingFileHandler類似,不過新的文件不是附加數字,而是當前時間。它的函數是: TimedRotatingFileHandler( filename [,when [,interval [,backupCount]]]) 其中filename參數和backupCount參數和RotatingFileHandler具有相同的意義。 interval是時間間隔。 when參數是一個字符串。表示時間間隔的單位,不區分大小寫。它有以下取值:
    • S 秒
    • M 分
    • H 小時
    • D 天
    • W 每星期(interval==0時代表星期一)
    • midnight 每天凌晨

    formatter 組件

    日志的formatter是個獨立的組件,可以跟handler組合 fh = logging.FileHandler("access.log") formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')fh.setFormatter(formatter) #把formmater綁定到fh上

      

    filter 組件

    如果你想對日志內容進行過濾,就可自定義一個filter class IgnoreBackupLogFilter(logging.Filter):"""忽略帶db backup 的日志"""def filter(self, record): #固定寫法return "db backup" not in record.getMessage()

      

    注意filter函數會返加True or False,logger根據此值決定是否輸出此日志 然后把這個filter添加到logger中 logger.addFilter(IgnoreBackupLogFilter())

      

    下面的日志就會把符合filter條件的過濾掉 logger.debug("test ....") logger.info("test info ....") logger.warning("start to run db backup job ....") logger.error("test error ....")

      

    一個同時輸出到屏幕、文件、帶filter的完成例子 import loggingclass IgnoreBackupLogFilter(logging.Filter):"""忽略帶db backup 的日志"""def filter(self, record): #固定寫法return "db backup" not in record.getMessage()#console handler ch = logging.StreamHandler() ch.setLevel(logging.INFO) #file handler fh = logging.FileHandler('mysql.log') #fh.setLevel(logging.WARNING)#formatter formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') #bind formatter to ch ch.setFormatter(formatter) fh.setFormatter(formatter)logger = logging.getLogger("Mysql") logger.setLevel(logging.DEBUG) #logger 優先級高于其它輸出途徑的#add handler to logger instance logger.addHandler(ch) logger.addHandler(fh)#add filter logger.addFilter(IgnoreBackupLogFilter())logger.debug("test ....") logger.info("test info ....") logger.warning("start to run db backup job ....") logger.error("test error ....")

      

    文件自動截斷例子 import loggingfrom logging import handlerslogger = logging.getLogger(__name__)log_file = "timelog.log" #fh = handlers.RotatingFileHandler(filename=log_file,maxBytes=10,backupCount=3) fh = handlers.TimedRotatingFileHandler(filename=log_file,when="S",interval=5,backupCount=3)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")

      

    轉載于:https://www.cnblogs.com/vettel2018/p/10076272.html

    總結

    以上是生活随笔為你收集整理的13、logging模块的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。