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

如何在Python項目中引入日志

 更新時間:2021年05月31日 16:55:36   作者:憶想不到的暉  
在開發(fā)一些大型項目的時候,都會使用日志來記錄項目運行時產生的信息,以備出錯時定位分析和從日志信息中提取數(shù)據(jù)統(tǒng)計分析等。在 Python 中使用 logging 內置模塊即可對項目進行日志的配置。

Logging模塊的使用

簡單使用

Logging 模塊提供了一系列便利的函數(shù)

它們分別是 debug(), info(), warning(), error(), critical()

import logging

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')

輸出結果:

WARNING:root:warning log test
ERROR:root:error log test
CRITICAL:root:critical log test

為什么只輸出了 warning, error 和 critical 的結果,因為 logging 模塊默認使用 warning 日志級別,就是只有 warning 及以上日志等級才會顯示。

日志等級從高到低,如下所示

級別 數(shù)值 何時使用
CRITICAL 50 嚴重的錯誤,表明程序已不能繼續(xù)執(zhí)行
ERROR 40 由于嚴重的問題,程序的某些功能已經不能正常執(zhí)行
WARNING 30 表明有已經或即將發(fā)生的意外,程序仍按預期進行
INFO 20 確認程序按預期運行
DEBUG 10 細節(jié)信息,僅當診斷問題時適用。
NOTSET 0 無任何等級限制

我們只要把 logging 的默認日志等級改下就好了

import logging

# 配置日志等級
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')

輸出結果如下:

DEBUG:root:debug log test
INFO:root:info log test
WARNING:root:warning log test
ERROR:root:error log test

指定日志輸出樣式

當然我們還可以指定日志輸出格式

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')

輸出結果如下:

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

其中日志信息格式化輸出配置樣式說明

  • %(levelname)s ,日志等級
  • %(asctime)s ,時間
  • %(filename)s ,文件名
  • %(lineno)d ,行號
  • %(message)s,日志信息

這些配置都是固定,不可隨便寫,還有好多日志格式化樣式,這里只介紹了一些常用的格式配置,大家可以去官網(wǎng)查看更多的格式化配置信息。docs.python.org/zh-cn/3.7/l…

日志記錄到文件中

在 logging.basicConfig 中設置 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')

運行程序后 test.log 如下內容

自定義日志配置

通常我們在項目中都是自定義一些通用日志配置,然后供項目全局使用。寫好這些配置下次要在別的項目使用之間復制粘貼過來修改修改一下即可。來康康是如何配置的。

準備日志配置信息

配置日志詳細信息,需要導入 logging.config 來進行加載日志配置信息

首先準備日志配置信息字典

log_dict = {
    'version': 1,
    'disable_existing_loggers': False,  # 是否禁用已經存在的日志器

    # 日志信息格式化輸出配置
    'formatters': {

        # 簡單的日志輸出
        'simple': {
            'format': '%(levelname)s %(module)s %(lineno)d %(message)s'
        },

        # 詳細的日志輸出
        'verbose': {
            'format': '%(levelname)s %(asctime)s %(filename)s %(lineno)d %(message)s'
        },
    },

    # 日志信息處理器配置
    'handlers': {
        
        # 向終端中輸出日志
        'console': {
            'level': 'DEBUG',                   # 處理的日志等級,DEBUG及以上
            'class': 'logging.StreamHandler',   # 日志處理器
            'formatter': 'simple'               # 日志格式化配置
        },

        # 向文件中輸出日志
        'file': {
            'level': 'INFO',                                    # 處理的日志等級,DEBUG及以上
            'class': 'logging.handlers.RotatingFileHandler',    # 使用文件日志處理器
            'formatter': 'verbose',                             # 日志格式化配置
            'filename': './logs/test.log',                      # 日志文件存儲位置
            'maxBytes': 1024 * 1024,        # 每個日志文件最大 10MB, 單位: byte
            'backupCount': 20,              # 如果文件滿了, 自動擴充, 最多保留 20 個日志文件
            'encoding': 'utf8',
        },
    },

    # 默認根日志器
    'root': {
        'level': 'DEBUG',           # 允許接受的日志等級
        'handlers': ['console']     # 選擇日志處理器
    },

    # 自定義的日志器
    'loggers': {
        'server': {
            'level': 'DEBUG',
            'handlers': ['file'],
            'propagate': True       # 設為 False則禁止將日志消息傳遞給父級記錄器的處理程序中
        }
    }
}

準備日志配置信息

配置日志詳細信息,需要導入 logging.config 來進行加載日志配置信息

首先準備日志配置信息字典

