級(jí)別 | 數(shù)值 | 何時(shí)使用 |
---|---|---|
CRITICAL |
50 | 嚴(yán)重的錯(cuò)誤,表明程序已不能繼續(xù)執(zhí)行 |
ERROR |
40 | 由于嚴(yán)重的問題,程序的某些功能已經(jīng)不能正常執(zhí)行 |
WARNING |
30 | 表明有已經(jīng)或即將發(fā)生的意外,程序仍按預(yù)期進(jìn)行 |
INFO |
20 | 確認(rèn)程序按預(yù)期運(yùn)行 |
DEBUG |
10 | 細(xì)節(jié)信息,僅當(dāng)診斷問題時(shí)適用。 |
NOTSET |
0 | 無任何等級(jí)限制 |
我們只要把 logging 的默認(rèn)日志等級(jí)改下就好了
import logging # 配置日志等級(jí) logging.basicConfig(level=logging.DEBUG) logging.debug('debug log test') logging.info('info log test') logging.warning('warning log test') logging.error('error log test')
輸出結(jié)果如下:
DEBUG:root:debug log test INFO:root:info log test WARNING:root:warning log test ERROR:root:error log test
當(dāng)然我們還可以指定日志輸出格式
import logging # 日志輸出樣式 log_format = '%(levelname)s %(asctime)s %(filename)s %(lineno)d %(message)s' logging.basicConfig(format=log_format, level=logging.DEBUG) logging.debug('debug log test') logging.info('info log test') logging.warning('warning log test') logging.error('error log test') logging.critical('critical log test')
輸出結(jié)果如下:
DEBUG 2021-05-27 00:04:26,327 main.py 65 debug log test INFO 2021-05-27 00:04:26,327 main.py 66 info log test WARNING 2021-05-27 00:04:26,327 main.py 67 warning log test ERROR 2021-05-27 00:04:26,327 main.py 68 error log test CRITICAL 2021-05-27 00:04:26,327 main.py 69 critical log test
其中日志信息格式化輸出配置樣式說明
這些配置都是固定,不可隨便寫,還有好多日志格式化樣式,這里只介紹了一些常用的格式配置,大家可以去官網(wǎng)查看更多的格式化配置信息。docs.python.org/zh-cn/3.7/l…
在 logging.basicConfig 中設(shè)置 filename 屬性即可把日志信息寫入文件中
import logging # 日志輸出樣式 log_format = '%(levelname)s %(asctime)s %(filename)s %(lineno)d %(message)s' logging.basicConfig( filename='test.log', format=log_format, level=logging.DEBUG ) logging.debug('debug log test') logging.info('info log test') logging.warning('warning log test') logging.error('error log test') logging.critical('critical log test')
運(yùn)行程序后 test.log 如下內(nèi)容
通常我們?cè)陧?xiàng)目中都是自定義一些通用日志配置,然后供項(xiàng)目全局使用。寫好這些配置下次要在別的項(xiàng)目使用之間復(fù)制粘貼過來修改修改一下即可。來康康是如何配置的。
配置日志詳細(xì)信息,需要導(dǎo)入 logging.config 來進(jìn)行加載日志配置信息
首先準(zhǔn)備日志配置信息字典
log_dict = { 'version': 1, 'disable_existing_loggers': False, # 是否禁用已經(jīng)存在的日志器 # 日志信息格式化輸出配置 'formatters': { # 簡(jiǎn)單的日志輸出 'simple': { 'format': '%(levelname)s %(module)s %(lineno)d %(message)s' }, # 詳細(xì)的日志輸出 'verbose': { 'format': '%(levelname)s %(asctime)s %(filename)s %(lineno)d %(message)s' }, }, # 日志信息處理器配置 'handlers': { # 向終端中輸出日志 'console': { 'level': 'DEBUG', # 處理的日志等級(jí),DEBUG及以上 'class': 'logging.StreamHandler', # 日志處理器 'formatter': 'simple' # 日志格式化配置 }, # 向文件中輸出日志 'file': { 'level': 'INFO', # 處理的日志等級(jí),DEBUG及以上 'class': 'logging.handlers.RotatingFileHandler', # 使用文件日志處理器 'formatter': 'verbose', # 日志格式化配置 'filename': './logs/test.log', # 日志文件存儲(chǔ)位置 'maxBytes': 1024 * 1024, # 每個(gè)日志文件最大 10MB, 單位: byte 'backupCount': 20, # 如果文件滿了, 自動(dòng)擴(kuò)充, 最多保留 20 個(gè)日志文件 'encoding': 'utf8', }, }, # 默認(rèn)根日志器 'root': { 'level': 'DEBUG', # 允許接受的日志等級(jí) 'handlers': ['console'] # 選擇日志處理器 }, # 自定義的日志器 'loggers': { 'server': { 'level': 'DEBUG', 'handlers': ['file'], 'propagate': True # 設(shè)為 False則禁止將日志消息傳遞給父級(jí)記錄器的處理程序中 } } }
配置日志詳細(xì)信息,需要導(dǎo)入 logging.config 來進(jìn)行加載日志配置信息
首先準(zhǔn)備日志配置信息字典
log_dict = { 'version': 1, 'disable_existing_loggers': False, # 是否禁用已經(jīng)存在的日志器 # 日志信息格式化輸出配置 'formatters': { # 簡(jiǎn)單的日志輸出 'simple': { 'format': '%(levelname)s %(module)s %(lineno)d %(message)s' }, # 詳細(xì)的日志輸出 'verbose': { 'format': '%(levelname)s %(asctime)s %(filename)s %(lineno)d %(message)s' }, }, # 日志信息處理器配置 'handlers': { # 向終端中輸出日志 'console': { 'level': 'DEBUG', # 處理的日志等級(jí),DEBUG及以上 'class': 'logging.StreamHandler', # 日志處理器 'formatter': 'simple' # 日志格式化配置 }, # 向文件中輸出日志 'file': { 'level': 'INFO', # 處理的日志等級(jí),DEBUG及以上 'class': 'logging.handlers.RotatingFileHandler', # 使用文件日志處理器 'formatter': 'verbose', # 日志格式化配置 'filename': './logs/test.log', # 日志文件存儲(chǔ)位置 'maxBytes': 1024 * 1024, # 每個(gè)日志文件最大 10MB, 單位: byte 'backupCount': 20, # 如果文件滿了, 自動(dòng)擴(kuò)充, 最多保留 20 個(gè)日志文件 'encoding': 'utf8', }, }, # 默認(rèn)根日志器 'root': { 'level': 'DEBUG', # 允許接受的日志等級(jí) 'handlers': ['console'] # 選擇日志處理器 }, # 自定義的日志器 'loggers': { 'server': { 'level': 'DEBUG', 'handlers': ['file'], 'propagate': True # 設(shè)為 False則禁止將日志消息傳遞給父級(jí)記錄器的處理程序中 } } }
其中大字典的 key 都是固定,例如 version,formatters, handlers, root, loggers等都是固定的配置項(xiàng)。而有一些子選項(xiàng)是可以自己自定義如
具體配置的說明,在這字典中都有一一注釋我就不全介紹了,我就介紹一下 handlers 日志處理器的配置
在 logging 模塊中有許多 日志處理器類,我們只需要在 pycharm 中輸入 logging.Handler 就能彈出最基本的幾個(gè)日志處理類。
而上文所用到的 StreamHandler 則是流處理器,日志將隨著系統(tǒng)標(biāo)準(zhǔn)輸入、輸出流展示,而我們的 PyCharm終端、控制臺(tái)等 顯示的信息就屬于系統(tǒng)標(biāo)準(zhǔn)輸出流。
而 RotatingFileHandler 日志處理器則是 FileHandler 的子類。其主要作用就是把日志寫入文件中,當(dāng)文件內(nèi)容達(dá)到最大限制時(shí)可以自動(dòng)擴(kuò)充日志文件,以達(dá)到日志文件的輪換。
然后使用 logging.config.dictConfig() 方法加載日志配置,該方法接受一個(gè) 字典 參數(shù)。
#!/usr/bin/python3 # -*- coding: utf-8 -*- # @Author: Hui # @Desc: { 日志模塊logging的使用 } # @Date: 2021/05/26 23:14 import logging import logging.config log_dict = { 'version': 1, 'disable_existing_loggers': False, # 是否禁用已經(jīng)存在的日志器 ...與上文一致故省略 # 默認(rèn)根日志器 'root': { 'level': 'DEBUG', # 接受的日志等級(jí) 'handlers': ['console'] }, # 自定義的日志器 'loggers': { 'server': { 'level': 'DEBUG', 'handlers': ['file'], 'propagate': True # 設(shè)為 False則禁止將日志消息傳遞給父級(jí)記錄器的處理程序中 } } } def setup_logging(): """ 配置日志信息 :return: """ logging.config.dictConfig(config=log_dict) logger = logging.getLogger() # logger = logging.getLogger('root') logger.debug('debug log test') logger.info('info log test') logger.warning('warning log test') logger.error('error log test') def main(): setup_logging() if __name__ == '__main__': main()
使用 logging.getLogger() 即可獲取相應(yīng)配置日志器,其接受一個(gè)日志器的名字,不傳則默認(rèn)使用 root 根日志器,同 logging.getLogger('root') 效果一致。
如果之間運(yùn)行程序會(huì)出現(xiàn)如下錯(cuò)誤
ValueError: Unable to configure handler 'file'
那是因?yàn)槟阍谌罩九渲弥性O(shè)置了一個(gè)文件處理器 file ,其日志文件將存儲(chǔ)在 filename 配置項(xiàng)中,在這里是
./logs/test.log # 代表存儲(chǔ)在當(dāng)前路徑下的 logs目錄下的 test.log 文件
Logging 模塊不會(huì)自動(dòng)幫我們創(chuàng)建目錄,因此只需在當(dāng)前目錄中創(chuàng)建一個(gè) logs 目錄即可。
最后程序運(yùn)行結(jié)果如下
DEBUG main 74 debug log test INFO main 75 info log test WARNING main 76 warning log test ERROR main 77 error log test
不用跟 root 根日志器,使用 server 日志器,代碼如下
import logging import logging.config log_dict = {...同上文省略...} def setup_logging(): """ 配置日志信息 :return: """ logging.config.dictConfig(config=log_dict) # logger = logging.getLogger() logger = logging.getLogger('server') logger.debug('debug log test') logger.info('info log test') logger.warning('warning log test') logger.error('error log test') def main(): setup_logging() if __name__ == '__main__': main()
運(yùn)行結(jié)果如下:
控制臺(tái)
DEBUG main 75 debug log test INFO main 76 info log test WARNING main 77 warning log test ERROR main 78 error log test
日志文件 logs/test.log
由于 server 日志器設(shè)置了 'propagate': True,會(huì) 將日志消息傳遞給父級(jí)記錄器的處理程序中,因此不僅控制臺(tái)會(huì)顯示日志信息,文件也會(huì)記錄,但文件記錄的等級(jí)被設(shè)置成 INFO 了,因此 DEBUG 調(diào)試日志信息,將不會(huì)出現(xiàn)在文件中。
這里我將采用 yaml 格式的日志配置文件。具體配置內(nèi)容和上文大致一樣,多了一個(gè) error_file_handler 錯(cuò)誤日志處理器,目的就是把 錯(cuò)誤日志單獨(dú)放在一個(gè)文件中,方便以后排查錯(cuò)誤。
創(chuàng)建 logging.yaml 文件,內(nèi)容如下所示
version: 1 disable_existing_loggers: true # 日志信息格式化輸出配置 formatters: simple: format: '%(levelname)s %(filename)s %(lineno)d %(message)s' verbose: format: '%(levelname)s %(asctime)s -Loc %(filename)s -Row %(lineno)d -%(name)s %(message)s' # 日志信息處理器配置 handlers: console: class: logging.StreamHandler level: DEBUG formatter: simple stream: ext://sys.stdout # 錯(cuò)誤日志單獨(dú)處理 error_file_handler: class: logging.handlers.RotatingFileHandler level: ERROR formatter: verbose filename: ./logs/errors.log # 錯(cuò)誤日志文件存儲(chǔ)位置 maxBytes: 10485760 # 每個(gè)日志文件最大 10MB backupCount: 20 # 如果文件滿了, 自動(dòng)擴(kuò)充, 最多保留 20 個(gè)日志文件 encoding: utf8 server_file_handler: class: logging.handlers.RotatingFileHandler level: INFO # 只在文件中記錄INFO級(jí)別及以上的log formatter: verbose filename: ./logs/server.log # 項(xiàng)目日志文件, 記錄所有日志信息 maxBytes: 10485760 # 10MB backupCount: 30 encoding: utf8 # 根日志器 root: level: DEBUG handlers: [console] # 日志器 loggers: server: level: DEBUG # 允許打印 DEBUG 及以上log handlers: [server_file_handler, error_file_handler] propagate: True # 設(shè)為 False則禁止將日志消息傳遞給父級(jí)記錄器的處理程序中
# log_test.py 文件 import os import yaml import logging import coloredlogs import logging.config # 項(xiàng)目根路徑 BASE_DIR = os.path.dirname(os.path.abspath(__file__)) # 日志配置文件 LOG_CONF_FILE = os.path.join(BASE_DIR, 'logging.yaml') def setup_logging(default_path=LOG_CONF_FILE, default_level=logging.DEBUG, env_key='LOG_CFG'): """ 配置項(xiàng)目日志信息 :param default_path: 日志文件默認(rèn)路徑 :param default_level: 日志默認(rèn)等級(jí) :param env_key: 系統(tǒng)環(huán)境變量名 :return: """ path = default_path value = os.getenv(env_key, None) # 獲取對(duì)應(yīng)的環(huán)境變量值 if value is not None: path = value if os.path.exists(path): with open(path, mode='r', encoding='utf-8') as f: try: logging_yaml = yaml.safe_load(f.read()) logging.config.dictConfig(logging_yaml) coloredlogs.install(level='DEBUG') except Exception as e: print(e) print('無法加載日志配置文件, 請(qǐng)檢查日志目錄是否創(chuàng)建, 使用默認(rèn)的日志配置') logging.basicConfig(level=default_level) coloredlogs.install(level=default_level) else: logging.basicConfig(level=default_level) coloredlogs.install(level=default_level) print('日志配置文件不存在, 使用默認(rèn)的日志配置')
這里使用到第三方庫如下
然后我們?cè)陧?xiàng)目中只要執(zhí)行完 setup_logging() 日志配置函數(shù)
其他模塊直接使用 logging.getLogger('server') 就可獲取我們配置好的日志器。
# log_demo.py 文件 import logging logger = logging.getLogger('server') # 維護(hù)一個(gè)全局日志對(duì)象 logger.debug('debug log test') def log_test1(): logger.info('info log test') def log_test2(): try: a = 1 / 0 except Exception as e: logger.error(e) class LogDemo(object): @staticmethod def log_test(): logger.warning('warning log test')
# log_test.py def main(): setup_logging() logger = logging.getLogger('server') logger.debug('debug log test') logger.info('info log test') logger.warning('warning log test') logger.error('error log test') # 日志在其他模塊中使用演示 import log_demo log_demo.log_test1() log_demo.log_test2() log_demo.LogDemo.log_test() if __name__ == '__main__': main()
運(yùn)行 log_test.py 結(jié)果如下
控制臺(tái)信息
全部日志配置文件信息
錯(cuò)誤日志文件信息
源代碼已上傳到 GitHub LogSetupDemo,歡迎大家來訪。
以上就是如何在Python項(xiàng)目中引入日志的詳細(xì)內(nèi)容,更多關(guān)于python 項(xiàng)目引入日志的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
標(biāo)簽:龍巖 商丘 寧夏 酒泉 定西 江蘇 云南 金融催收
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《如何在Python項(xiàng)目中引入日志》,本文關(guān)鍵詞 如,何在,Python,項(xiàng),目中,引入,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。