python打印日志方法的使用教程(logging模塊)
一、必備技能
1、logging模塊的使用
(1)5個日志等級/以及5個輸出日志的內(nèi)置函數(shù)
(2)日志收集器、日志輸出渠道的概念
(3)如何自定義日志收集器
(4)如何封裝自定義的日志收集器
二、logging
python的官方庫,打印日志用的,無需安裝,使用時(shí)直接調(diào)用
1、logging的基本使用
1.1、日志的五個等級(DEBUG/INFO/WARNING/ERROR/CRITICAL)
(1)DEBUG:調(diào)試模式下的日志,只給程序員看的日志
(2)INFO:程序正常運(yùn)行的時(shí)候輸出的日志
(3)WARN/WARNING:警告信息,當(dāng)前程序還可以運(yùn)行,后面有可能出現(xiàn)問題
(4)ERROR:程序執(zhí)行過程總的錯誤信息
(5)CRITICAL:發(fā)生嚴(yán)重錯誤,阻塞流程,程序可能無法繼續(xù)運(yùn)行
1.2、打印不同日志等級的方法:
(1)logging.debug("調(diào)試日志信息")
(2)logging.info("重要日志信息")
(3)logging.warning("警告日志信息")
(4)logging.error("錯誤日志信息")
(5)logging.critical("致命日志信息")
1.3、日志收集器和日志輸出渠道:
日志收集器:
默認(rèn)收集器的名字為root,默認(rèn)收集等級為WARNING,通過如下步驟設(shè)置收集器的等級
log = logging.getLogger() # 獲取日志收集器,默認(rèn)為root
log.setLevel("等級") # 等級必須大寫
logging.basicConfig(level=logging.DEBUG) # 設(shè)置收集器的等級
日志輸出渠道:
默認(rèn)輸出等級為WARNING
輸出渠道支持:輸出到文件夾和輸出到控制臺
Demo實(shí)例1——默認(rèn)WARNING等級
import logging
# 打印不同等級的日志(debug、info、warning、error、critical)
# 如下5條日志,只會打印WARNING等級以后的日志
logging.debug("這是一條debug級別的日志")
logging.info("這是一條info級別的日志")
logging.warning("這是一條warning級別的日志")
logging.error("這是一條error級別的日志")
logging.critical("這是一條critical級別的日志")運(yùn)行結(jié)果 :(只會打印WARNING級別以上的日志)
WARNING:root:這是一條warning級別的日志
ERROR:root:這是一條error級別的日志
CRITICAL:root:這是一條critical級別的日志
Demo實(shí)例2——默認(rèn)的日志收集器
import logging
# # logging.basicConfig(level=logging.DEBUG) 設(shè)置日志級別
# 未指定name,默認(rèn)返回自帶的默認(rèn)的root收集器
# 默認(rèn)輸出WARN級別以上的等級日志
# 如果設(shè)置了WARNING以下的等級,則輸出WARNING等級以上的日志
# 如果設(shè)置了WARNING以上的等級,比如設(shè)置了ERROR,則輸出ERROR等級以上的日志
log = logging.getLogger()
# log.setLevel("DEBUG")
# log.setLevel("INFO")
# log.setLevel("WARNING")
log.setLevel("ERROR")
# log.setLevel("CRITICAL")
logging.debug("這是一條debug級別的日志")
logging.info("這是一條info級別的日志")
logging.warning("這是一條warning級別的日志")
logging.error("這是一條error級別的日志")
logging.critical("這是一條critical級別的日志")運(yùn)行結(jié)果:
ERROR:root:這是一條error級別的日志
CRITICAL:root:這是一條critical級別的日志
2、自定義日志收集器
2.1、創(chuàng)建日志收集器
log = logging.getLogger(name="rose_logger")
不傳name參數(shù)時(shí),默認(rèn)返回收集器名字為“root”
傳了name參數(shù)時(shí),會創(chuàng)建一個新的日志收集器
2.2、創(chuàng)建日志收集渠道
(1)輸出到控制臺:
pycharm = logging.StreamHandler()
(2)輸出到文件:
file = logging.FileHandler(os.getcwd()+r"\rose.log",encoding="utf-8")
file=handlers.TimedRotatingFileHandler(filename="test.log",when="D",interval=1,backupCount=10,encoding="utf-8")
注意點(diǎn)(參數(shù)):
filename, 日志的文件名稱(包含路徑)
when= 'h', 日志的切割單位
# S - Seconds 秒
# M - Minutes 分鐘
# H - Hours 小時(shí)
# D - Days 天(24小時(shí))
# midnight - roll over at midnight 日切
# W{0-6} - roll over on a certain day; 0 - Monday 周
interval=1, 滾動周期,與when='h'連動,1-表示以時(shí)間為周期
backupCount=0 保留日志文件的個數(shù),設(shè)置為10,永遠(yuǎn)只保存最近的10個文件
2.3、創(chuàng)建日志的輸出格式 (1)創(chuàng)建日志格式對象
pycharm_fmt = logging.Formatter(fmt=fmt1)
(2)將日志輸出格式綁定到日志輸出渠道
pycharm.setFormatter(fmt=pycharm_fmt) ——設(shè)置到控制臺日志渠道
file.setFormatter(fmt=pycharm_fmt1)——設(shè)置到文件日志渠道
(3)常用的格式模板(也可以自己定義)
fmt1 = "%(asctime)s - [%(funcName)s-->line:%(lineno)d] - %(levelname)s:%(message)s"
fmt2 = '[%(asctime)s-%(name)s-%(levelname)s-%(filename)s-%(lineno)d]:%(message)s'
(4)格式必須按照指定的格式格式化。常用的如下:
%(asctime)s——當(dāng)前時(shí)間
%(funcName)s——模塊名
%(lineno)d——行號
%(levelname)s——日志等級名稱
%(message)s——具體的日志內(nèi)容
Demo實(shí)例3——自定義日志收集器和日志格式
import logging,os from logging import handlers # 1、創(chuàng)建日志收集器 log = logging.getLogger(name="rose_logger") # 2、創(chuàng)建日志收集渠道 # 輸出控制臺 pycharm = logging.StreamHandler() # 輸出文件夾 file = logging.FileHandler(os.getcwd()+r"\rose.log",encoding="utf-8") # file = handlers.TimedRotatingFileHandler(filename="test.log",when="D",interval=1,backupCount=10,encoding="utf-8") # 3、創(chuàng)建日志的輸出格式 fmt1 = "%(asctime)s - [%(funcName)s-->line:%(lineno)d] - %(levelname)s:%(message)s" # 創(chuàng)建一個日志輸出對象 pycharm_fmt = logging.Formatter(fmt=fmt1) fmt2 = '[%(asctime)s-%(name)s-%(levelname)s-%(filename)s-%(lineno)d]:%(message)s' pycharm_fmt1 = logging.Formatter(fmt=fmt2) # 4、日志輸出格式綁定到日志輸出渠道 pycharm.setFormatter(fmt=pycharm_fmt) file.setFormatter(fmt=pycharm_fmt1) # 5、直接給收集器設(shè)置日志級別就可以了,渠道會繼承收集器的日志級別 log.setLevel(level=logging.DEBUG) # 5、給收集渠道設(shè)置日志級別,文件渠道,控制臺輸出的級別不會一樣 # pycharm.setLevel(logging.DEBUG) # 6、將日志收集渠道綁定到日志收集器 log.addHandler(pycharm) log.addHandler(file) log.info(msg="測試")
輸出結(jié)果:

