[flask] 日志配置


1.與supervisor/sentry的日志整合策略

  • 分為異常對象和異常信息的捕獲:

    • 異常event捕獲:capture_exception(e),capture_event({"msg":msg})
    • 異常信息:add_breadcrumb(msg), app.logger.info(msg)
  • 基礎:完全關閉flask的記錄,不配fileHandler

  • 1.只留sentry發送

    • prod模式,app.logger.level設置為CRITICAL
    • 用capture_exception(e) + add_breadcrumb
  • 2.supervisor和sentry同時保存

    • app.logger.level設置為INFO
    • sentry:capture_exception(e) + app.logger.info(說明信息)
    • supervisor:依靠app.logger.info(說明信息)記錄,僅stderr.log文件記錄,未捕獲異常或app.logger.info()內容
    • 如果要關閉supervisor
      • 僅需將level設置為WARNING,supervisor僅記錄錯誤信息,sentry記錄try(e)和錯誤信息
      • 或將level設置為CRITICAL,完全關閉supervisor的記錄,sentry記錄try(e)和錯誤信息
  • 參看:supervisor日志sentry日志

2.flask本身日志配置的兩種方式:

1.通過logging模塊的dictConfig加載日志配置字典的方式

from logging.config import dictConfig
path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
log_file = os.path.join(path, "log/error.log")
log_dict = {
        'version': 1,
        'root': {
            # handler中的level會覆蓋掉這里的level
            'level': 'DEBUG',
            'handlers': ['error_file']
        },

        'handlers': {
            'wsgi': {
                'class': 'logging.StreamHandler',
                'stream': 'ext://flask.logging.wsgi_errors_stream',
                'formatter': 'default'
            },
            "error_file": {
                "class": "logging.handlers.RotatingFileHandler",
                "maxBytes": 1024 * 1024,  # 打日志的大小,單位字節,這種寫法是1M
                "backupCount": 1,  # 備份多少份,經過測試,最少也要寫1,不然控制不住大小
                "encoding": "utf-8",
                "level": "ERROR",
                "formatter": "default",  # 對應下面的鍵
                "filename": log_file  # 打日志的路徑
            },
        },
        'formatters': {
            'default': {
                'format': '[%(asctime)s] %(levelname)s in [%(filename)s:%(lineno)s]: %(message)s',
            },
            'simple': {
                'format': '%(asctime)s - %(levelname)s - %(message)s'
            }
        },
    }
dictConfig(log_dict)
app = Flask(__name__)

2.通過logging模塊的fileConfig加載日志配置文件的方式

config.ini

[loggers]
keys=root,zhilian

[handlers]
keys=fileHandler,consoleHandler

[formatters]
keys=simpleFormatter

[logger_root]
level=DEBUG
handlers=fileHandler

[logger_zhilian]
level=DEBUG
handlers=fileHandler
qualname=zhilian
propagate=0

[handler_consoleHandler]
class=StreamHandler
args=(sys.stdout,)
level=DEBUG
formatter=simpleFormatter

[handler_fileHandler]
class=FileHandler
args=(r'D:\python\code\spider_review\zhilian\log\spider_zhilian.log', 'a')
level=DEBUG
formatter=simpleFormatter

[formatter_simpleFormatter]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
datefmt=

log.py

import logging
import os
import logging.config
import sys

class Log:
    __obj = False
    def __new__(cls, *args, **kwargs):
        if not cls.__obj:
            cls.__obj = super().__new__(cls,*args,**kwargs)
        return cls.__obj

    def __init__(self):
        CONF_LOG = os.path.join(os.path.dirname(os.path.abspath(__file__)),"config.ini")
        logging.config.fileConfig(CONF_LOG)  # 采用配置文件
        self.logger = logging.getLogger('zhilian')

if __name__ == '__main__':
    logger = Log().logger
    logger.info("aasf")


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM