项目中有用到 Flask 写的部分接口,但是最近一直不是太稳定,所以想到记录运行、请求日志。对服务进行监测。
代码
代码部分比较简单,因为官方文档有日志这块的说明,可以直接使用 logging 进行输出日志。
具体代码:
from flask import Flask import logging from time import strftime,localtime,time import os # 创建日志文件夹 def make_dir(dir_path): temp_path = dir_path.strip() if not os.path.exists(temp_path): os.makedirs(temp_path) return temp_path # 在创建 app 前将 log 级别设置为 debug logging.basicConfig(level=logging.DEBUG) app = Flask(__name__, static_url_path='/') log_dir_path = 'logs' log_file_name = 'logger-' + time.strftime('%Y-%m-%d',time.localtime(time.time())) + '.log' log_file_folder = os.path.abspath(os.path.join(os.path.dirname(__file__),os.pardir,os.pardir)) + os.sep + log_dir_path make_dir(log_file_folder) log_file_str = log_file_folder + os.sep + log_file_name # 设置日志字符集和存储路径 file_log_fandler = logging.FileHandler(log_file_str,encoding='UTF-8') # file_log_fandler = RotatingFileHandler('logs/log',maxBytes=1024*1024*10,backupCount=100) # 设置日志格式 logging_format = logging.Formatter('%(asctime)s - %(levelname)s - %(filename)s - %(funcName)s - %(lineno)s - %(message)s') file_log_fandler.setFormatter(logging_format) app.logger.addHandler(file_log_fandler) app.logger.info(log_file_folder) @app.route("/") def index(): app.logger.info('info log') app.logger.warning('warning log') return 'Hello World!' if __name__ == '__main__': app.run()
注意
1、time 下的函数报错:AttributeError: 'builtin_function_or_method' object has no attribute 'strftime'
这里需要将
import time # 换成 from time import strftime
2、日志 addHandler 的位置
开始是把这一部分放在了 __name__ == '__man__' 下面,直接运行Python文件可以,但是使用 flask run 没有效果。
所以这里要注意:flask run 运行时不会执行 __name == '__main__' 下的代码。
最后,直接把 addHandler 放在 Flask 初始化后面
3、nohup 日志和 logger 对比
项目中是直接使用 falsk 命令行运行,不是通过 ngixn,所以用了 nohup
nohup 会记录对应输入信息,这里用 logger 记录只是为了自己需要的进行单独输出,便于监测
参考