Python - 日志處理(logging模塊)

      網(wǎng)友投稿 807 2025-04-06

      LOG


      http://www.cnblogs.com/yyds/p/6901864.html

      logging

      logging 模塊提供模塊級別的函數(shù)記錄日志

      包括四大組件

      1. 日志相關(guān)概念

      日志

      日志的級別(level)

      不同的用戶關(guān)注不同的程序信息

      DEBUG

      INFO

      NOTICE

      WARNING

      ERROR

      CRITICAL

      ALERT

      EMERGENCY

      IO 操作=>不要太頻繁

      LOG的作用

      調(diào)試

      了解軟件的運行情況

      分析定位問題

      日志信息

      time

      地點

      level

      內(nèi)容

      成熟的第三方

      log4j

      log4php

      logging

      2. logging 模塊

      日志級別

      級別可自定義

      DEBUG

      INFO

      WARNING

      ERROR

      CRITICAL

      初始化/寫日志實例需要指定級別,只有當(dāng)級別等于或高于指定級別才被記錄

      使用方式

      直接使用logging(封裝了其他組件)

      logging四大組件直接定制

      2.1 logging 模塊級別的日志

      使用以下幾個函數(shù)

      logging.debug(msg, *args, **kwargs) 創(chuàng)建一條嚴(yán)重級別為DEBUG的日志記錄

      logging.info(msg, *args, **kwargs) 創(chuàng)建一條嚴(yán)重級別為INFO的日志記錄

      logging.warning(msg, *args, **kwargs) 創(chuàng)建一條嚴(yán)重級別為WARNING的日志記錄

      logging.error(msg, *args, **kwargs) 創(chuàng)建一條嚴(yán)重級別為ERROR的日志記錄

      logging.critical(msg, *args, **kwargs) 創(chuàng)建一條嚴(yán)重級別為CRITICAL的日志記錄

      logging.log(level, *args, **kwargs) 創(chuàng)建一條嚴(yán)重級別為level的日志記錄

      logging.basicConfig(**kwargs) 對root logger進行一次性配置

      logging.basicConfig(**kwargs) 對root logger進行一次性配置

      只在第一次調(diào)用的時候起作用

      不配置logger則使用默認(rèn)值

      輸出:sys.stderr

      級別:WARNING

      格式:level:log_name:content

      案例: 01.py

      import logging LOG_FORMAT = "%(asctime)s=====%(levelname)s+++++%(message)s" logging.basicConfig(filename="ruochen.log", level=logging.DEBUG, format=LOG_FORMAT) logging.debug("This is a debug log.") logging.info("This is a info log.") logging.warning("This is a warning log.") logging.error("This is a error log.") logging.critical("This is a critical log.") # 另外一種寫法 logging.log(logging.DEBUG, "This is a debug log.") logging.log(logging.INFO, "This is a info log.") logging.log(logging.WARNING, "This is a warning log.") logging.log(logging.ERROR, "This is a error log.") logging.log(logging.CRITICAL, "This is a critical log.")

      # ruochen.log DEBUG:root:This is a debug log. INFO:root:This is a info log. WARNING:root:This is a warning log. ERROR:root:This is a error log. CRITICAL:root:This is a critical log. DEBUG:root:This is a debug log. INFO:root:This is a info log. WARNING:root:This is a warning log. ERROR:root:This is a error log. CRITICAL:root:This is a critical log. 2019-07-01 09:51:01,181=====DEBUG+++++(message)s 2019-07-01 09:51:01,181=====INFO+++++(message)s 2019-07-01 09:51:01,181=====WARNING+++++(message)s 2019-07-01 09:51:01,181=====ERROR+++++(message)s 2019-07-01 09:51:01,181=====CRITICAL+++++(message)s 2019-07-01 09:51:01,181=====DEBUG+++++(message)s 2019-07-01 09:51:01,181=====INFO+++++(message)s 2019-07-01 09:51:01,181=====WARNING+++++(message)s 2019-07-01 09:51:01,182=====ERROR+++++(message)s 2019-07-01 09:51:01,182=====CRITICAL+++++(message)s 2019-07-01 09:52:24,155=====DEBUG+++++This is a debug log. 2019-07-01 09:52:24,155=====INFO+++++This is a info log. 2019-07-01 09:52:24,155=====WARNING+++++This is a warning log. 2019-07-01 09:52:24,155=====ERROR+++++This is a error log. 2019-07-01 09:52:24,155=====CRITICAL+++++This is a critical log. 2019-07-01 09:52:24,155=====DEBUG+++++This is a debug log. 2019-07-01 09:52:24,156=====INFO+++++This is a info log. 2019-07-01 09:52:24,156=====WARNING+++++This is a warning log. 2019-07-01 09:52:24,156=====ERROR+++++This is a error log. 2019-07-01 09:52:24,156=====CRITICAL+++++This is a critical log.

      format 參數(shù)

      asctime %(asctime)s 日志事件發(fā)生的時間–人類可讀時間,如:2003-07-08 16:49:45,896

      created %(created)f 日志事件發(fā)生的時間–時間戳,就是當(dāng)時調(diào)用time.time()函數(shù)返回的值

      relativeCreated %(relativeCreated)d 日志事件發(fā)生的時間相對于logging模塊加載時間的相對毫秒數(shù)(目前還不知道干嘛用的)

      msecs %(msecs)d 日志事件發(fā)生事件的毫秒部分

      levelname %(levelname)s 該日志記錄的文字形式的日志級別(‘DEBUG’, ‘INFO’, ‘WARNING’, ‘ERROR’, ‘CRITICAL’)

      levelno %(levelno)s 該日志記錄的數(shù)字形式的日志級別(10, 20, 30, 40, 50)

      name %(name)s 所使用的日志器名稱,默認(rèn)是’root’,因為默認(rèn)使用的是 rootLogger

      message %(message)s 日志記錄的文本內(nèi)容,通過 msg % args計算得到的

      pathname %(pathname)s 調(diào)用日志記錄函數(shù)的源碼文件的全路徑

      filename %(filename)s pathname的文件名部分,包含文件后綴

      module %(module)s filename的名稱部分,不包含后綴

      lineno %(lineno)d 調(diào)用日志記錄函數(shù)的源代碼所在的行號

      funcName %(funcName)s 調(diào)用日志記錄函數(shù)的函數(shù)名

      process %(process)d 進程ID

      processName %(processName)s 進程名稱,Python 3.1新增

      thread %(thread)d 線程ID

      threadName %(thread)s 線程名稱

      2.2 logging 模塊的處理流程

      四大組件

      日志器(Logger):產(chǎn)生日志的一個接口

      處理器(Handler):把產(chǎn)生的日志發(fā)送到相應(yīng)的目的地

      過濾器(Filter):更精細(xì)的控制哪些日志輸出

      格式器(Formatter):對輸出信息進行格式化

      logger

      產(chǎn)生一個日志

      操作

      Logger.setLevel() 設(shè)置日志器將會處理的日志消息的最低嚴(yán)重級別

      Logger.addHandler() 和 Logger.removeHandler() 為該logger對象添加 和 移除一個handler對象

      Logger.addFilter() 和 Logger.removeFilter() 為該logger對象添加 和 移除一個filter對象

      Logger.debug: 產(chǎn)生一條debug級別的日志,同理,info,error,等

      Logger.exception(): 創(chuàng)建類似于Logger.error的日志消息

      Logger.log():獲取一個明確的日志level參數(shù)類創(chuàng)建一個日志記錄

      如何得到一個logger對象

      實例化

      logging.getLogger()

      Handler

      吧log發(fā)送到指定位置

      方法

      setLevel

      setFormat

      Python - 日志處理(logging模塊)

      addFilter,removeFilter

      不需要直接使用,Handler是基類

      logging.StreamHandler 將日志消息發(fā)送到輸出到Stream,如std.out, std.err或任何file-like對象。 logging.FileHandler 將日志消息發(fā)送到磁盤文件,默認(rèn)情況下文件大小會無限增長 logging.handlers.RotatingFileHandler 將日志消息發(fā)送到磁盤文件,并支持日志文件按大小切割 logging.hanlders.TimedRotatingFileHandler 將日志消息發(fā)送到磁盤文件,并支持日志文件按時間切割 logging.handlers.HTTPHandler 將日志消息以GET或POST的方式發(fā)送給一個HTTP服務(wù)器 logging.handlers.SMTPHandler 將日志消息發(fā)送給一個指定的email地址 logging.NullHandler 該Handler實例會忽略error messages,通常被想使用logging的library開發(fā)者使用來避免'No handlers could be found for logger XXX'信息的出現(xiàn)。

      Format類

      直接實例化

      可以繼承Format添加特殊內(nèi)容

      三個參數(shù)

      直接實例化

      可以繼承Format添加特殊內(nèi)容

      三個參數(shù)

      fmt:指定消息格式化字符串,如果不指定該參數(shù)則默認(rèn)使用message的原始值

      datefmt:指定日期格式字符串,如果不指定該參數(shù)則默認(rèn)使用"%Y-%m-%d %H:%M:%S"

      style:Python 3.2新增的參數(shù),可取值為 ‘%’, ‘{‘和 ‘$’,如果不指定該參數(shù)則默認(rèn)使用’%’

      Filter類

      可以按Handler和Logger使用

      控制傳遞過來的信息的具體內(nèi)容

      案例02.py

      # 02.py ''' 1. 需求 現(xiàn)在有以下幾個日志記錄的需求 1) 要求將所有級別的所有日志都寫入磁盤文件 2) all.log 文件中記錄所有的日志信息,日志格式為:日期和時間 - 日志級別 - 日志信息 3) error.log文件中單獨記錄error及以上級別的日志信息,日志格式為:日期和時間 - 日志級別 - 文件名[:行號] - 日志信息 4) 要求all.log在每天凌晨進行日志切割 ''' import logging import logging.handlers import datetime # 定義logger logger = logging.getLogger("mylogger") logger.setLevel(logging.DEBUG) # 為兩個不同的文件設(shè)置不同的Handler rf_handler = logging.handlers.TimedRotatingFileHandler("all.log", when='midnight', interval=1, backupCount=7, atTime=datetime.time(0, 0, 0, 0)) rf_handler.setFormatter(logging.Formatter("%(asctime)s - &(levelname)s - %(message)s")) f_handler = logging.FileHandler("error.log") f_handler.setLevel(logging.ERROR) f_handler.setFormatter(logging.Formatter("%(asctime)s - %(levelname)s - %(filename)s[:%(lineno)d] - %(message)s")) # 把相應(yīng)的處理器組裝到logger上 logger.addHandler(rf_handler) logger.addHandler(f_handler) logger.debug('debug message') logger.info('info message') logger.warning('warning message') logger.error('error message') logger.critical('critical message')

      # all.log 2019-07-01 10:48:06,878 - &(levelname)s - debug message 2019-07-01 10:48:06,878 - &(levelname)s - info message 2019-07-01 10:48:06,878 - &(levelname)s - warning message 2019-07-01 10:48:06,879 - &(levelname)s - error message 2019-07-01 10:48:06,879 - &(levelname)s - critical message

      # error.log 2019-07-01 10:48:06,879 - ERROR - 02.py[:36] - error message 2019-07-01 10:48:06,879 - CRITICAL - 02.py[:37] - critical message

      Python 任務(wù)調(diào)度

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:單元格里面插入單元格(在單元格內(nèi)添加單元格)
      下一篇:word文檔復(fù)制不了文字怎么辦(word文檔文字不能復(fù)制)
      相關(guān)文章
      亚洲AV人无码综合在线观看| 亚洲图片校园春色| 亚洲国产成AV人天堂无码| 亚洲午夜免费视频| 亚洲精品国产成人99久久| 亚洲成AV人片在线观看ww| 亚洲国产婷婷六月丁香| 亚洲精品白浆高清久久久久久 | 亚洲区日韩区无码区| 国产亚洲精品第一综合| 国产亚洲男人的天堂在线观看| 激情无码亚洲一区二区三区 | 亚洲视频在线观看免费| 久久久久亚洲精品美女| 亚洲av最新在线网址| 久久精品国产亚洲AV麻豆不卡 | 亚洲欧洲国产日韩精品| 亚洲一区二区三区高清| 亚洲精品在线不卡| 国产精品高清视亚洲精品| 中文字幕乱码亚洲无线三区| 亚洲国产精品久久久久秋霞小| 怡红院亚洲红怡院在线观看| 亚洲JIZZJIZZ中国少妇中文| 中文字幕日韩亚洲| 亚洲桃色AV无码| 婷婷久久久亚洲欧洲日产国码AV| 亚洲最大成人网色| 亚洲一区二区三区不卡在线播放| 国内精品久久久久影院亚洲| 国产精品亚洲天堂| 久久精品亚洲福利| 亚洲国产成人精品无码区在线观看 | 亚洲欧美精品午睡沙发| 亚洲午夜电影在线观看| 国产人成亚洲第一网站在线播放| 亚洲成熟丰满熟妇高潮XXXXX| 亚洲精品A在线观看| 精品亚洲一区二区| 亚洲高清资源在线观看| 中文字幕 亚洲 有码 在线|