log_dict = {
    'version': 1,
    'disable_existing_loggers': False,  # 是否禁用已經存在的日志器

    # 日志信息格式化輸出配置
    'formatters': {

        # 簡單的日志輸出
        'simple': {
            'format': '%(levelname)s %(module)s %(lineno)d %(message)s'
        },

        # 詳細的日志輸出
        'verbose': {
            'format': '%(levelname)s %(asctime)s %(filename)s %(lineno)d %(message)s'
        },
    },

    # 日志信息處理器配置
    'handlers': {
        
        # 向終端中輸出日志
        'console': {
            'level': 'DEBUG',                   # 處理的日志等級,DEBUG及以上
            'class': 'logging.StreamHandler',   # 日志處理器
            'formatter': 'simple'               # 日志格式化配置
        },

        # 向文件中輸出日志
        'file': {
            'level': 'INFO',                                    # 處理的日志等級,DEBUG及以上
            'class': 'logging.handlers.RotatingFileHandler',    # 使用文件日志處理器
            'formatter': 'verbose',                             # 日志格式化配置
            'filename': './logs/test.log',                      # 日志文件存儲位置
            'maxBytes': 1024 * 1024,        # 每個日志文件最大 10MB, 單位: byte
            'backupCount': 20,              # 如果文件滿了, 自動擴充, 最多保留 20 個日志文件
            'encoding': 'utf8',
        },
    },

    # 默認根日志器
    'root': {
        'level': 'DEBUG',           # 允許接受的日志等級
        'handlers': ['console']     # 選擇日志處理器
    },

    # 自定義的日志器
    'loggers': {
        'server': {
            'level': 'DEBUG',
            'handlers': ['file'],
            'propagate': True       # 設為 False則禁止將日志消息傳遞給父級記錄器的處理程序中
        }
    }
}

其中大字典的 key 都是固定,例如 version,formatters, handlers, root, loggers等都是固定的配置項。而有一些子選項是可以自己自定義如

  • formatters 下的 simple 和 verbose,是可以改成自己想要的名字。
  • handlers 下的 console 和 file 也是可以修改的。
  • loggers 下的 server 都是一樣可以修改的

具體配置的說明,在這字典中都有一一注釋我就不全介紹了,我就介紹一下 handlers 日志處理器的配置

在 logging 模塊中有許多 日志處理器類,我們只需要在 pycharm 中輸入 logging.Handler 就能彈出最基本的幾個日志處理類。

而上文所用到的 StreamHandler 則是流處理器,日志將隨著系統(tǒng)標準輸入、輸出流展示,而我們的 PyCharm終端、控制臺等 顯示的信息就屬于系統(tǒng)標準輸出流。

而 RotatingFileHandler 日志處理器則是 FileHandler 的子類。其主要作用就是把日志寫入文件中,當文件內容達到最大限制時可以自動擴充日志文件,以達到日志文件的輪換。

加載日志配置信息

然后使用 logging.config.dictConfig() 方法加載日志配置,該方法接受一個 字典 參數(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,  # 是否禁用已經存在的日志器

    ...與上文一致故省略

    # 默認根日志器
    'root': {
        'level': 'DEBUG',  # 接受的日志等級
        'handlers': ['console']
    },
    
    # 自定義的日志器
    'loggers': {
        'server': {
            'level': 'DEBUG',
            'handlers': ['file'],
            'propagate': True       # 設為 False則禁止將日志消息傳遞給父級記錄器的處理程序中
        }
    }
}


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() 即可獲取相應配置日志器,其接受一個日志器的名字,不傳則默認使用 root 根日志器,同 logging.getLogger('root') 效果一致。

如果之間運行程序會出現(xiàn)如下錯誤

ValueError: Unable to configure handler 'file'

那是因為你在日志配置中設置了一個文件處理器 file ,其日志文件將存儲在 filename 配置項中,在這里是

./logs/test.log		# 代表存儲在當前路徑下的 logs目錄下的 test.log 文件

Logging 模塊不會自動幫我們創(chuàng)建目錄,因此只需在當前目錄中創(chuàng)建一個 logs 目錄即可。

最后程序運行結果如下

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()    

運行結果如下:

控制臺

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 日志器設置了 'propagate': True,會 將日志消息傳遞給父級記錄器的處理程序中,因此不僅控制臺會顯示日志信息,文件也會記錄,但文件記錄的等級被設置成 INFO 了,因此 DEBUG 調試日志信息,將不會出現(xiàn)在文件中。

使用日志配置文件

這里我將采用 yaml 格式的日志配置文件。具體配置內容和上文大致一樣,多了一個 error_file_handler 錯誤日志處理器,目的就是把 錯誤日志單獨放在一個文件中,方便以后排查錯誤。

創(chuàng)建日志配置文件

創(chuàng)建 logging.yaml 文件,內容如下所示

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

    # 錯誤日志單獨處理
    error_file_handler:
        class: logging.handlers.RotatingFileHandler
        level: ERROR
        formatter: verbose
        filename: ./logs/errors.log   # 錯誤日志文件存儲位置
        maxBytes: 10485760            # 每個日志文件最大 10MB
        backupCount: 20               # 如果文件滿了, 自動擴充, 最多保留 20 個日志文件
        encoding: utf8

    server_file_handler:
      class: logging.handlers.RotatingFileHandler
      level: INFO                     # 只在文件中記錄INFO級別及以上的log
      formatter: verbose
      filename: ./logs/server.log    # 項目日志文件, 記錄所有日志信息
      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   # 設為 False則禁止將日志消息傳遞給父級記錄器的處理程序中

