Skip to content

Commit

Permalink
HH-32313 fixed memory leak with gelfhandler
Browse files Browse the repository at this point in the history
  • Loading branch information
katraev committed Mar 22, 2013
1 parent 777a3f3 commit 901aafa
Showing 1 changed file with 33 additions and 31 deletions.
64 changes: 33 additions & 31 deletions frontik/frontik_logging.py
Expand Up @@ -10,6 +10,36 @@
from lxml.builder import E from lxml.builder import E
try: try:
from graypy.handler import GELFHandler, LAN_CHUNK from graypy.handler import GELFHandler, LAN_CHUNK

class BulkGELFHandler(GELFHandler):

def handle_bulk(self, records_list, stages=None, status_code=None, exception=None, uri="None", method = "None", **kw):
if records_list != []:
first_record = records_list[0]
else:
return
record_for_gelf = copy.deepcopy(first_record)
record_for_gelf.message = "{0} {1} {2} \n".format(record_for_gelf.asctime,record_for_gelf.levelname, record_for_gelf.message)
record_for_gelf.short = "{0} {1} {2}".format(method, uri, status_code)
record_for_gelf.exc_info = exception
record_for_gelf.levelno = 20
for record in records_list[1:]:
if record.levelno > record_for_gelf.levelno:
record_for_gelf.levelno = record.levelno
record_for_gelf.lineno = record.lineno
record_for_gelf.short = record.message
if record.exc_info is not None:
record_for_gelf.exc_info=traceback.format_exc(record.exc_info)
record.short += "\n" + traceback.format_exc(record.exc_info)
record_for_gelf.message += " {0} {1} {2} \n".format(record.asctime, record.levelname,record.message)
if stages is not None:
for stage_name, stage_start, stage_delta in stages:
setattr(record_for_gelf,stage_name+"_stage",str(int(stage_delta*1000)))
record_for_gelf.name = record_for_gelf.handler
record_for_gelf.code = status_code
GELFHandler.handle(self, record_for_gelf)
self.close()

except ImportError: except ImportError:
tornado.options.options.graylog = False tornado.options.options.graylog = False


Expand Down Expand Up @@ -111,38 +141,9 @@ def flush(self, **kw):
self.addHandler = self.logger.addHandler self.addHandler = self.logger.addHandler


if tornado.options.options.graylog: if tornado.options.options.graylog:

class BulkGELFHandler(GELFHandler):

def handle_bulk(self, records_list, stages=None, status_code=None, exception=None, **kw):
if records_list != []:
first_record = records_list[0]
else:
return
record_for_gelf = copy.deepcopy(first_record)
record_for_gelf.message = "{0} {1} {2} \n".format(record_for_gelf.asctime,record_for_gelf.levelname, record_for_gelf.message)
record_for_gelf.short = "{0} {1} {2}".format(handler.request.method, handler.request.uri, status_code)
record_for_gelf.exc_info = exception
record_for_gelf.levelno = 20
for record in records_list[1:]:
if record.levelno > record_for_gelf.levelno:
record_for_gelf.levelno = record.levelno
record_for_gelf.lineno = record.lineno
record_for_gelf.short = record.message
if record.exc_info is not None:
record_for_gelf.exc_info=traceback.format_exc(record.exc_info)
record.short += "\n" + traceback.format_exc(record.exc_info)
record_for_gelf.message += " {0} {1} {2} \n".format(record.asctime, record.levelname,record.message)
if stages is not None:
for stage_name, stage_start, stage_delta in stages:
setattr(record_for_gelf,stage_name+"_stage",str(int(stage_delta*1000)))
record_for_gelf.name = record.handler
record_for_gelf.code = status_code
GELFHandler.handle(self, record_for_gelf)
self.close()

self.logger.add_bulk_handler(BulkGELFHandler(tornado.options.options.graylog_host, self.logger.add_bulk_handler(BulkGELFHandler(tornado.options.options.graylog_host,
tornado.options.options.graylog_port, LAN_CHUNK, False)) tornado.options.options.graylog_port, LAN_CHUNK, False))

def stage_tag(self, stage_name): def stage_tag(self, stage_name):
zero_time = self.handler_started zero_time = self.handler_started
self._stage_tag(PageLogger.Stage(stage_name, self._time - zero_time, time.time() - self._time)) self._stage_tag(PageLogger.Stage(stage_name, self._time - zero_time, time.time() - self._time))
Expand Down Expand Up @@ -174,7 +175,8 @@ def process(self, msg, kwargs):
return msg, kwargs return msg, kwargs


def request_finish_hook(self, exception = None): def request_finish_hook(self, exception = None):
self.logger.flush(status_code=self.handler_ref()._status_code, stages=self.stages, exception=exception) self.logger.flush(status_code=self.handler_ref()._status_code, stages=self.stages, exception=exception,
method=self.handler_ref().request.method, uri=self.handler_ref().request.uri)


def bootstrap_all_logging(): def bootstrap_all_logging():
server_log = logging.getLogger("frontik.server") server_log = logging.getLogger("frontik.server")
Expand Down

0 comments on commit 901aafa

Please sign in to comment.