欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python中內(nèi)置的日志模塊logging用法詳解

 更新時間:2016年07月12日 15:00:25   作者:Kevin_Yang  
Python的logging模塊提供了記錄程序運行情況的日志功能,類似于Apache的log4j,很好很強大,這里我們就來看一下Python中內(nèi)置的日志模塊logging用法詳解

logging模塊簡介

Python的logging模塊提供了通用的日志系統(tǒng),可以方便第三方模塊或者是應(yīng)用使用。這個模塊提供不同的日志級別,并可以采用不同的方式記錄日志,比如文件,HTTP GET/POST,SMTP,Socket等,甚至可以自己實現(xiàn)具體的日志記錄方式。
logging模塊與log4j的機制是一樣的,只是具體的實現(xiàn)細節(jié)不同。模塊提供logger,handler,filter,formatter。

  • logger:提供日志接口,供應(yīng)用代碼使用。logger最長用的操作有兩類:配置和發(fā)送日志消息??梢酝ㄟ^logging.getLogger(name)獲取logger對象,如果不指定name則返回root對象,多次使用相同的name調(diào)用getLogger方法返回同一個logger對象。
  • handler:將日志記錄(log record)發(fā)送到合適的目的地(destination),比如文件,socket等。一個logger對象可以通過addHandler方法添加0到多個handler,每個handler又可以定義不同日志級別,以實現(xiàn)日志分級過濾顯示。
  •  filter:提供一種優(yōu)雅的方式?jīng)Q定一個日志記錄是否發(fā)送到handler。
  •  formatter:指定日志記錄輸出的具體格式。formatter的構(gòu)造方法需要兩個參數(shù):消息的格式字符串和日期字符串,這兩個參數(shù)都是可選的。

與log4j類似,logger,handler和日志消息的調(diào)用可以有具體的日志級別(Level),只有在日志消息的級別大于logger和handler的級別。

logging用法解析

1. 初始化 logger = logging.getLogger("endlesscode"),getLogger()方法后面最好加上所要日志記錄的模塊名字,后面的日志格式中的%(name)s 對應(yīng)的是這里的模塊名字
2. 設(shè)置級別 logger.setLevel(logging.DEBUG),Logging中有NOTSET < DEBUG < INFO < WARNING < ERROR < CRITICAL這幾種級別,日志會記錄設(shè)置級別以上的日志
3. Handler,常用的是StreamHandler和FileHandler,windows下你可以簡單理解為一個是console和文件日志,一個打印在CMD窗口上,一個記錄在一個文件上
4. formatter,定義了最終log信息的順序,結(jié)構(gòu)和內(nèi)容,我喜歡用這樣的格式 '[%(asctime)s] [%(levelname)s] %(message)s', '%Y-%m-%d %H:%M:%S',
%(name)s Logger的名字
%(levelname)s 文本形式的日志級別
%(message)s 用戶輸出的消息
%(asctime)s 字符串形式的當(dāng)前時間。默認(rèn)格式是 “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 當(dāng)前時間,用UNIX標(biāo)準(zhǔn)的表示時間的浮 點數(shù)表示
%(relativeCreated)d 輸出日志信息時的,自Logger創(chuàng)建以 來的毫秒數(shù)
%(thread)d 線程ID??赡軟]有
%(threadName)s 線程名。可能沒有
%(process)d 進程ID??赡軟]有
5. 記錄 使用object.debug(message)來記錄日志
下面來寫一個實例,在CMD窗口上只打出error以上級別的日志,但是在日志中打出debug以上的信息

import logging
logger = logging.getLogger("simple_example")
logger.setLevel(logging.DEBUG)
# 建立一個filehandler來把日志記錄在文件里,級別為debug以上
fh = logging.FileHandler("spam.log")
fh.setLevel(logging.DEBUG)
# 建立一個streamhandler來把日志打在CMD窗口上,級別為error以上
ch = logging.StreamHandler()
ch.setLevel(logging.ERROR)
# 設(shè)置日志格式
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
ch.setFormatter(formatter)
fh.setFormatter(formatter)
#將相應(yīng)的handler添加在logger對象中
logger.addHandler(ch)
logger.addHandler(fh)
# 開始打日志
logger.debug("debug message")
logger.info("info message")
logger.warn("warn message")
logger.error("error message")
logger.critical("critical message")

運行一下將會看到CMD窗口只記錄兩條,spam.log中記錄了五條日志

2016712145241018.jpg (773×353)

當(dāng)一個項目比較大的時候,不同的文件中都要用到Log,可以考慮將其封裝為一個類來使用

#! /usr/bin/env python
#coding=gbk
import logging,os

class Logger:
 def __init__(self, path,clevel = logging.DEBUG,Flevel = logging.DEBUG):
  self.logger = logging.getLogger(path)
  self.logger.setLevel(logging.DEBUG)
  fmt = logging.Formatter('[%(asctime)s] [%(levelname)s] %(message)s', '%Y-%m-%d %H:%M:%S')
  #設(shè)置CMD日志
  sh = logging.StreamHandler()
  sh.setFormatter(fmt)
  sh.setLevel(clevel)
  #設(shè)置文件日志
  fh = logging.FileHandler(path)
  fh.setFormatter(fmt)
  fh.setLevel(Flevel)
  self.logger.addHandler(sh)
  self.logger.addHandler(fh)

 def debug(self,message):
  self.logger.debug(message)

 def info(self,message):
  self.logger.info(message)

 def war(self,message):
  self.logger.warn(message)

 def error(self,message):
  self.logger.error(message)

 def cri(self,message):
  self.logger.critical(message)

if __name__ =='__main__':
 logyyx = Logger('yyx.log',logging.ERROR,logging.DEBUG)
 logyyx.debug('一個debug信息')
 logyyx.info('一個info信息')
 logyyx.war('一個warning信息')
 logyyx.error('一個error信息')
 logyyx.cri('一個致命critical信息')

這樣每次使用的時候只要實例化一個對象就可以了

