import os from unittest import TestCase import logging import sys import re from logzio.handler import LogzioHandler class TestLogzioHandler(TestCase): def setUp(self): self.handler = LogzioHandler('moo') def test_json(self): formatter = logging.Formatter( '{ "appname":"%(name)s", "functionName":"%(funcName)s", \"lineNo":"%(lineno)d", "severity":"%(' 'levelname)s", "message":"%(message)s"}') self.handler.setFormatter(formatter) record = logging.LogRecord( name='my-logger', level=0, pathname='handler_test.py', lineno=10, msg="this is a test: moo.", args=[], exc_info=None, func='test_json' ) formatted_message = self.handler.format_message(record) formatted_message["@timestamp"] = None self.assertDictEqual( formatted_message, { '@timestamp': None, 'appname': 'my-logger', 'functionName': 'test_json', 'lineNo': '10', 'line_number': 10, 'log_level': 'NOTSET', 'logger': 'my-logger', 'message': 'this is a test: moo.', 'path_name': 'handler_test.py', 'severity': 'NOTSET', 'type': 'python' } ) def test_string(self): record = logging.LogRecord( name='my-logger', level=0, pathname='handler_test.py', lineno=10, msg="this is a test: moo.", args=[], exc_info=None, func='test_json' ) formatted_message = self.handler.format_message(record) formatted_message["@timestamp"] = None self.assertDictEqual( formatted_message, { '@timestamp': None, 'line_number': 10, 'log_level': 'NOTSET', 'logger': 'my-logger', 'message': 'this is a test: moo.', 'path_name': 'handler_test.py', 'type': 'python' } ) def test_extra_formatting(self): record = logging.LogRecord( name='my-logger', level=0, pathname='handler_test.py', lineno=10, msg="this is a test: moo.", args=[], exc_info=None, func='test_json' ) record.__dict__["extra_key"] = "extra_value" record.__dict__["module"] = "testing" formatted_message = self.handler.format_message(record) formatted_message["@timestamp"] = None self.assertDictEqual( formatted_message, { '@timestamp': None, 'line_number': 10, 'log_level': 'NOTSET', 'logger': 'my-logger', 'message': 'this is a test: moo.', 'path_name': 'handler_test.py', 'type': 'python', 'extra_key': 'extra_value' } ) def test_format_string_message(self): record = logging.LogRecord( name='my-logger', level=0, pathname='handler_test.py', lineno=10, msg="this is a test: %s.", args=('moo',), exc_info=None, func='test_json' ) formatted_message = self.handler.format_message(record) formatted_message["@timestamp"] = None self.assertDictEqual( formatted_message, { '@timestamp': None, 'line_number': 10, 'log_level': 'NOTSET', 'logger': 'my-logger', 'message': 'this is a test: moo.', 'path_name': 'handler_test.py', 'type': 'python' } ) def test_exception(self): formatter = logging.Formatter('{"tags": ["staging", "experimental"], "appname": "my-service"}', validate=False) self.handler.setFormatter(formatter) try: raise ValueError("oops.") except: exc_info = sys.exc_info() record = logging.LogRecord( name='my-logger', level=0, pathname='handler_test.py', lineno=10, msg='exception test:', args=[], exc_info=exc_info, func='test_json' ) formatted_message = self.handler.format_message(record) formatted_message["@timestamp"] = None formatted_message["exception"] = formatted_message["exception"].replace(os.path.abspath(__file__), "") formatted_message["exception"] = re.sub(r", line \d+", "", formatted_message["exception"]) self.assertDictEqual( { '@timestamp': None, 'appname': 'my-service', 'line_number': 10, 'log_level': 'NOTSET', 'logger': 'my-logger', 'message': 'exception test:', 'exception': 'Traceback (most recent call last):\n\n File "", in test_exception\n raise ValueError("oops.")\n\nValueError: oops.\n', 'path_name': 'handler_test.py', 'type': 'python', 'tags': ['staging', 'experimental'] }, formatted_message )