校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > 如何在Python項目中引入日志

如何在Python項目中引入日志

熱門標簽:所得系統電梯怎樣主板設置外呼 朝陽手機外呼系統 北瀚ai電銷機器人官網手機版 佛山400電話辦理 北京電銷外呼系統加盟 地圖標注面積 市場上的電銷機器人 小蘇云呼電話機器人 儋州電話機器人

Logging模塊的使用

簡單使用

Logging 模塊提供了一系列便利的函數

它們分別是 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 及以上日志等級才會顯示。

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

級別 數值 何時使用
CRITICAL 50 嚴重的錯誤,表明程序已不能繼續執行
ERROR 40 由于嚴重的問題,程序的某些功能已經不能正常執行
WARNING 30 表明有已經或即將發生的意外,程序仍按預期進行
INFO 20 確認程序按預期運行
DEBUG 10 細節信息,僅當診斷問題時適用。
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,日志信息

這些配置都是固定,不可隨便寫,還有好多日志格式化樣式,這里只介紹了一些常用的格式配置,大家可以去官網查看更多的格式化配置信息。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 則是流處理器,日志將隨著系統標準輸入、輸出流展示,而我們的 PyCharm終端、控制臺等 顯示的信息就屬于系統標準輸出流。

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

加載日志配置信息

然后使用 logging.config.dictConfig() 方法加載日志配置,該方法接受一個 字典 參數。

#!/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') 效果一致。

如果之間運行程序會出現如下錯誤

ValueError: Unable to configure handler 'file'

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

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

Logging 模塊不會自動幫我們創建目錄,因此只需在當前目錄中創建一個 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 調試日志信息,將不會出現在文件中。

使用日志配置文件

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

創建日志配置文件

創建 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則禁止將日志消息傳遞給父級記錄器的處理程序中

加載日志配置函數