logobj = Logger(‘filename',clevel,Flevel)

如果想在CMD窗口中對于error的日志標(biāo)紅,warning的日志標(biāo)黃,那么可以使用ctypes模塊

2016712145318276.jpg (732×225)

#! /usr/bin/env python
#coding=gbk
import logging,os
import ctypes

FOREGROUND_WHITE = 0x0007
FOREGROUND_BLUE = 0x01 # text color contains blue.
FOREGROUND_GREEN= 0x02 # text color contains green.
FOREGROUND_RED = 0x04 # text color contains red.
FOREGROUND_YELLOW = FOREGROUND_RED | FOREGROUND_GREEN

STD_OUTPUT_HANDLE= -11
std_out_handle = ctypes.windll.kernel32.GetStdHandle(STD_OUTPUT_HANDLE)
def set_color(color, handle=std_out_handle):
 bool = ctypes.windll.kernel32.SetConsoleTextAttribute(handle, color)
 return bool

class Logger:
 def __init__(self, path,clevel = logging.DEBUG,Flevel = logging.DEBUG):
  self.logger = logging.getLogger(path)
  self.logger.setLevel(logging.DEBUG)
  fmt = logging.Formatter('[%(asctime)s] [%(levelname)s] %(message)s', '%Y-%m-%d %H:%M:%S')
  #設(shè)置CMD日志
  sh = logging.StreamHandler()
  sh.setFormatter(fmt)
  sh.setLevel(clevel)
  #設(shè)置文件日志
  fh = logging.FileHandler(path)
  fh.setFormatter(fmt)
  fh.setLevel(Flevel)
  self.logger.addHandler(sh)
  self.logger.addHandler(fh)

 def debug(self,message):
  self.logger.debug(message)

 def info(self,message):
  self.logger.info(message)

 def war(self,message,color=FOREGROUND_YELLOW):
  set_color(color)
  self.logger.warn(message)
  set_color(FOREGROUND_WHITE)

 def error(self,message,color=FOREGROUND_RED):
  set_color(color)
  self.logger.error(message)
  set_color(FOREGROUND_WHITE)

 def cri(self,message):
  self.logger.critical(message)

if __name__ =='__main__':
 logyyx = Logger('yyx.log',logging.WARNING,logging.DEBUG)
 logyyx.debug('一個debug信息')
 logyyx.info('一個info信息')
 logyyx.war('一個warning信息')
 logyyx.error('一個error信息')
 logyyx.cri('一個致命critical信息')

多模塊使用logging
logging模塊保證在同一個python解釋器內(nèi),多次調(diào)用logging.getLogger('log_name')都會返回同一個logger實例,即使是在多個模塊的情況下。所以典型的多模塊場景下使用logging的方式是在main模塊中配置logging,這個配置會作用于多個的子模塊,然后在其他模塊中直接通過getLogger獲取Logger對象即可。
配置文件:

[loggers] 
keys=root,main 
 
[handlers] 
keys=consoleHandler,fileHandler 
 
[formatters] 
keys=fmt 
 
[logger_root] 
level=DEBUG 
handlers=consoleHandler 
 
[logger_main] 
level=DEBUG 
qualname=main 
handlers=fileHandler 
 
[handler_consoleHandler] 
class=StreamHandler 
level=DEBUG 
formatter=fmt 
args=(sys.stdout,) 
 
[handler_fileHandler] 
class=logging.handlers.RotatingFileHandler 
level=DEBUG 
formatter=fmt 
args=('tst.log','a',20000,5,) 
 
[formatter_fmt] 
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s 
datefmt= 

主模塊main.py:

import logging 
import logging.config 
 
logging.config.fileConfig('logging.conf') 
root_logger = logging.getLogger('root') 
root_logger.debug('test root logger...') 
 
logger = logging.getLogger('main') 
logger.info('test main logger') 
logger.info('start import module \'mod\'...') 
import mod 
 
logger.debug('let\'s test mod.testLogger()') 
mod.testLogger() 
 
root_logger.info('finish test...') 

子模塊mod.py:

import logging 
import submod 
 
logger = logging.getLogger('main.mod') 
logger.info('logger of mod say something...') 
 
def testLogger(): 
  logger.debug('this is mod.testLogger...') 
  submod.tst() 

子子模塊submod.py:

import logging 
 
logger = logging.getLogger('main.mod.submod') 
logger.info('logger of submod say something...') 
 
def tst(): 
  logger.info('this is submod.tst()...') 

然后運行python main.py,控制臺輸出:

2012-03-09 18:22:22,793 - root - DEBUG - test root logger... 
2012-03-09 18:22:22,793 - main - INFO - test main logger 
2012-03-09 18:22:22,809 - main - INFO - start import module 'mod'... 
2012-03-09 18:22:22,809 - main.mod.submod - INFO - logger of submod say something... 
2012-03-09 18:22:22,809 - main.mod - INFO - logger say something... 
2012-03-09 18:22:22,809 - main - DEBUG - let's test mod.testLogger() 
2012-03-09 18:22:22,825 - main.mod - DEBUG - this is mod.testLogger... 
2012-03-09 18:22:22,825 - main.mod.submod - INFO - this is submod.tst()... 
2012-03-09 18:22:22,841 - root - INFO - finish test... 

可以看出,和預(yù)想的一樣,然后在看一下tst.log,logger配置中的輸出的目的地:

2012-03-09 18:22:22,793 - main - INFO - test main logger 
2012-03-09 18:22:22,809 - main - INFO - start import module 'mod'... 
2012-03-09 18:22:22,809 - main.mod.submod - INFO - logger of submod say something... 
2012-03-09 18:22:22,809 - main.mod - INFO - logger say something... 
2012-03-09 18:22:22,809 - main - DEBUG - let's test mod.testLogger() 
2012-03-09 18:22:22,825 - main.mod - DEBUG - this is mod.testLogger... 
2012-03-09 18:22:22,825 - main.mod.submod - INFO - this is submod.tst()... 

tst.log中沒有root logger輸出的信息,因為logging.conf中配置了只有main logger及其子logger使用RotatingFileHandler,而root logger是輸出到標(biāo)準(zhǔn)輸出。

相關(guān)文章

  • 利用Python實現(xiàn)可回滾方案的示例代碼

    利用Python實現(xiàn)可回滾方案的示例代碼

    很多項目翻車不是因為不會做,而是走錯了方向卻沒法回頭,技術(shù)選型失敗的風(fēng)險我們都清楚,但真正能提前規(guī)劃“回滾方案”的人不多,本文從實際項目出發(fā),教你如何用 Python 構(gòu)建一套“可回退、可灰度、可對比”的技術(shù)架構(gòu)方案,附帶完整 Demo,需要的朋友可以參考下
    2025-05-05
  • conda虛擬環(huán)境使用pip下載包到當(dāng)前環(huán)境的兩種方法

    conda虛擬環(huán)境使用pip下載包到當(dāng)前環(huán)境的兩種方法

    conda管理包很方便,但并不是所有包都有最新的conda版本,所以仍需要使用conda中的pip來安裝包,下面這篇文章主要給大家介紹了關(guān)于conda虛擬環(huán)境使用pip下載包到當(dāng)前環(huán)境的兩種方法,需要的朋友可以參考下
    2022-08-08
  • python如何可視化經(jīng)緯度信息

    python如何可視化經(jīng)緯度信息

    在Python中處理經(jīng)緯度信息,首先通過篩選得到符合條件的停車點,并去除重復(fù)數(shù)據(jù),利用這些數(shù)據(jù)點的索引值將原始數(shù)據(jù)進行分段,并繪制地圖,處理重復(fù)數(shù)據(jù)時可以使用set()方法或列表生成式,最后,可以通過DataFrame的join方法合并具有相同索引值的數(shù)據(jù)
    2024-09-09
  • django model 條件過濾 queryset.filter(**condtions)用法詳解

    django model 條件過濾 queryset.filter(**condtions)用法詳解

    這篇文章主要介紹了django model 條件過濾 queryset.filter(**condtions)用法詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-05-05
  • 深入理解python中的ThreadLocal

    深入理解python中的ThreadLocal

    本文主要介紹了深入理解python中的ThreadLocal,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • Python實現(xiàn)批量壓縮解壓文件(zip、rar)

    Python實現(xiàn)批量壓縮解壓文件(zip、rar)

    Python是一種廣泛使用的編程語言,非常適合處理各種任務(wù),包括批量解壓縮文件,本文主要介紹了Python實現(xiàn)批量壓縮解壓文件,具有一定的參考價值,感興趣的可以了解一下
    2023-09-09
  • Python實現(xiàn)自動識別并批量轉(zhuǎn)換文本文件編碼

    Python實現(xiàn)自動識別并批量轉(zhuǎn)換文本文件編碼

    這篇文章主要為大家詳細介紹了如何利用Python實現(xiàn)自動識別并批量轉(zhuǎn)換文本文件編碼的功能,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下
    2023-03-03
  • 3個適合新手練習(xí)的python小游戲

    3個適合新手練習(xí)的python小游戲

    這篇文章主要分析的是3個適合新手練習(xí)的python小游戲,初學(xué)者嘛就應(yīng)該多練手,下文分享的python小游戲歡迎大家來玩,需要的小伙伴也可以參考一下
    2022-01-01
  • 使用Python代碼實現(xiàn)PDF文檔與SVG文件之間的轉(zhuǎn)換

    使用Python代碼實現(xiàn)PDF文檔與SVG文件之間的轉(zhuǎn)換

    PDF作為普遍采用的文件格式,確保了文檔的一致性和可靠性,而SVG(可縮放矢量圖形)則因其矢量性質(zhì),在網(wǎng)頁設(shè)計、高分辨率打印及動態(tài)交互內(nèi)容中展現(xiàn)出無與倫比的優(yōu)勢,本文將介紹如何使用Python將PDF文件轉(zhuǎn)換為SVG文件以及將SVG文件轉(zhuǎn)換為PDF文件,需要的朋友可以參考下
    2024-05-05
  • pytorch cnn 識別手寫的字實現(xiàn)自建圖片數(shù)據(jù)

    pytorch cnn 識別手寫的字實現(xiàn)自建圖片數(shù)據(jù)

    這篇文章主要介紹了pytorch cnn 識別手寫的字實現(xiàn)自建圖片數(shù)據(jù),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05

最新評論