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)和錯誤信息
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")