flask项目中, 你可以使用python 的 logging模块实现记录日志. 也可以使用 flask 基于logging模块封装过的app.logger实现.

直接上代码

config.py

import os
import logging

basedir = os.path.abspath(os.path.dirname(__file__))

class InfoFilter(logging.Filter):
def filter(self, record):
"""only use INFO
筛选, 只需要 INFO 级别的log
:param record:
:return:
"""
if logging.INFO <= record.levelno < logging.ERROR:
# 已经是INFO级别了
# 然后利用父类, 返回 1
return super().filter(record)
else:
return 0

class Config:
SECRET_KEY = os.environ.get('SECRET_KEY') or 'hard to guess string'
SSL_DISABLE = False
SQLALCHEMY_RECORD_QUERIES = True

LOG_PATH = os.path.join(basedir, 'logs')
LOG_PATH_ERROR = os.path.join(LOG_PATH, 'error.log')
LOG_PATH_INFO = os.path.join(LOG_PATH, 'info.log')
LOG_FILE_MAX_BYTES = 100 * 1024 * 1024
# 轮转数量是 10 个
LOG_FILE_BACKUP_COUNT = 10

@staticmethod
def init_app(app):
pass

class DevelopmentConfig(Config):
DEBUG = True
PRESERVE_CONTEXT_ON_EXCEPTION = False
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://xxx:xxx@127.0.0.1/xxx?charset=utf8'

@classmethod
def init_app(cls, app):
Config.init_app(app)

# email errors to the administrators
import logging
from logging.handlers import RotatingFileHandler
# Formatter
formatter = logging.Formatter(
'%(asctime)s %(levelname)s %(process)d %(thread)d '
'%(pathname)s %(lineno)s %(message)s')

# FileHandler Info
file_handler_info = RotatingFileHandler(filename=cls.LOG_PATH_INFO)
file_handler_info.setFormatter(formatter)
file_handler_info.setLevel(logging.INFO)
info_filter = InfoFilter()
file_handler_info.addFilter(info_filter)
app.logger.addHandler(file_handler_info)

# FileHandler Error
file_handler_error = RotatingFileHandler(filename=cls.LOG_PATH_ERROR)
file_handler_error.setFormatter(formatter)
file_handler_error.setLevel(logging.ERROR)
app.logger.addHandler(file_handler_error)

class TestingConfig(Config):
TESTING = True
SQLALCHEMY_DATABASE_URI = os.environ.get('TEST_DATABASE_URL') or \
'sqlite:///' + os.path.join(basedir, 'data-test.sqlite')
WTF_CSRF_ENABLED = False

config = {
'development': DevelopmentConfig,
'testing': TestingConfig,

'default': DevelopmentConfig
}
app.py

from config import config

def create_app(config_name):
app = Flask(__name__)
app.json_encoder = AlchemyEncoder
app.config.from_object(config[config_name])
config[config_name].init_app(app)
return app
然后你就可以在其他任何一个模块记录log

from flask import current_app

try:
s = int('ss')
except ValueError as e:
current_app.logger.exception(e)
error.log

2018-07-02 21:44:12,976 ERROR 4848 139663008261888 /home/.../xxx.py 33 invalid literal for int() with base 10: 'ss'
Traceback (most recent call last):
File "/home/.../xxx.py", line 31, in show_product_manage
s = int('ss')
ValueError: invalid literal for int() with base 10: 'ss'
---------------------
作者:zwxiaoliu
来源:CSDN
原文:https://blog.csdn.net/zwxiaoliu/article/details/80890136
版权声明:本文为博主原创文章,转载请附上博文链接!

最新文章

  1. 【转】Intellij IDEA 14中使用MyBatis-generator 自动生成MyBatis代码
  2. [转]搬瓦工教程之九:通过Net-Speeder为搬瓦工提升网速
  3. ROC曲线
  4. javascript 特效实现(1)——展开选项和收起效果
  5. mybatis sql注入安全
  6. switchover步骤切换
  7. EFSQLserver
  8. Web Service学习之六:CXF解决无法处理的数据类型
  9. C语言求素数的算法
  10. RQNOJ PID2 / 开心的金明
  11. jquery以及js实现option左移右移
  12. Bash Shell编程要点小结
  13. matplotlib 出图示例
  14. java中遍历map的几种方法介绍
  15. js replace替换字符串,同时替换多个方法
  16. 安装 Tensorflow
  17. java使用指定的国际化文件
  18. 更换JDK版本时的问题:Error: could not open `C:\Java\jre7\lib\amd64\jvm.cfg&#39;
  19. MySQL并发相关的参数
  20. Dsu on Tree

热门文章

  1. 通过quick2wire使用raspi的i2c和ks103通信
  2. spark学习(六)Java版RDD基本的基本操作
  3. 关于使用uitableview 中cell 来实现uiimageview的复用和图片的异步加载
  4. C#使用PrintDocument打印 多页 打印预览
  5. Oracle 12c agent install for linux
  6. POJ 3928 Ping pong 树状数组模板题
  7. Multi-company rules
  8. 使用maven创建项目和cannot change version web module 3.0
  9. C#串口通讯教程 简化一切 只保留核心功能 这可能是最易于理解的一篇教程
  10. Java基础 面向对象的详解