From c04cf227ab87d655393191011078417970bb1ba9 Mon Sep 17 00:00:00 2001 From: John Crawford Date: Fri, 11 Apr 2014 17:02:18 +0000 Subject: [PATCH 1/3] Added exception log formatting --- fluent/handler.py | 82 +++++++++++++++++++++++++---------------------- 1 file changed, 44 insertions(+), 38 deletions(-) diff --git a/fluent/handler.py b/fluent/handler.py index edcf840..916a1eb 100644 --- a/fluent/handler.py +++ b/fluent/handler.py @@ -1,34 +1,45 @@ -# -*- coding: utf-8 -*- - import logging +import os +import sys +import msgpack import socket +import threading +import traceback try: - import simplejson as json -except ImportError: import json +except ImportError: + import simplejson as json from fluent import sender - class FluentRecordFormatter(object): def __init__(self): self.hostname = socket.gethostname() - def format(self, record): - data = {'sys_host': self.hostname, - 'sys_name': record.name, - 'sys_module': record.module, - # 'sys_lineno': record.lineno, - # 'sys_levelno': record.levelno, - # 'sys_levelname': record.levelname, - # 'sys_filename': record.filename, - # 'sys_funcname': record.funcName, - # 'sys_exc_info': record.exc_info, - } - # if 'sys_exc_info' in data and data['sys_exc_info']: - # data['sys_exc_info'] = self.formatException(data['sys_exc_info']) + def formatException(self, exceptionInfo): + eData = {} + eData['type'] = str(exceptionInfo[0]) + eData['details'] = str(exceptionInfo[1]) + eData['trace'] = traceback.format_exc() + return eData + def format(self, record): + data = { + 'sys_host' : self.hostname, + 'sys_name' : record.name, + 'sys_module' : record.module, + # 'sys_lineno' : record.lineno, + # 'sys_levelno' : record.levelno, + 'sys_levelname' : record.levelname, + # 'sys_filename' : record.filename, + # 'sys_funcname' : record.funcName, + 'sys_exc_info' : record.exc_info, + } + if 'sys_exc_info' in data and data['sys_exc_info']: + data['sys_exc_info'] = self.formatException(data['sys_exc_info']) + else: + del data['sys_exc_info'] self._structuring(data, record.msg) return data @@ -38,41 +49,36 @@ def _structuring(self, data, msg): elif isinstance(msg, str): try: self._add_dic(data, json.loads(str(msg))) - except (ValueError, json.JSONDecodeError): + except: pass - @staticmethod - def _add_dic(data, dic): - for key, value in dic.items(): - if isinstance(key, basestring): - data[str(key)] = value - + def _add_dic(self, data, dic): + for k, v in dic.items(): + if isinstance(k, str) or isinstance(k, unicode): + data[str(k)] = v class FluentHandler(logging.Handler): ''' Logging Handler for fluent. ''' def __init__(self, - tag, - host='localhost', - port=24224, - timeout=3.0, - verbose=False): + tag, + host='localhost', + port=24224, + timeout=3.0, + verbose=False): self.tag = tag self.sender = sender.FluentSender(tag, host=host, port=port, timeout=timeout, verbose=verbose) + self.fmt = FluentRecordFormatter() logging.Handler.__init__(self) def emit(self, record): - data = self.format(record) + if record.levelno < self.level: return + data = self.fmt.format(record) self.sender.emit(None, data) - def close(self): - self.acquire() - try: - self.sender._close() - logging.Handler.close(self) - finally: - self.release() \ No newline at end of file + def _close(self): + self.sender._close() From 3bd5ad8b3dbc2b906e06b8835d393e42870a6225 Mon Sep 17 00:00:00 2001 From: John Crawford Date: Fri, 11 Apr 2014 17:41:42 +0000 Subject: [PATCH 2/3] bug fix --- fluent/handler.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/fluent/handler.py b/fluent/handler.py index 916a1eb..232a0b8 100644 --- a/fluent/handler.py +++ b/fluent/handler.py @@ -25,7 +25,11 @@ def formatException(self, exceptionInfo): return eData def format(self, record): - data = { + try: + exec_info = record.exc_info + except AttributeError,e: + exec_info = None + data = { 'sys_host' : self.hostname, 'sys_name' : record.name, 'sys_module' : record.module, From 6b3410184ce3d162c601be3c996cfae7d40a7c12 Mon Sep 17 00:00:00 2001 From: John Crawford Date: Thu, 24 Apr 2014 13:40:36 +0000 Subject: [PATCH 3/3] Added app name requirement --- fluent/handler.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/fluent/handler.py b/fluent/handler.py index 232a0b8..83ee52b 100644 --- a/fluent/handler.py +++ b/fluent/handler.py @@ -14,8 +14,9 @@ from fluent import sender class FluentRecordFormatter(object): - def __init__(self): + def __init__(self, appname): self.hostname = socket.gethostname() + self.appname = appname def formatException(self, exceptionInfo): eData = {} @@ -30,6 +31,7 @@ def format(self, record): except AttributeError,e: exec_info = None data = { + 'app_name' : self.appname, 'sys_host' : self.hostname, 'sys_name' : record.name, 'sys_module' : record.module, @@ -67,6 +69,7 @@ class FluentHandler(logging.Handler): ''' def __init__(self, tag, + appname, host='localhost', port=24224, timeout=3.0, @@ -76,7 +79,7 @@ def __init__(self, self.sender = sender.FluentSender(tag, host=host, port=port, timeout=timeout, verbose=verbose) - self.fmt = FluentRecordFormatter() + self.fmt = FluentRecordFormatter(appname) logging.Handler.__init__(self) def emit(self, record):