Flask實(shí)現(xiàn)定制日志并輸出到文件
定制日志器
flask缺省日志器配置
flask自帶的日志系統(tǒng),缺省配置dictConfig(),但必須在Flask()應(yīng)用之前使用
# flask缺省配置
from logging.config import dictConfig
dictConfig({
'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__)自定義日志器
# 配置
def logger_setting(base_dir=None):
# base_dir是日志文件存放的根目錄,這里為項(xiàng)目目錄
if not base_dir:
base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))
format_dic, handler_dic, logger_dic = dict(), dict(), dict()
# 定義日志格式
format_dic['default'] = {'format': '[%(asctime)s] %(levelname)s in %(module)s: %(message)s'}
format_dic['simple'] = {'format': '{asctime}- {levelname} {message}'}
format_dic['standard'] = {'format': '%(asctime)s [%(module)s:%(funcName)s] [%(levelname)s]- %(message)s'}
# 定義日志處理器
handler_dic['wsgi'] = {'class': 'logging.StreamHandler', # 流輸出
'stream': 'ext://flask.logging.wsgi_errors_stream',
'formatter': 'default'}
handler_dic['console'] = {'level': 'INFO',
#'class': 'logging.StreamHandler',
'class': 'logging.FileHandler', # 輸出到文件
'filename': os.path.join(base_dir, 'logs','console.log',
'formatter': 'simple'}
handler_dic['error'] = {'level': 'ERROR',
'class': 'logging.handlers.RotatingFileHandler',
'filename': os.path.join(base_dir, 'logs', 'error.log'), # 日志文件全路徑 = base_dir/logs/error.log
'maxBytes': 1024 * 1024 * 5,
'formatter': 'standard'}
handler_dic['master'] = {'level': 'ERROR',
'class': 'logging.handlers.RotatingFileHandler',
'filename': os.path.join(base_dir, 'logs', 'master.log'),
'maxBytes': 1024 * 1024 * 5,
'formatter': 'standard'}
# 定義日志器
logger_dic['master'] = {'handlers': ['master'],
'level': 'INFO',
'propagate': True}
config = {
'version': 1,
'formatters': format_dic,
'handlers': handler_dic,
# 'root': {'level': 'INFO', 'handlers': ['wsgi']}, #這個(gè)可以不用
'loggers': logger_dic
}
return config
# flask使用自定義日志器配置, 這里使用是重新定義缺省日志器配置
dictConfig(logger_setting())
app = Flask(__name__, template_folder='templates', static_folder='static')
logger = logging.getLogger('master')
@app.get('/')
def login():
try:
print('測試日志器')
raise ValueError('djjsdwewoeoopw')
except Exception as e:
logger.error(e)
traceback.print_exc()
abort(401)
if __name__ == '__main__':
app.run()
同時(shí)在項(xiàng)目目錄下創(chuàng)建logs目錄如下圖

到此這篇關(guān)于Flask實(shí)現(xiàn)定制日志并輸出到文件的文章就介紹到這了,更多相關(guān)Flask定制日志內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python虛擬環(huán)境virtualenv的安裝與使用
virtualenv用于創(chuàng)建獨(dú)立的Python環(huán)境,多個(gè)Python相互獨(dú)立,互不影響,它能夠:1. 在沒有權(quán)限的情況下安裝新套件 2. 不同應(yīng)用可以使用不同的套件版本 3. 套件升級不影響其他應(yīng)用2017-09-09
Python編程中Python與GIL互斥鎖關(guān)系作用分析
GIL互斥鎖用來保護(hù)Python世界里的對象,防止同一時(shí)刻多個(gè)線程執(zhí)行Python字節(jié)碼,確保線程安全,但也導(dǎo)致Python線程無法利用多核CPU優(yōu)勢,本文來探討Python將來是否有可能去除GIL2021-09-09
Python面向?qū)ο竽Хǚ椒ê蛦卫K代碼實(shí)例
這篇文章主要介紹了Python面向?qū)ο竽Хǚ椒ê蛦卫K代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03
Python實(shí)現(xiàn)為PDF大文件批量去除水印
在閱讀過程中如果遇到一些帶有水印的資料是比較煩心的,而市面上去水印的功能有多要收費(fèi)且很不方便,那么,如何通過Python來對這類圖片水印進(jìn)行去除呢,本文就來和大家分享一下實(shí)現(xiàn)方法吧2023-05-05
Python?sentence-transformers庫示例詳解
Sentence?Transformer是一個(gè)Python框架,用于句子、文本和圖像嵌入Embedding,它基于Transformer架構(gòu)的預(yù)訓(xùn)練模型,并在大量語義相似性數(shù)據(jù)上進(jìn)行了微調(diào),能夠捕捉句子之間的深層語義關(guān)系,本文給大家介紹Python?sentence-transformers庫的相關(guān)知識,感興趣的朋友一起看看吧2025-08-08
從基礎(chǔ)操作到高級技巧詳解Python源代碼導(dǎo)出全攻略
在Python開發(fā)中,導(dǎo)出源代碼是一個(gè)常見需求,本文將通過真實(shí)場景案例,用通俗易懂的方式講解Python源代碼導(dǎo)出的完整方案,希望對大家有所幫助2026-02-02
關(guān)于django 1.10 CSRF驗(yàn)證失敗的解決方法
今天小編就為大家分享一篇關(guān)于django 1.10 CSRF驗(yàn)證失敗的解決方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-08-08

