diff --git a/frappe/app.py b/frappe/app.py index 8f836138c5..d86417407d 100644 --- a/frappe/app.py +++ b/frappe/app.py @@ -3,6 +3,7 @@ import sys, os import json +import logging from werkzeug.wrappers import Request, Response from werkzeug.local import LocalManager @@ -19,12 +20,16 @@ import frappe.utils.response import frappe.website.render from frappe.utils import get_site_name from frappe.middlewares import StaticDataMiddleware +from frappe.setup_logging import setup_logging local_manager = LocalManager([frappe.local]) _site = None _sites_path = os.environ.get("SITES_PATH", ".") +setup_logging() +logger = logging.getLogger(__name__) + @Request.application def application(request): frappe.local.request = request @@ -64,18 +69,23 @@ def application(request): response = frappe.utils.response.handle_session_stopped() except Exception, e: + http_status_code=getattr(e, "http_status_code", 500) + if frappe.local.is_ajax: - response = frappe.utils.response.report_error(getattr(e, "http_status_code", 500)) + response = frappe.utils.response.report_error(http_status_code) else: frappe.respond_as_web_page("Server Error", "
"+frappe.get_traceback()+"", - http_status_code=getattr(e, "http_status_code", 500)) + http_status_code=http_status_code) response = frappe.website.render.render("message") if e.__class__ == frappe.AuthenticationError: if hasattr(frappe.local, "login_manager"): frappe.local.login_manager.clear_cookies() + if http_status_code==500: + logger.error('Request Error') + else: if frappe.local.request.method in ("POST", "PUT") and frappe.db: frappe.db.commit() diff --git a/frappe/setup_logging.py b/frappe/setup_logging.py new file mode 100644 index 0000000000..c463b9eabc --- /dev/null +++ b/frappe/setup_logging.py @@ -0,0 +1,53 @@ +import frappe +import logging +import logging.config +import os +import json +from pprint import pformat + +class ContextFilter(logging.Filter): + """ + This is a filter which injects request information (if available) into the log. + """ + + def filter(self, record): + record.form_dict = pformat(getattr(frappe.local, 'form_dict', None)) + record.site = getattr(frappe.local, 'site', None) + record.tb = frappe.utils.get_traceback() + return True + +def setup_logging(): + conf = frappe.get_site_config(sites_path=os.environ.get('SITES_PATH', '.')) + if conf.logging_conf: + logging_conf = conf.logging_conf + else: + logging_conf = { + "version": 1, + "disable_existing_loggers": True, + "filters": { + "context_filter": { + "()": "frappe.loggers.ContextFilter" + } + }, + "formatters": { + "site_wise": { + "format": "%(asctime)s %(message)s \n site: %(site)s\n form: %(form_dict)s\n\n%(tb)s\n--------------" + } + }, + "loggers": { + "frappe.app": { + "level": "INFO", + "propagate": False, + "filters": ["context_filter"], + "handlers": ["request_exception"] + } + }, + "handlers": { + "request_exception": { + "level": "ERROR", + "formatter": "site_wise", + "class": "logging.StreamHandler", + } + } + } + logging.config.dictConfig(logging_conf)