網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
一、必備技能
1、logging模塊的使用
(1)5個(gè)日志等級(jí)/以及5個(gè)輸出日志的內(nèi)置函數(shù)
(2)日志收集器、日志輸出渠道的概念
(3)如何自定義日志收集器
(4)如何封裝自定義的日志收集器
二、logging
python的官方庫(kù),打印日志用的,無(wú)需安裝,使用時(shí)直接調(diào)用
1、logging的基本使用
1.1、日志的五個(gè)等級(jí)(DEBUG/INFO/WARNING/ERROR/CRITICAL)
(1)DEBUG:調(diào)試模式下的日志,只給程序員看的日志
(2)INFO:程序正常運(yùn)行的時(shí)候輸出的日志
(3)WARN/WARNING:警告信息,當(dāng)前程序還可以運(yùn)行,后面有可能出現(xiàn)問(wèn)題
(4)ERROR:程序執(zhí)行過(guò)程總的錯(cuò)誤信息
(5)CRITICAL:發(fā)生嚴(yán)重錯(cuò)誤,阻塞流程,程序可能無(wú)法繼續(xù)運(yùn)行
1.2、打印不同日志等級(jí)的方法:
(1)logging.debug("調(diào)試日志信息")
(2)logging.info("重要日志信息")
(3)logging.warning("警告日志信息")
(4)logging.error("錯(cuò)誤日志信息")
(5)logging.critical("致命日志信息")
1.3、日志收集器和日志輸出渠道:
????????日志收集器:
? ? ? ? ? ? ? ? 默認(rèn)收集器的名字為root,默認(rèn)收集等級(jí)為WARNING,通過(guò)如下步驟設(shè)置收集器的等級(jí)
? ? ? ? ? ? ? ? log = logging.getLogger() # 獲取日志收集器,默認(rèn)為root
? ? ? ? ? ? ? ? log.setLevel("等級(jí)")? # 等級(jí)必須大寫(xiě)
????????????????logging.basicConfig(level=logging.DEBUG)? # 設(shè)置收集器的等級(jí)
? ? ? ? 日志輸出渠道:
? ? ? ? ? ? ? ? 默認(rèn)輸出等級(jí)為WARNING
? ? ? ? ? ? ? ? 輸出渠道支持:輸出到文件夾和輸出到控制臺(tái)
Demo實(shí)例1——默認(rèn)WARNING等級(jí)
import logging
# 打印不同等級(jí)的日志(debug、info、warning、error、critical)
# 如下5條日志,只會(huì)打印WARNING等級(jí)以后的日志
logging.debug("這是一條debug級(jí)別的日志")
logging.info("這是一條info級(jí)別的日志")
logging.warning("這是一條warning級(jí)別的日志")
logging.error("這是一條error級(jí)別的日志")
logging.critical("這是一條critical級(jí)別的日志")
運(yùn)行結(jié)果 :(只會(huì)打印WARNING級(jí)別以上的日志)
WARNING:root:這是一條warning級(jí)別的日志
ERROR:root:這是一條error級(jí)別的日志
CRITICAL:root:這是一條critical級(jí)別的日志
Demo實(shí)例2——默認(rèn)的日志收集器
import logging
# # logging.basicConfig(level=logging.DEBUG) 設(shè)置日志級(jí)別
# 未指定name,默認(rèn)返回自帶的默認(rèn)的root收集器
# 默認(rèn)輸出WARN級(jí)別以上的等級(jí)日志
# 如果設(shè)置了WARNING以下的等級(jí),則輸出WARNING等級(jí)以上的日志
# 如果設(shè)置了WARNING以上的等級(jí),比如設(shè)置了ERROR,則輸出ERROR等級(jí)以上的日志
log = logging.getLogger()
# log.setLevel("DEBUG")
# log.setLevel("INFO")
# log.setLevel("WARNING")
log.setLevel("ERROR")
# log.setLevel("CRITICAL")
logging.debug("這是一條debug級(jí)別的日志")
logging.info("這是一條info級(jí)別的日志")
logging.warning("這是一條warning級(jí)別的日志")
logging.error("這是一條error級(jí)別的日志")
logging.critical("這是一條critical級(jí)別的日志")
?運(yùn)行結(jié)果:
ERROR:root:這是一條error級(jí)別的日志
CRITICAL:root:這是一條critical級(jí)別的日志
2、自定義日志收集器
2.1、創(chuàng)建日志收集器
??????log = logging.getLogger(name="rose_logger")
? ? ? ? 不傳name參數(shù)時(shí),默認(rèn)返回收集器名字為“root”
? ? ? ? 傳了name參數(shù)時(shí),會(huì)創(chuàng)建一個(gè)新的日志收集器
2.2、創(chuàng)建日志收集渠道
(1)輸出到控制臺(tái):
????????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, 日志的文件名稱(chēng)(包含路徑)
????????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, 滾動(dòng)周期,與when='h'連動(dòng),1-表示以時(shí)間為周期
????????backupCount=0 保留日志文件的個(gè)數(shù),設(shè)置為10,永遠(yuǎn)只保存最近的10個(gè)文件
2.3、創(chuàng)建日志的輸出格式 (1)創(chuàng)建日志格式對(duì)象
????????pycharm_fmt = logging.Formatter(fmt=fmt1)
(2)將日志輸出格式綁定到日志輸出渠道
????????pycharm.setFormatter(fmt=pycharm_fmt)? ——設(shè)置到控制臺(tái)日志渠道
????????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——行號(hào)
????????%(levelname)s——日志等級(jí)名稱(chēng)
?????????%(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)建日志收集渠道
# 輸出控制臺(tái)
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)建一個(gè)日志輸出對(duì)象
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è)置日志級(jí)別就可以了,渠道會(huì)繼承收集器的日志級(jí)別
log.setLevel(level=logging.DEBUG)
# 5、給收集渠道設(shè)置日志級(jí)別,文件渠道,控制臺(tái)輸出的級(jí)別不會(huì)一樣
# pycharm.setLevel(logging.DEBUG)
# 6、將日志收集渠道綁定到日志收集器
log.addHandler(pycharm)
log.addHandler(file)
log.info(msg="測(cè)試")
輸出結(jié)果:
Demo實(shí)例4——封裝自定義日志收集器
import logging
from logging import handlers
def create_log(name,level,filename,sh_level,fh_level):
"""
:param name: 日志收集器名字
:param level: 日志收集器的等級(jí)
:param filename: 日志文件的名稱(chēng)
:param sh_level: 控制臺(tái)輸出日志的等級(jí)
:param fh_level: 文件輸出日志的等級(jí)
:return: 返回創(chuàng)建好的日志收集器
"""
# 1、創(chuàng)建日志收集器
log = logging.getLogger(name)
# 2、創(chuàng)建日志收集器的等級(jí)
log.setLevel(level=level)
# 3、創(chuàng)建日志收集渠道和等級(jí)
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é)
原文鏈接:https://blog.csdn.net/qq_49624649/article/details/122102349
相關(guān)推薦
- 2022-02-04 ImportError: No module named ‘flask_sqlalchemy‘
- 2022-11-16 python中如何使用函數(shù)改變list_python
- 2023-11-26 String字符串類(lèi)
- 2023-07-16 unipp 小程序 退出登錄
- 2022-05-06 C語(yǔ)言結(jié)構(gòu)體使用之鏈表_C 語(yǔ)言
- 2023-05-29 React優(yōu)雅的封裝SvgIcon組件示例_React
- 2022-07-08 一文詳解Python中生成器的原理與使用_python
- 2023-01-13 分布式緩存Redis與Memcached的優(yōu)缺點(diǎn)區(qū)別比較_數(shù)據(jù)庫(kù)其它
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門(mén)
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支