Skip to content
This repository has been archived by the owner on Apr 26, 2024. It is now read-only.

Commit

Permalink
Improve tests for structured logging. (#8916)
Browse files Browse the repository at this point in the history
  • Loading branch information
clokep authored Dec 11, 2020
1 parent 0a34cdf commit 3af0672
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 27 deletions.
1 change: 1 addition & 0 deletions changelog.d/8916.misc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Improve structured logging tests.
73 changes: 46 additions & 27 deletions tests/logging/test_terse_json.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,30 +18,35 @@
from io import StringIO

from synapse.logging._terse_json import JsonFormatter, TerseJsonFormatter
from synapse.logging.context import LoggingContext, LoggingContextFilter

from tests.logging import LoggerCleanupMixin
from tests.unittest import TestCase


class TerseJsonTestCase(LoggerCleanupMixin, TestCase):
def setUp(self):
self.output = StringIO()

def get_log_line(self):
# One log message, with a single trailing newline.
data = self.output.getvalue()
logs = data.splitlines()
self.assertEqual(len(logs), 1)
self.assertEqual(data.count("\n"), 1)
return json.loads(logs[0])

def test_terse_json_output(self):
"""
The Terse JSON formatter converts log messages to JSON.
"""
output = StringIO()

handler = logging.StreamHandler(output)
handler = logging.StreamHandler(self.output)
handler.setFormatter(TerseJsonFormatter())
logger = self.get_logger(handler)

logger.info("Hello there, %s!", "wally")

# One log message, with a single trailing newline.
data = output.getvalue()
logs = data.splitlines()
self.assertEqual(len(logs), 1)
self.assertEqual(data.count("\n"), 1)
log = json.loads(logs[0])
log = self.get_log_line()

# The terse logger should give us these keys.
expected_log_keys = [
Expand All @@ -57,22 +62,15 @@ def test_extra_data(self):
"""
Additional information can be included in the structured logging.
"""
output = StringIO()

handler = logging.StreamHandler(output)
handler = logging.StreamHandler(self.output)
handler.setFormatter(TerseJsonFormatter())
logger = self.get_logger(handler)

logger.info(
"Hello there, %s!", "wally", extra={"foo": "bar", "int": 3, "bool": True}
)

# One log message, with a single trailing newline.
data = output.getvalue()
logs = data.splitlines()
self.assertEqual(len(logs), 1)
self.assertEqual(data.count("\n"), 1)
log = json.loads(logs[0])
log = self.get_log_line()

# The terse logger should give us these keys.
expected_log_keys = [
Expand All @@ -96,26 +94,47 @@ def test_json_output(self):
"""
The Terse JSON formatter converts log messages to JSON.
"""
output = StringIO()

handler = logging.StreamHandler(output)
handler = logging.StreamHandler(self.output)
handler.setFormatter(JsonFormatter())
logger = self.get_logger(handler)

logger.info("Hello there, %s!", "wally")

# One log message, with a single trailing newline.
data = output.getvalue()
logs = data.splitlines()
self.assertEqual(len(logs), 1)
self.assertEqual(data.count("\n"), 1)
log = json.loads(logs[0])
log = self.get_log_line()

# The terse logger should give us these keys.
expected_log_keys = [
"log",
"level",
"namespace",
]
self.assertCountEqual(log.keys(), expected_log_keys)
self.assertEqual(log["log"], "Hello there, wally!")

def test_with_context(self):
"""
The logging context should be added to the JSON response.
"""
handler = logging.StreamHandler(self.output)
handler.setFormatter(JsonFormatter())
handler.addFilter(LoggingContextFilter(request=""))
logger = self.get_logger(handler)

with LoggingContext() as context_one:
context_one.request = "test"
logger.info("Hello there, %s!", "wally")

log = self.get_log_line()

# The terse logger should give us these keys.
expected_log_keys = [
"log",
"level",
"namespace",
"request",
"scope",
]
self.assertCountEqual(log.keys(), expected_log_keys)
self.assertEqual(log["log"], "Hello there, wally!")
self.assertEqual(log["request"], "test")
self.assertIsNone(log["scope"])

0 comments on commit 3af0672

Please sign in to comment.