# 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: 系統環境變量名
    :return:
    """
    path = default_path

    value = os.getenv(env_key, None)  # 獲取對應的環境變量值
    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('無法加載日志配置文件, 請檢查日志目錄是否創建, 使用默認的日志配置')
                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 用于讓日志在控制臺中有顏色顯示。

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

其他模塊直接使用 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實現自定義日志的具體方法
  • Python 第三方日志框架loguru使用
  • python和websocket構建實時日志跟蹤器的步驟
  • 解決python logging遇到的坑 日志重復打印問題
  • python 實現多進程日志輪轉ConcurrentLogHandler
  • python 實現logging動態變更輸出日志文件名
  • python (logging) 日志按日期、大小回滾的操作
  • 詳解python日志輸出使用配置文件格式
  • python基于pexpect庫自動獲取日志信息
  • Python日志打印里logging.getLogger源碼分析詳解
  • python subprocess pipe 實時輸出日志的操作
  • Python中logging日志的四個等級和使用

標簽:龍巖 商丘 寧夏 酒泉 定西 江蘇 云南 金融催收

巨人網絡通訊聲明:本文標題《如何在Python項目中引入日志》,本文關鍵詞  如,何在,Python,項,目中,引入,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《如何在Python項目中引入日志》相關的同類信息!
  • 本頁收集關于如何在Python項目中引入日志的相關信息資訊供網民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    久久久无码精品亚洲日韩按摩| 欧美日韩精品久久久| 国产亚洲精品bt天堂精选| 国产一区二区三区蝌蚪| 亚洲国产精品精华液ab| av一区二区三区| 亚洲一区二区三区视频在线| 在线观看91av| 狠狠v欧美v日韩v亚洲ⅴ| 国产精品视频在线看| 色成年激情久久综合| 三级成人在线视频| 精品国产区一区| 不卡欧美aaaaa| 石原莉奈一区二区三区在线观看| 日韩一级二级三级| 懂色av一区二区三区蜜臀| 亚洲欧美偷拍卡通变态| 制服丝袜亚洲色图| 国产成人精品午夜视频免费| 亚洲精品亚洲人成人网| 91精品国产丝袜白色高跟鞋| 国产精品一级二级三级| 一区二区三区精品久久久| 欧美电影免费观看高清完整版| 国产99一区视频免费| 亚洲一区二区三区四区在线免费观看 | 国内外成人在线| 亚洲精品中文在线观看| 2024国产精品| 欧美午夜电影网| 福利一区二区在线| 日韩成人免费电影| 综合网在线视频| 久久久久久97三级| 欧美精品视频www在线观看| 成人做爰69片免费看网站| 亚洲6080在线| 亚洲欧美日韩中文播放| 久久精品一二三| 欧美一区二视频| 日本福利一区二区| 高清久久久久久| 麻豆精品视频在线观看视频| 一区二区三区在线影院| 国产精品麻豆视频| 精品国产a毛片| 欧美精品一卡两卡| 91蜜桃传媒精品久久久一区二区| 激情文学综合插| 日韩中文字幕麻豆| 亚洲一区在线观看视频| 中文字幕亚洲在| 国产日韩高清在线| 精品少妇一区二区三区视频免付费| 色吊一区二区三区| 一道本成人在线| 99免费精品在线观看| 国产九色精品成人porny| 美女脱光内衣内裤视频久久影院| 亚洲综合精品久久| 亚洲男女毛片无遮挡| 日本一区二区高清| 国产人成亚洲第一网站在线播放| 日韩一区二区精品在线观看| 欧美日韩www| 欧美日韩免费观看一区三区| 色一情一伦一子一伦一区| 色婷婷狠狠综合| 91美女精品福利| 91免费国产在线| 色综合中文字幕| 日本精品视频一区二区| 日本乱人伦aⅴ精品| 色婷婷久久久亚洲一区二区三区 | 久久国产精品色婷婷| 日本美女一区二区三区视频| 亚洲国产欧美一区二区三区丁香婷| 一区二区中文字幕在线| 亚洲免费观看高清完整版在线观看| 国产精品色哟哟网站| 国产精品久久一卡二卡| 亚洲欧美日韩久久精品| 亚洲午夜一区二区三区| 五月天欧美精品| 美女国产一区二区| 国内欧美视频一区二区| 国产69精品久久777的优势| www.一区二区| 在线精品国精品国产尤物884a| 欧美在线观看一区| 欧美精品色综合| 精品欧美一区二区三区精品久久| 日韩视频一区二区三区| 久久免费看少妇高潮| 国产精品久久久久毛片软件| 尤物在线观看一区| 日本女优在线视频一区二区| 国产精品亚洲综合一区在线观看| 成人黄色电影在线| 欧美性色黄大片| 欧美大黄免费观看| 国产精品久线观看视频| 亚洲国产精品麻豆| 久久国产精品一区二区| 99这里都是精品| 欧美日本在线播放| 久久综合九色综合欧美就去吻| 国产精品视频免费看| 亚洲精品欧美专区| 奇米精品一区二区三区在线观看一| 国产一区二区三区高清播放| 91色九色蝌蚪| 欧美一区二区在线观看| 中文字幕不卡在线播放| 日日夜夜精品视频天天综合网| 国产精品一区二区三区乱码 | 91国内精品野花午夜精品| 日韩一本二本av| 亚洲色图一区二区| 免费精品99久久国产综合精品| 国产成人99久久亚洲综合精品| 色av一区二区| 久久精品免费在线观看| 亚洲国产精品久久久久秋霞影院 | 欧美日韩在线三区| 国产亚洲自拍一区| 一区二区高清在线| 国精产品一区一区三区mba桃花 | 欧美成人一区二区| 亚洲日韩欧美一区二区在线| 精品在线观看视频| 欧美日韩国产首页| 国产精品久久久久影院| 激情综合色综合久久| 欧美在线观看一区| 国产精品久久综合| 国产一二精品视频| 日韩午夜激情电影| 亚洲一区二区三区激情| 成人永久免费视频| 精品欧美黑人一区二区三区| 亚洲综合激情另类小说区| 福利电影一区二区| 精品欧美久久久| 午夜成人免费电影| 一本色道亚洲精品aⅴ| 国产欧美一区在线| 精品一区二区三区久久久| 69久久夜色精品国产69蝌蚪网| 一级女性全黄久久生活片免费| 国产成人免费在线观看不卡| 精品少妇一区二区三区| 日本亚洲天堂网| 67194成人在线观看| 天天av天天翘天天综合网色鬼国产| 91麻豆国产自产在线观看| 国产亚洲制服色| 国产sm精品调教视频网站| 久久久久9999亚洲精品| 国产又黄又大久久| 久久久久久久久伊人| 国产一区二区三区在线看麻豆| 日韩欧美专区在线| 蜜桃av一区二区| 日韩视频中午一区| 老鸭窝一区二区久久精品| 日韩一区二区三| 韩国女主播一区二区三区| 久久亚洲免费视频| 成人小视频免费观看| 亚洲欧洲日韩女同| 色婷婷激情综合| 午夜欧美视频在线观看 | 黄色成人免费在线| 久久只精品国产| 高清在线观看日韩| 亚洲精品视频免费观看| 欧美最新大片在线看| 丝袜亚洲另类丝袜在线| 91精品国产91综合久久蜜臀| 男女男精品视频网| 国产午夜久久久久| 99国产精品国产精品毛片| 一区二区三区日韩欧美| 在线播放中文字幕一区| 久热成人在线视频| 中文字幕免费在线观看视频一区| 国产91丝袜在线播放| 亚洲丝袜美腿综合| 777久久久精品| 国产激情视频一区二区三区欧美| 国产欧美一区二区精品秋霞影院| 91美女片黄在线观看91美女| 五月综合激情婷婷六月色窝| 亚洲精品一区二区精华| 丁香六月久久综合狠狠色| 亚洲精品国产成人久久av盗摄| 91精品国产aⅴ一区二区| 粉嫩嫩av羞羞动漫久久久|