亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

python3中的logging記錄日志實(shí)現(xiàn)過(guò)程及封裝成類(lèi)的操作

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

作用:

主要記錄信息,便于定位查看問(wèn)題。

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

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

三種定位問(wèn)題方法:

print

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

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

logger:當(dāng)生產(chǎn)環(huán)境中有問(wèn)題時(shí),可以查看logger定位問(wèn)題

步驟:

1.初始化日志 收集器

2.設(shè)置日志 收集器級(jí)別 -默認(rèn)是warning

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

4.設(shè)置日志 處理器級(jí)別

5.添加handler

6.設(shè)置日志的格式

7.添加日志處理器

8.設(shè)置不同級(jí)別的logger

這里是引用

日志收集器級(jí)別

1.NOSET 0 等于沒(méi)寫(xiě),廢話

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

3.INFO 20 程序正常運(yùn)行時(shí)使用

4.WARNING 30 警告,程序未按預(yù)期運(yùn)行時(shí)使用

5.ERROE 40 程序出錯(cuò)

6.CRITICAL 50 嚴(yán)重問(wèn)題

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

代碼實(shí)現(xiàn)過(guò)程如下:

```python
import logging # 標(biāo)準(zhǔn)庫(kù),直接導(dǎo)入。
logger = logging.getLogger("日志名字") # 初始化日志收集器
logger.setLevel("DEBUG") # 設(shè)置日志收集器級(jí)別

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

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

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

問(wèn)題1:級(jí)別設(shè)置

如當(dāng)設(shè)成debug的時(shí)候,只有高于,等于該級(jí)別的才會(huì)打印

如當(dāng)你設(shè)成warning的時(shí)候,只有warning.error,critical才會(huì)打印

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

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

是debug,就以warning為準(zhǔn),兩個(gè)都設(shè)置,這樣可以添加多個(gè)handler

問(wèn)題2:實(shí)例化

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

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

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

封裝為類(lèi)

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)

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

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

    # 初始化處理器
    # 如果file為空,就執(zhí)行stream_handler,如果有,兩個(gè)都執(zhí)行
    if file:
      file_handler = logging.FileHandler(file)
      # 設(shè)置handler級(jí)別
      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)
# 為了確保每次是同一個(gè)文件,調(diào)用同樣的logger對(duì)象(防止手誤寫(xiě)錯(cuò)文件名字),所以在這里直接初始化logger這個(gè)對(duì)象比較好
# 可以將name,file參數(shù)寫(xiě)入配置文件中(這里我是直接寫(xiě)到了配置文件當(dāng)中,也可以直接傳)
logger = LoggerHandler(config.logger_name,config.level,config.logger_file) 
# logger = LoggerHandler("python21",file="demo.txt")

if __name__ == '__main__':
  logger = LoggerHandler()
  logger.debug("world")
  # 測(cè)試.py:40:root:DEBUG:world - 應(yīng)該是59行打印,因?yàn)樾畔⒃缇捅4娴絣ogger當(dāng)中了 -- 可以直接繼承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當(dāng)中的name
    super().__init__(name) 

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

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

    # 初始化處理器
    # 如果file為空,就執(zhí)行stream_handler,如果有,兩個(gè)都執(zhí)行
    if file:
      file_handler = logging.FileHandler(file)
      # 設(shè)置handler級(jí)別
      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) 
# 為了確保每次是同一個(gè)文件,調(diào)用同樣的logger對(duì)象(防止手誤寫(xiě)錯(cuò)文件名字),所以在這里直接初始化logger這個(gè)對(duì)象比較好
# 可以將name,file參數(shù)寫(xiě)入配置文件中(這里我是直接寫(xiě)到了配置文件當(dāng)中,也可以直接傳)
logger = LoggerHandler(config.logger_name,config.level,config.logger_file)
# logger = LoggerHandler("python21",file="demo.txt") 

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

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

最近要寫(xiě)一個(gè)python程序?qū)懭罩镜絩syslog中,并通過(guò)配置rsyslog的文件來(lái)將他存到一個(gè)指定文件中。

首先,我想來(lái)看看logging提供的常用模塊:

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

不指定name就默認(rèn)為root。

這里可以取一個(gè)合適的名字。

相同的name會(huì)返回同一個(gè)logger對(duì)象。在Formatter方法中用%(name)s在日志中打印出這個(gè)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等。這里可以通過(guò)addHandler方法添加多個(gè)handler,可以實(shí)現(xiàn)日志的分級(jí)過(guò)濾。如果要把日志發(fā)送到rsyslog中,就可以采用SysLogHandler(),使用這個(gè)方法前需要導(dǎo)入他

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

log_hdlr=SysLogHandler(facility=SysLogHandler.LOG_LOCAL5, address='/dev/log')
對(duì)應(yīng)的rsyslog設(shè)置文件(/etc/rsyslog.conf):

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

如果想用handler對(duì)日志信息進(jìn)行過(guò)濾,可以這樣:

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

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

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

將日志寫(xiě)入到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')#指明級(jí)別為debug
log.error('error message test')#指明級(jí)別為error
#最后只保存error及更高優(yōu)先級(jí)的日志

可能有些地方說(shuō)的不對(duì),還望大家能夠指正!

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

相關(guān)文章

最新評(píng)論