Demo實(shí)例4——封裝自定義日志收集器
import logging
from logging import handlers
def create_log(name,level,filename,sh_level,fh_level):
"""
:param name: 日志收集器名字
:param level: 日志收集器的等級
:param filename: 日志文件的名稱
:param sh_level: 控制臺輸出日志的等級
:param fh_level: 文件輸出日志的等級
:return: 返回創(chuàng)建好的日志收集器
"""
# 1、創(chuàng)建日志收集器
log = logging.getLogger(name)
# 2、創(chuàng)建日志收集器的等級
log.setLevel(level=level)
# 3、創(chuàng)建日志收集渠道和等級
sh = logging.StreamHandler()
sh.setLevel(level=sh_level)
log.addHandler(sh)
fh = logging.FileHandler(filename=filename,encoding="utf-8")
# fh1 = handlers.TimedRotatingFileHandler(filename=filename,when="D",interval=1,backupCount=10,encoding="utf-8")
fh.setLevel(level=fh_level)
log.addHandler(fh)
# 4、設(shè)置日志的輸出格式
formats = "%(asctime)s - [%(funcName)s-->line:%(lineno)d] - %(levelname)s:%(message)s"
log_format = logging.Formatter(fmt=formats)
sh.setFormatter(log_format)
fh.setFormatter(log_format)
return log
if __name__ == '__main__':
log = create_log(name="rose_log",level=logging.DEBUG,filename="test_log.log",sh_level=logging.DEBUG,fh_level=logging.DEBUG)
log.info(msg="--------debug--------")
log.info(msg="--------info--------")
log.info(msg="--------warning--------")
log.info(msg="--------error--------")
log.info(msg="--------critical--------")輸出結(jié)果:

總結(jié)
到此這篇關(guān)于python打印日志方法使用的文章就介紹到這了,更多相關(guān)python打印日志方法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
提升Python效率之使用循環(huán)機(jī)制代替遞歸函數(shù)
這篇文章主要介紹了提升Python效率之使用循環(huán)機(jī)制代替遞歸函數(shù)的相關(guān)知識,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-07-07
用python實(shí)現(xiàn)刷點(diǎn)擊率的示例代碼
今天小編就為大家分享一篇用python實(shí)現(xiàn)刷點(diǎn)擊率的示例代碼,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-02-02
Python 語法錯誤:"SyntaxError: invalid charac
本文給大家分享Python 語法錯誤:“SyntaxError: invalid character in identifier“,原因及解決方法,文末給大家補(bǔ)充介紹了Python出現(xiàn)SyntaxError: invalid syntax的原因總結(jié),感興趣的朋友跟隨小編一起學(xué)習(xí)吧2023-02-02
Scrapy的Pipeline之處理CPU密集型或阻塞型操作詳解
這篇文章主要介紹了Scrapy的Pipeline之處理CPU密集型或阻塞型操作詳解,Twisted框架的reactor適合于處理短的、非阻塞的操作,Twisted提供了線程池來在其他的線程而不是主線程(Twisted的reactor線程)中執(zhí)行慢的操作,需要的朋友可以參考下2023-10-10
Python+Delorean實(shí)現(xiàn)時(shí)間格式智能轉(zhuǎn)換
DeLorean是一個Python的第三方模塊,基于?pytz?和?dateutil?開發(fā),用于處理Python中日期時(shí)間的格式轉(zhuǎn)換。本文將詳細(xì)講講DeLorean的使用,感興趣的可以了解一下2022-04-04
python實(shí)現(xiàn)監(jiān)控指定進(jìn)程的cpu和內(nèi)存使用率
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)監(jiān)控指定進(jìn)程的cpu和內(nèi)存使用率,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01
Python解決“argument?after?*?must?be?an?iterable”報(bào)錯問題
這篇文章主要介紹了Python解決“argument?after?*?must?be?an?iterable”報(bào)錯問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12