加載日志配置函數(shù)

# log_test.py 文件

import os
import yaml
import logging
import coloredlogs
import logging.config


# 項目根路徑
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'):
    """
    配置項目日志信息
    :param default_path: 日志文件默認路徑
    :param default_level: 日志默認等級
    :param env_key: 系統(tǒng)環(huán)境變量名
    :return:
    """
    path = default_path

    value = os.getenv(env_key, None)  # 獲取對應的環(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('無法加載日志配置文件, 請檢查日志目錄是否創(chuàng)建, 使用默認的日志配置')
                logging.basicConfig(level=default_level)
                coloredlogs.install(level=default_level)
    else:
        logging.basicConfig(level=default_level)
        coloredlogs.install(level=default_level)
        print('日志配置文件不存在, 使用默認的日志配置')

這里使用到第三方庫如下

  • PyYaml 是用于讀取 yaml 格式的日志配置文件
  • Coloredlogs 用于讓日志在控制臺中有顏色顯示。

然后我們在項目中只要執(zhí)行完 setup_logging() 日志配置函數(shù)

其他模塊直接使用 logging.getLogger('server') 就可獲取我們配置好的日志器。

# log_demo.py 文件

import logging

logger = logging.getLogger('server')  # 維護一個全局日志對象

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()    

日志效果展示

運行 log_test.py 結果如下

控制臺信息

全部日志配置文件信息

錯誤日志文件信息

源代碼

源代碼已上傳到 GitHub LogSetupDemo,歡迎大家來訪。

以上就是如何在Python項目中引入日志的詳細內容,更多關于python 項目引入日志的資料請關注腳本之家其它相關文章!

相關文章

  • python使用NumPy文件的讀寫操作

    python使用NumPy文件的讀寫操作

    這篇文章主要介紹了python使用NumPy讀寫文本文件。想了解第三方庫文件操作的同學,來看一下吧
    2021-04-04
  • Python特效之文字成像方法詳解

    Python特效之文字成像方法詳解

    文字成像,即將原圖片經過 python 處理后,生成完全由純文字組成的圖像。本文將具體為大家介紹如何通過Python實現(xiàn)這一效果,感興趣的可以學習一下
    2022-01-01
  • Python新手學習裝飾器

    Python新手學習裝飾器

    在本篇文章里小編給大家整理的是一篇關于Python裝飾器的相關知識點內容,需要的朋友們可以學習下。
    2020-06-06
  • Python Pandas工具繪制數(shù)據(jù)圖使用教程

    Python Pandas工具繪制數(shù)據(jù)圖使用教程

    Pandas是基于NumPy 的一種工具,該工具是為解決數(shù)據(jù)分析任務而創(chuàng)建的。Pandas還可以繪制多重數(shù)據(jù)圖表,本文將為大家介紹如何通過Pandas繪制圖表,感興趣的可以了解一下
    2021-12-12
  • Python運維之獲取系統(tǒng)CPU信息的實現(xiàn)方法

    Python運維之獲取系統(tǒng)CPU信息的實現(xiàn)方法

    今天小編就為大家分享一篇Python運維之獲取系統(tǒng)CPU信息的實現(xiàn)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-06-06
  • Python八大常見排序算法定義、實現(xiàn)及時間消耗效率分析

    Python八大常見排序算法定義、實現(xiàn)及時間消耗效率分析

    這篇文章主要介紹了Python八大常見排序算法定義、實現(xiàn)及時間消耗效率分析,結合具體實例形式對比分析了冒泡排序、直接插入排序、選擇排序、歸并排序、希爾排序、桶排序、堆排序等排序算法的使用與執(zhí)行效率,需要的朋友可以參考下
    2018-04-04
  • Python快速優(yōu)雅的批量修改Word文檔樣式

    Python快速優(yōu)雅的批量修改Word文檔樣式

    本文主要將涉及os,glob,docx模塊的綜合應用,幫助大家快速批量修改Word文檔樣式實現(xiàn)辦公自動化,感興趣的朋友可以了解下
    2021-05-05
  • Python中map函數(shù)的技巧分享

    Python中map函數(shù)的技巧分享

    在Python中,map()是一個內置函數(shù),這篇文章將從基礎的使用方法到高級的技巧,全面介紹Python中map()方法的使用,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-07-07
  • Python中窗口操作的完整教程

    Python中窗口操作的完整教程

    在使用 Python 進行窗口操作時,可以執(zhí)行各種任務,如最大化、最小化、置頂窗口,本文將詳細介紹這些操作,并提供豐富的示例代碼,希望可以更好地幫助大家了解如何利用 Python 操縱窗口
    2023-11-11
  • python使用webdriver爬取微信公眾號

    python使用webdriver爬取微信公眾號

    這篇文章主要為大家詳細介紹了python使用webdriver爬取微信公眾號信息,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-08-08

最新評論