做網(wǎng)站 最好的開源cms哈爾濱seo服務(wù)
logging日志的使用
- 一、了解flask日志
- 1.1、Loggers記錄器
- 1.2、Handlers 處理器
- 1.3、Formatters 格式化器
- 二、使用日志
- 2.1、官網(wǎng)上的一個(gè)簡單的示例
- 2.2、基本配置
- 2.3、具體使用示例
- 2.4、運(yùn)行
- 三、寫在最后
一、了解flask日志
日志是一種非常重要的工具,可以幫助開發(fā)人員在應(yīng)用程序中進(jìn)行故障排除和錯(cuò)誤調(diào)試。Flask應(yīng)用程序的記錄器可以記錄應(yīng)用程序的運(yùn)行狀態(tài)和錯(cuò)誤,從而提供有價(jià)值的信息來分析和解決問題。
Flask采用標(biāo)準(zhǔn) Python logging . 有關(guān)Flask應(yīng)用程序的消息記錄在 app.logger
中,
Flask日志基本配置文檔 ,在文檔中了解到,在 Flask 中,我們可以使用 app.logger 對(duì)象來進(jìn)行日志記錄。Flask采用標(biāo)準(zhǔn) Python logging . 有關(guān)Flask應(yīng)用程序的消息記錄在 app.logger
中
1.1、Loggers記錄器
Loggers 即記錄器,是日志系統(tǒng)的入口,日志等級(jí)描述了 logger 記錄的信息的嚴(yán)重程度:
- DEBUG:低的、基于調(diào)試目的的系統(tǒng)信息
- INFO:一般系統(tǒng)消息
- WARNING:警告信息
- ERROR:發(fā)生了報(bào)錯(cuò)的信息
- CRITICAL:發(fā)生了嚴(yán)重的問題的信息
當(dāng)一條消息被發(fā)送到 logger,消息的等級(jí)會(huì)和 logger 的日志等級(jí)做一個(gè)比較,只有當(dāng)消息的等級(jí)大于或等于 logger 的記錄等級(jí)時(shí),消息才會(huì)被當(dāng)前 logger 進(jìn)行更多的處理
1.2、Handlers 處理器
Handler即處理器,它的主要功能是決定如何處理logger中每一條消息,比如把消息輸出到屏幕、文件或者Email中。和 logger 一樣,handler也有級(jí)別的概念。
如果一條日志記錄的級(jí)別不匹配或者低于handler的日志級(jí)別,則會(huì)被handler忽略。
一個(gè)logger可以有多個(gè)handler,每一個(gè)handler可以有不同的日志級(jí)別。
這樣就可以根據(jù)消息的重要性不同,來提供不同類型的輸出。
例如,你可以添加一個(gè)handler把ERROR和CRITICAL消息發(fā)到你的Email,再添加另一個(gè) handler把所有的消息(包括ERROR和CRITICAL消息)保存到文件里。
1.3、Formatters 格式化器
Formatter即格式化器,主要功能是確定最終輸出的形式和內(nèi)容。
二、使用日志
2.1、官網(wǎng)上的一個(gè)簡單的示例
@app.route('/login', methods=['POST'])
def login():user = get_user(request.form['username'])if user.check_password(request.form['password']):login_user(user)app.logger.info('%s logged in successfully', user.username)return redirect(url_for('index'))else:app.logger.info('%s failed to log in', user.username)abort(401)
如果不配置日志記錄,Python的默認(rèn)日志級(jí)別通常為“warning”。低于配置級(jí)別的內(nèi)容將不可見
2.2、基本配置
當(dāng)你想為項(xiàng)目配置日志記錄時(shí),應(yīng)該在程序啟動(dòng)時(shí)盡快進(jìn)行。如果在配置日志之前訪問,那么 app.logger 就會(huì)成為缺省記錄器。如果可能,請(qǐng)?jiān)趧?chuàng)建應(yīng)用程序?qū)ο笾芭渲萌罩居涗洝?/p>
此示例使用 dictConfig() 來創(chuàng)建一個(gè)類似于 Flask 缺省配置的日志記錄配置:
from logging.config import dictConfigdictConfig({'version': 1,'formatters': {'default': {'format': '[%(asctime)s] %(levelname)s in %(module)s: %(message)s',}},'handlers': {'wsgi': {'class': 'logging.StreamHandler','stream': 'ext://flask.logging.wsgi_errors_stream','formatter': 'default'}},'root': {'level': 'INFO','handlers': ['wsgi']}
})app = Flask(__name__)
如果沒有自己配置日志,Flask 會(huì)自動(dòng)添加一個(gè) StreamHandler
到 app.logger
。 在請(qǐng)求過程中,它會(huì)寫到由 WSGI
服務(wù)器指定的,保存在 environ['wsgi.errors']
變量中的日志流(通常是 sys.stderr
)中。在請(qǐng)求之外,則會(huì)記錄到 sys.stderr
。
2.3、具體使用示例
from flask import Flask, request
from logging.config import dictConfigdictConfig({"version": 1,"disable_existing_loggers": False, # 不覆蓋默認(rèn)配置"formatters": { # 日志輸出樣式"default": {"format": "%(asctime)s - %(name)s - %(levelname)s - %(message)s"}},"handlers": {"console": {"class": "logging.StreamHandler", # 控制臺(tái)輸出"level": "DEBUG","formatter": "default",},"log_file": {"class": "logging.handlers.RotatingFileHandler","level": "INFO","formatter": "default", # 日志輸出樣式對(duì)應(yīng)formatters"filename": "./logs/flask.log", # 指定log文件目錄"maxBytes": 20*1024*1024, # 文件最大20M"backupCount": 10, # 最多10個(gè)文件"encoding": "utf8", # 文件編碼},},"root": {"level": "DEBUG", # # handler中的level會(huì)覆蓋掉這里的level"handlers": ["console", "log_file"],},}
)app = Flask(__name__)@app.route('/login', methods=['POST'])
def login():app.logger.debug(f'login request payload: {request.json}')user = request.json.get('username')if user == 'test':app.logger.info(f'{user} logged in successfully')return {'msg': 'success!', 'access_token': '********token******'}else:app.logger.info('%s failed to log in', user.username)return {'msg': 'username or password invalid', 'access_token': ''}if __name__ == '__main__':app.run()
可以再精簡一下,把日志的處理單獨(dú)拉出來:
import osfrom flask import Flaskfrom project.extension import db, cors
from project.config import config # 導(dǎo)入存儲(chǔ)配置的字典from project.blog import blog_base_blueprint
import logging
from logging.handlers import RotatingFileHandlerdef create_app(config_name=None):if config_name is None:config_name = os.getenv('FLASK_ENV', 'development') # 從環(huán)境變量中獲取FLASK_ENV,并設(shè)置默認(rèn)值app = Flask('project')# setup config,導(dǎo)入配置,根據(jù)配置環(huán)境實(shí)例化app.config.from_object(config[config_name])# 注冊(cè)擴(kuò)展register_extension(app)# 注冊(cè)藍(lán)圖register_blueprint(app)#注冊(cè)日志處理器register_log(app)return app# 注冊(cè)flask拓展
def register_extension(app: Flask):db.init_app(app)db.app = appcors.init_app(app, origins="*")# 注冊(cè)藍(lán)圖
def register_blueprint(app: Flask):app.register_blueprint(blog_base_blueprint)def register_log(app: Flask):app.logger.setLevel(logging.INFO)formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')file_handler = RotatingFileHandler(app.config['BASE_DIR'] + '/storage/logs/blogin.log', maxBytes=10 * 1024 * 1024, backupCount=10)file_handler.setFormatter(formatter)file_handler.setLevel(logging.INFO)app.logger.addHandler(file_handler)
然后再每個(gè)模塊需要的地方,再單獨(dú)使用日志,比如我的藍(lán)圖中使用:
2.4、運(yùn)行
項(xiàng)目運(yùn)行以后,訪問我/api/posts
,然后在文件storage/logs/blogin.log
中,就能看到日志嘍。
這里一定要保證有這個(gè)目錄,并且有寫入文件的權(quán)限,否則會(huì)報(bào)錯(cuò)
三、寫在最后
宣傳一波:大家若是有人想北京租房可以聯(lián)系我,主要是物資學(xué)院、通州北關(guān)、北苑、草房的房子。(注:我不是中介喲,我也不打算轉(zhuǎn)行做中介,是我靠譜的朋友在做)