最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python3中的logging記錄日志實現(xiàn)過程及封裝成類的操作

 更新時間:2020年05月12日 11:50:53   作者:國民老公六哥  
這篇文章主要介紹了python3中的logging記錄日志實現(xiàn)過程及封裝成類的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

作用:

主要記錄信息,便于定位查看問題。

python logging模塊官網(wǎng):

https://docs.python.org/zh-cn/3.7/library/logging.html#formatter-objects

三種定位問題方法:

print

debug調(diào)試:代碼寫好后,就不需要再進行調(diào)試了,所以引入了logger

logging.debug() – 一般在測試環(huán)境中用

logger:當生產(chǎn)環(huán)境中有問題時,可以查看logger定位問題

步驟:

1.初始化日志 收集器

2.設置日志 收集器級別 -默認是warning

3.初始化日志 處理器 - 可以理解為寫日志的筆

4.設置日志 處理器級別

5.添加handler

6.設置日志的格式

7.添加日志處理器

8.設置不同級別的logger

這里是引用

日志收集器級別

1.NOSET 0 等于沒寫,廢話

2.DEBUG 10 程序調(diào)試bug時使用

3.INFO 20 程序正常運行時使用

4.WARNING 30 警告,程序未按預期運行時使用

5.ERROE 40 程序出錯

6.CRITICAL 50 嚴重問題

如何定義級別:自己定的 可以結(jié)合try: except: 記錄log

代碼實現(xiàn)過程如下:

