Last active
January 22, 2019 11:23
-
-
Save Jaza/0de82f66854769ea6bc4 to your computer and use it in GitHub Desktop.
Flask request / script pre-configured loggers
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from flask import Flask | |
app = Flask(__name__) | |
app.config.from_object('settings') | |
if not app.debug: | |
setup_flask_logging(app) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from flask.ext.script import Manager | |
from loggers import setup_script_logging | |
def create_app(quiet=False): | |
from example_app import app | |
app.quiet = quiet | |
setup_script_logging(app) | |
return app | |
manager = Manager(create_app) | |
manager.add_option('-q', '--quiet', help='Quiet mode (no console output)', action='store_true', required=False) | |
if __name__ == "__main__": | |
manager.run() |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
* |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import sys | |
from os import path | |
import logging | |
from logging import Formatter, StreamHandler | |
from logging.handlers import SMTPHandler, RotatingFileHandler | |
class LevelSpecificLogFilter(object): | |
""" | |
Log filter that excludes log messages above a certain level | |
(e.g. 'WARNING'). | |
Copied from: | |
http://stackoverflow.com/questions/8162419/ | |
python-logging-specific-level-only | |
""" | |
def __init__(self, level): | |
self.__level = level | |
def filter(self, logRecord): | |
return logRecord.levelno <= self.__level | |
def get_mail_handler(app): | |
""" | |
Gets a basic SMTP handler configured for flask logging purposes. | |
""" | |
mail_handler = SMTPHandler((app.config['MAIL_SERVER'], | |
app.config['MAIL_PORT']), | |
app.config['MAIL_DEFAULT_SENDER'], | |
app.config['ADMINS'], | |
'[%s] Error report' % | |
app.config['SITE_NAME']) | |
mail_handler.setLevel(logging.ERROR) | |
mail_handler.setFormatter( | |
Formatter(app.config['ERROR_MAIL_FORMAT'])) | |
return mail_handler | |
def setup_flask_logging(app): | |
""" | |
Sets up Flask request logging (file-based for all environments, | |
and error report emailing for prod environment). | |
""" | |
file_handler = RotatingFileHandler( | |
path.join(app.config['LOG_FOLDER'], 'flask_error.log'), | |
maxBytes=100000, backupCount=5) | |
file_handler.setLevel(logging.WARNING) | |
file_handler.setFormatter(Formatter( | |
app.config['LOG_FILE_FORMAT'], app.config['LOG_FILE_DATEFMT'])) | |
app.logger.addHandler(file_handler) | |
mail_handler = get_mail_handler(app) | |
app.logger.addHandler(mail_handler) | |
def setup_script_logging(app): | |
"""Sets up script logging to files / streams.""" | |
script_log_info_file_handler = RotatingFileHandler( | |
path.join(app.config['LOG_FOLDER'], 'script_info.log'), | |
maxBytes=100000, backupCount=5) | |
script_log_info_file_handler.setLevel(logging.INFO) | |
script_log_info_file_handler.setFormatter(Formatter( | |
app.config['LOG_FILE_FORMAT'], app.config['LOG_FILE_DATEFMT'])) | |
script_log_info_file_handler.addFilter( | |
LevelSpecificLogFilter(logging.WARNING)) | |
script_log_error_file_handler = RotatingFileHandler( | |
path.join(app.config['LOG_FOLDER'], 'script_error.log'), | |
maxBytes=100000, backupCount=5) | |
script_log_error_file_handler.setLevel(logging.ERROR) | |
script_log_error_file_handler.setFormatter(Formatter( | |
app.config['LOG_FILE_FORMAT'], app.config['LOG_FILE_DATEFMT'])) | |
script_log_info_stream_handler = StreamHandler( | |
app.quiet and open(os.devnull, 'a') or sys.stdout) | |
script_log_info_stream_handler.setLevel(logging.INFO) | |
script_log_info_stream_handler.setFormatter(Formatter( | |
app.config['LOG_FILE_FORMAT'], app.config['LOG_FILE_DATEFMT'])) | |
script_log_info_stream_handler.addFilter( | |
LevelSpecificLogFilter(logging.WARNING)) | |
script_log_error_stream_handler = StreamHandler( | |
app.quiet and open(os.devnull, 'a') or sys.stderr) | |
script_log_error_stream_handler.setLevel(logging.ERROR) | |
script_log_error_stream_handler.setFormatter(Formatter( | |
app.config['LOG_FILE_FORMAT'], app.config['LOG_FILE_DATEFMT'])) | |
script_logger = logging.getLogger('script') | |
script_logger.setLevel(logging.INFO) | |
script_logger.addHandler(script_log_info_file_handler) | |
script_logger.addHandler(script_log_error_file_handler) | |
script_logger.addHandler(script_log_info_stream_handler) | |
script_logger.addHandler(script_log_error_stream_handler) | |
if not app.debug: | |
mail_handler = get_mail_handler(app) | |
script_logger.addHandler(mail_handler) | |
app.script_logger = script_logger |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from os import path | |
PROJECT_ROOT = path.join(path.dirname(__file__), '..') | |
SITE_NAME = 'Foo Bar' | |
LOG_FOLDER = path.join(PROJECT_ROOT, '../log') | |
ADMINS = [ | |
'[email protected]', | |
] | |
MAIL_DEFAULT_SENDER = '[email protected]' | |
ERROR_MAIL_FORMAT = ''' | |
Message type: %(levelname)s | |
Location: %(pathname)s:%(lineno)d | |
Module: %(module)s | |
Function: %(funcName)s | |
Time: %(asctime)s | |
Message: | |
%(message)s | |
''' | |
LOG_FILE_FORMAT = '%(levelname)s %(asctime)s %(message)s' | |
LOG_FILE_DATEFMT = '[%Y-%m-%d %H:%M:%S]' | |
MAIL_SERVER = '127.0.0.1' | |
MAIL_PORT = 25 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment