From 03a9be7e78991392be16e3dd3169374da1205c49 Mon Sep 17 00:00:00 2001 From: Calen Pennington Date: Mon, 21 May 2012 11:56:20 -0400 Subject: [PATCH] Add newrelic handler, rather than custom function to log exceptions --- djangoapps/courseware/views.py | 13 ++++++------- envs/logsettings.py | 9 +++++++-- lib/newrelic_logging/__init__.py | 14 ++++++++++++++ lib/util/errors.py | 7 ------- 4 files changed, 27 insertions(+), 16 deletions(-) create mode 100644 lib/newrelic_logging/__init__.py delete mode 100644 lib/util/errors.py diff --git a/djangoapps/courseware/views.py b/djangoapps/courseware/views.py index 857bdd2e03..3427442fcc 100644 --- a/djangoapps/courseware/views.py +++ b/djangoapps/courseware/views.py @@ -19,7 +19,6 @@ from lxml import etree from module_render import render_module, make_track_function, I4xSystem from models import StudentModule from student.models import UserProfile -from util.errors import record_exception from util.views import accepts from multicourse import multicourse_settings @@ -114,7 +113,7 @@ def render_section(request, section): try: dom = content_parser.section_file(user, section, coursename) except: - record_exception(log, "Unable to parse courseware xml") + log.exception("Unable to parse courseware xml") return render_to_response('courseware-error.html', {}) context = { @@ -133,7 +132,7 @@ def render_section(request, section): try: module = render_module(user, request, dom, module_object_preload) except: - record_exception(log, "Unable to load module") + log.exception("Unable to load module") context.update({ 'init': '', 'content': render_to_string("module-error.html", {}), @@ -182,7 +181,7 @@ def index(request, course=None, chapter="Using the System", section="Hints"): try: dom = content_parser.course_file(user,course) # also pass course to it, for course-specific XML path except: - record_exception(log, "Unable to parse courseware xml") + log.exception("Unable to parse courseware xml") return render_to_response('courseware-error.html', {}) dom_module = dom.xpath("//course[@name=$course]/chapter[@name=$chapter]//section[@name=$section]/*[1]", @@ -211,7 +210,7 @@ def index(request, course=None, chapter="Using the System", section="Hints"): try: module = render_module(user, request, module, module_object_preload) except: - record_exception(log, "Unable to load module") + log.exception("Unable to load module") context.update({ 'init': '', 'content': render_to_string("module-error.html", {}), @@ -256,7 +255,7 @@ def modx_dispatch(request, module=None, dispatch=None, id=None): try: xml = content_parser.module_xml(request.user, module, 'id', id, coursename) except: - record_exception(log, "Unable to load module during ajax call") + log.exception("Unable to load module during ajax call") if accepts(request, 'text/html'): return render_to_response("module-error.html", {}) else: @@ -276,7 +275,7 @@ def modx_dispatch(request, module=None, dispatch=None, id=None): id, state=oldstate) except: - record_exception(log, "Unable to load module instance during ajax call") + log.exception("Unable to load module instance during ajax call") if accepts(request, 'text/html'): return render_to_response("module-error.html", {}) else: diff --git a/envs/logsettings.py b/envs/logsettings.py index 9edf9ad0b3..5302e231a3 100644 --- a/envs/logsettings.py +++ b/envs/logsettings.py @@ -29,7 +29,7 @@ def get_logger_config(log_dir, " %(process)d] [%(filename)s:%(lineno)d] - %(message)s").format( logging_env=logging_env, hostname=hostname) - handlers = ['console'] if debug else ['console', 'syslogger'] + handlers = ['console'] if debug else ['console', 'syslogger', 'newrelic'] return { 'version': 1, @@ -60,6 +60,11 @@ def get_logger_config(log_dir, 'filename' : tracking_file_loc, 'formatter' : 'raw', }, + 'newrelic' : { + 'level': 'ERROR', + 'class': 'newrelic_logging.NewRelicHandler', + 'formatter': 'raw', + } }, 'loggers' : { 'django' : { @@ -83,4 +88,4 @@ def get_logger_config(log_dir, 'propagate' : False }, } - } \ No newline at end of file + } diff --git a/lib/newrelic_logging/__init__.py b/lib/newrelic_logging/__init__.py new file mode 100644 index 0000000000..2c5749e3fa --- /dev/null +++ b/lib/newrelic_logging/__init__.py @@ -0,0 +1,14 @@ +import newrelic.agent + +import logging + +class NewRelicHandler(logging.Handler): + def emit(self, record): + if record.exc_info is not None: + params = record.__dict__ + params['log_message'] = record.getMessage() + + newrelic.agent.record_exception( + *record.exc_info, + params=params + ) diff --git a/lib/util/errors.py b/lib/util/errors.py deleted file mode 100644 index c662003a11..0000000000 --- a/lib/util/errors.py +++ /dev/null @@ -1,7 +0,0 @@ -import newrelic.agent -import sys - -def record_exception(logger, msg, params={}, ignore_errors=[]): - logger.exception(msg) - newrelic.agent.record_exception(*sys.exc_info()) -