```python
import logging # 標準庫,直接導入。
logger = logging.getLogger("日志名字") # 初始化日志收集器
logger.setLevel("DEBUG") # 設置日志收集器級別

handler = logging.FileHandler("日志路徑") # 初始化日志處理器 - 文件輸出(指定位置使用絕對路徑,默認當前目錄下)
handler.setLevel("warning") # 設置日志處理器級別 默認warning

console_handler = logging.StreamHandler() # 控制臺輸出
console_handler.setLevel("DEBUG")

logger.addHandler(handler) # 添加handler
logger.addHandler(console_handler)
 # 設置日志格式,中間間隔使用冒號也可以(模塊名字-報錯行-收集器名字-級別-信息)
fmt = logging.Formatter("%(filename)s-%(lineno)s-%(name)s-%(levelname)s-%(massage)s")
handler.setFormat(fmt) # 日志輪轉(zhuǎn) - 添加日志處理器
# 設置不同級別的logger -- 選擇一個級別就可以
logging.info("")
logging.debug("")
logging.waring("")
logging.error("")
logging.critical("")

問題1:級別設置

如當設成debug的時候,只有高于,等于該級別的才會打印

如當你設成warning的時候,只有warning.error,critical才會打印

不用管(日志收集器)的級別是啥,這里設置就以(日志處理器)的級別

為準,兩者中選擇最高的如果(日志收集器)是warning,(日志處理器)

是debug,就以warning為準,兩個都設置,這樣可以添加多個handler

問題2:實例化

在模塊中直接實例化,如果在外部實例化,容易造成多個日志文件的生成

問題3:日志格式設置,python logging官網(wǎng),查找需要用到的。

https://docs.python.org/zh-cn/3.7/library/logging.html#formatter-objects

封裝為類

import logging
class LoggerHandler(logging.Logger):

  def __init__(self,
         name="root",
         level="DEBUG",
         file=None,
         format="%(filename)s:%(lineno)d:%(name)s:%(levelname)s:%(message)s"
         ):

    # 初始化日志收集器
    logger = logging.getLogger(name)

    # 設置收集器級別
    logger.setLevel(level) # 繼承了Logger 返回的實例就是自己

    # 初始化format,設置格式
    fmt = logging.Formatter(format)

    # 初始化處理器
    # 如果file為空,就執(zhí)行stream_handler,如果有,兩個都執(zhí)行
    if file:
      file_handler = logging.FileHandler(file)
      # 設置handler級別
      file_handler.setLevel(level)
      # 添加handler
      logger.addHandler(file_handler)
      # 添加日志處理器
      file_handler.setFormatter(fmt)

    stream_handler = logging.StreamHandler()
    stream_handler.setLevel(level)
    logger.addHandler(stream_handler)
    stream_handler.setFormatter(fmt)

    self.logger = logger

	  def debug(self, msg):
	    return self.logger.debug(msg)
	  def info(self,msg):
	    return self.logger.info(msg)

	  def warning(self,msg):
	    return self.logger.warning(msg)
	 
	  def error(self,msg):
	    return self.logger.error(msg)
	 
	  def critical(self,msg):
	    return self.logger.critical(msg)
# 為了確保每次是同一個文件,調(diào)用同樣的logger對象(防止手誤寫錯文件名字),所以在這里直接初始化logger這個對象比較好
# 可以將name,file參數(shù)寫入配置文件中(這里我是直接寫到了配置文件當中,也可以直接傳)
logger = LoggerHandler(config.logger_name,config.level,config.logger_file) 
# logger = LoggerHandler("python21",file="demo.txt")

if __name__ == '__main__':
  logger = LoggerHandler()
  logger.debug("world")
  # 測試.py:40:root:DEBUG:world - 應該是59行打印,因為信息早就保存到logger當中了 -- 可以直接繼承l(wèi)ogging.Logger使用  

重新封裝 - 繼承l(wèi)ogger后,發(fā)現(xiàn)可以直接定位到哪一行打印,可以查看源碼

import logging

class LoggerHandler(logging.Logger):

  def __init__(self,
         name="root",
         level="DEBUG",
         file=None,
         format="%(filename)s:%(lineno)d:%(name)s:%(levelname)s:%(message)s"
         ):

    # logger(name) 直接超繼承l(wèi)ogger當中的name
    super().__init__(name) 

    # 設置收集器級別
    # logger.setLevel(level)
    self.setLevel(level) # 繼承了Logger 返回的實例就是自己

    # 初始化format,設置格式
    fmt = logging.Formatter(format)

    # 初始化處理器
    # 如果file為空,就執(zhí)行stream_handler,如果有,兩個都執(zhí)行
    if file:
      file_handler = logging.FileHandler(file)
      # 設置handler級別
      file_handler.setLevel(level)
      # 添加handler
      self.addHandler(file_handler)
      # 添加日志處理器
      file_handler.setFormatter(fmt)

    stream_handler = logging.StreamHandler()
    stream_handler.setLevel(level)
    self.addHandler(stream_handler)
    stream_handler.setFormatter(fmt) 
# 為了確保每次是同一個文件,調(diào)用同樣的logger對象(防止手誤寫錯文件名字),所以在這里直接初始化logger這個對象比較好
# 可以將name,file參數(shù)寫入配置文件中(這里我是直接寫到了配置文件當中,也可以直接傳)
logger = LoggerHandler(config.logger_name,config.level,config.logger_file)
# logger = LoggerHandler("python21",file="demo.txt") 

if __name__ == '__main__':
  logger = LoggerHandler()
  logger.debug("world")
  # 繼承后---測試.py:44:root:DEBUG:world

補充知識:python3使用logging包,把日志寫到系統(tǒng)的rsyslog中

最近要寫一個python程序?qū)懭罩镜絩syslog中,并通過配置rsyslog的文件來將他存到一個指定文件中。

首先,我想來看看logging提供的常用模塊:

logger:logger主要是用來配置和發(fā)送日志消息的??赏ㄟ^logging.getLogger(name)來返回一個logger對象。

不指定name就默認為root。

這里可以取一個合適的名字。

相同的name會返回同一個logger對象。在Formatter方法中用%(name)s在日志中打印出這個name。例如:

log = logging.getLogger('mylog')
log_format = logging.Formatter(
  'hhl-%(name)s-server[%(process)d]-%(levelname)s: %(message)s')
 
#打印結(jié)果示例:
#Aug 2 12:44:41 [localhost] hhl-mylog-server[7409]-DEBUG: debug message
handler:將日志記錄發(fā)送到目的地,如文件,socket等。這里可以通過addHandler方法添加多個handler,可以實現(xiàn)日志的分級過濾。如果要把日志發(fā)送到rsyslog中,就可以采用SysLogHandler(),使用這個方法前需要導入他

from logging.handlers import SysLogHandler
這個方法有兩個參數(shù)、一個是rsyslog中的facility:指定的是發(fā)送的設備,如kernel,mail,system等等,他還有l(wèi)ocal0-local7預留。這里我采用local5。還有一個參數(shù)指定的是log程序的地址,在centos7上默認是/dev/log。示例如下:

log_hdlr=SysLogHandler(facility=SysLogHandler.LOG_LOCAL5, address='/dev/log')
對應的rsyslog設置文件(/etc/rsyslog.conf):

local5.*   /var/log/all.log
#將local5的所有日志存入all.log文件中

如果想用handler對日志信息進行過濾,可以這樣:

log_hdlr.setLevel(logging.ERROR)
#這里就指定了接收error以及更高級別的日志
 

formatter:指定日志的輸出格式,包括消息格式和日期字符格式,例如:

log_format = logging.Formatter(
  'hhl-%(name)s-server[%(process)d]-%(levelname)s: %(message)s')
#輸出示例
#Aug 2 12:44:41 [localhost] hhl-mylog-server[7409]-DEBUG: debug message

formatter可調(diào)用參數(shù)有:

%(name)s Logger的名字
%(levelname)s 文本形式的日志級別
%(message)s 用戶輸出的消息
%(asctime)s 字符串形式的當前時間。默認格式是 “2003-07-08 16:49:45,896”。逗號后面的是毫秒
%(levelno)s 數(shù)字形式的日志級別
%(pathname)s 調(diào)用日志輸出函數(shù)的模塊的完整路徑名,可能沒有
%(filename)s 調(diào)用日志輸出函數(shù)的模塊的文件名
%(module)s 調(diào)用日志輸出函數(shù)的模塊名
%(funcName)s 調(diào)用日志輸出函數(shù)的函數(shù)名
%(lineno)d 調(diào)用日志輸出函數(shù)的語句所在的代碼行
%(created)f 當前時間,用UNIX標準的表示時間的浮 點數(shù)表示
%(relativeCreated)d 輸出日志信息時的,自Logger創(chuàng)建以 來的毫秒數(shù)
%(thread)d 線程ID??赡軟]有
%(threadName)s 線程名。可能沒有
%(process)d 進程ID??赡軟]有

由上面的這些模塊就可以實現(xiàn)我想要的功能啦

將日志寫入到all.log文件中-----源代碼:

import logging
from logging.handlers import SysLogHandler
 
log = logging.getLogger('mylog')
log.setLevel(logging.DEBUG)
log_hdlr=SysLogHandler(facility=SysLogHandler.LOG_LOCAL5, address='/dev/log')
log_format = logging.Formatter(
  'hhl-%(name)s-server[%(process)d]-%(levelname)s: %(message)s')
log_hdlr.setFormatter(log_format)
log_hdlr.setLevel(logging.ERROR)#接受error及以上的日志信息
log.addHandler(log_hdlr)
log.debug('debug message test')#指明級別為debug
log.error('error message test')#指明級別為error
#最后只保存error及更高優(yōu)先級的日志

可能有些地方說的不對,還望大家能夠指正!

以上這篇python3中的logging記錄日志實現(xiàn)過程及封裝成類的操作就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 教你如何用python開發(fā)一款數(shù)字推盤小游戲

    教你如何用python開發(fā)一款數(shù)字推盤小游戲

    這篇文章主要介紹了教你如何用python開發(fā)一款數(shù)字推盤小游戲,文中有非常詳細的代碼示例,喜對歡玩小游戲的或者正在學習python小游戲開發(fā)的小伙伴們有很好的幫助,需要的朋友可以參考下
    2021-04-04
  • python中的format格式化、填充與對齊、數(shù)字格式化方式

    python中的format格式化、填充與對齊、數(shù)字格式化方式

    format函數(shù)是Python中強大的字符串格式化方法,它允許程序員通過大括號{}來為字符串中的插入點占位,并通過傳入?yún)?shù)進行替換,{0}、{1}分別代表不同的參數(shù)
    2024-09-09
  • Python讀取文件的8種常用方式

    Python讀取文件的8種常用方式

    這篇文章主要給大家介紹了關(guān)于Python讀取文件的8種常用方式,在編程語言中,文件讀寫是最常見的IO操作,文中通過代碼示例介紹的非常詳細,需要的朋友可以參考下
    2023-09-09
  • 解決安裝torch后,torch.cuda.is_available()結(jié)果為false的問題

    解決安裝torch后,torch.cuda.is_available()結(jié)果為false的問題

    這篇文章主要介紹了解決安裝torch后,torch.cuda.is_available()結(jié)果為false的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • Python3中Sanic中間件的使用

    Python3中Sanic中間件的使用

    Sanic框架中的中間件是一種強大的工具,本文就來介紹Python3中Sanic中間件的使用,具有一定的參考價值,感興趣的可以了解一下
    2025-01-01
  • python學生管理系統(tǒng)開發(fā)

    python學生管理系統(tǒng)開發(fā)

    這篇文章主要為大家詳細介紹了基礎(chǔ)版和函數(shù)版的python學生管理系統(tǒng)開發(fā),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • 基于python3 OpenCV3實現(xiàn)靜態(tài)圖片人臉識別

    基于python3 OpenCV3實現(xiàn)靜態(tài)圖片人臉識別

    這篇文章主要為大家詳細介紹了基于Python3 OpenCV3實現(xiàn)靜態(tài)圖片人臉識別,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • django之對FileField字段的upload_to的設定方法

    django之對FileField字段的upload_to的設定方法

    今天小編就為大家分享一篇django之對FileField字段的upload_to的設定方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • python實現(xiàn)的文件同步服務器實例

    python實現(xiàn)的文件同步服務器實例

    這篇文章主要介紹了python實現(xiàn)的文件同步服務器,實例分析了文件同步服務器的原理及客戶端、服務端的實現(xiàn)技巧,需要的朋友可以參考下
    2015-06-06
  • Python Pandas處理csv文件常用示例

    Python Pandas處理csv文件常用示例

    Pandas是一個非常強大的數(shù)據(jù)操作python包,支持各種數(shù)據(jù)格式,包括CSV文件,本文就來介紹一下Python Pandas處理csv文件常用示例,感興趣的可以了解一下
    2023-12-12

最新評論

米脂县| 石河子市| 玉山县| 周宁县| 西乌珠穆沁旗| 开封县| 正定县| 阿尔山市| 平利县| 炎陵县| 文安县| 汽车| 江山市| 宁强县| 西丰县| 汝南县| 阜新市| 南丰县| 凤庆县| 宁城县| 葫芦岛市| 顺义区| 南宫市| 安陆市| 平潭县| 南通市| 抚宁县| 博客| 清河县| 视频| 外汇| 纳雍县| 长岛县| 二手房| 远安县| 苏尼特左旗| 长沙县| 喀什市| 惠州市| 阿巴嘎旗| 普安县|