sanic/tests/test_logging.py

167 lines
4.4 KiB
Python
Raw Permalink Normal View History

import logging
import uuid
2017-07-24 11:21:15 +01:00
from importlib import reload
from io import StringIO
from unittest.mock import Mock
2017-07-24 11:21:15 +01:00
import pytest
import sanic
2016-12-23 05:00:57 +00:00
from sanic import Sanic
from sanic.log import LOGGING_CONFIG_DEFAULTS, logger
from sanic.response import text
2016-12-23 05:00:57 +00:00
2018-12-30 11:18:06 +00:00
logging_format = """module: %(module)s; \
2016-12-23 05:00:57 +00:00
function: %(funcName)s(); \
2018-12-30 11:18:06 +00:00
message: %(message)s"""
2016-12-23 05:00:57 +00:00
2017-07-24 11:21:15 +01:00
def reset_logging():
logging.shutdown()
reload(logging)
2018-08-26 15:43:14 +01:00
def test_log(app):
2016-12-23 05:00:57 +00:00
log_stream = StringIO()
for handler in logging.root.handlers[:]:
logging.root.removeHandler(handler)
2016-12-23 05:00:57 +00:00
logging.basicConfig(
2018-12-30 11:18:06 +00:00
format=logging_format, level=logging.DEBUG, stream=log_stream
2016-12-23 05:00:57 +00:00
)
log = logging.getLogger()
rand_string = str(uuid.uuid4())
2018-12-30 11:18:06 +00:00
@app.route("/")
2016-12-23 05:00:57 +00:00
def handler(request):
log.info(rand_string)
2018-12-30 11:18:06 +00:00
return text("hello")
2016-12-23 05:00:57 +00:00
2018-12-30 11:18:06 +00:00
request, response = app.test_client.get("/")
log_text = log_stream.getvalue()
assert rand_string in log_text
2017-09-13 07:42:42 +01:00
def test_logging_defaults():
# reset_logging()
2017-09-13 07:42:42 +01:00
app = Sanic("test_logging")
2018-12-30 11:18:06 +00:00
for fmt in [h.formatter for h in logging.getLogger("sanic.root").handlers]:
assert (
fmt._fmt
== LOGGING_CONFIG_DEFAULTS["formatters"]["generic"]["format"]
)
for fmt in [
h.formatter for h in logging.getLogger("sanic.error").handlers
]:
assert (
fmt._fmt
== LOGGING_CONFIG_DEFAULTS["formatters"]["generic"]["format"]
)
for fmt in [
h.formatter for h in logging.getLogger("sanic.access").handlers
]:
assert (
fmt._fmt
== LOGGING_CONFIG_DEFAULTS["formatters"]["access"]["format"]
)
2017-09-13 07:42:42 +01:00
def test_logging_pass_customer_logconfig():
# reset_logging()
2017-09-13 07:42:42 +01:00
modified_config = LOGGING_CONFIG_DEFAULTS
2018-12-30 11:18:06 +00:00
modified_config["formatters"]["generic"][
"format"
] = "%(asctime)s - (%(name)s)[%(levelname)s]: %(message)s"
modified_config["formatters"]["access"][
"format"
] = "%(asctime)s - (%(name)s)[%(levelname)s]: %(message)s"
2017-09-13 07:42:42 +01:00
app = Sanic("test_logging", log_config=modified_config)
2018-12-30 11:18:06 +00:00
for fmt in [h.formatter for h in logging.getLogger("sanic.root").handlers]:
assert fmt._fmt == modified_config["formatters"]["generic"]["format"]
2017-09-13 07:42:42 +01:00
2018-12-30 11:18:06 +00:00
for fmt in [
h.formatter for h in logging.getLogger("sanic.error").handlers
]:
assert fmt._fmt == modified_config["formatters"]["generic"]["format"]
2017-09-13 07:42:42 +01:00
2018-12-30 11:18:06 +00:00
for fmt in [
h.formatter for h in logging.getLogger("sanic.access").handlers
]:
assert fmt._fmt == modified_config["formatters"]["access"]["format"]
2018-12-30 11:18:06 +00:00
@pytest.mark.parametrize("debug", (True, False))
2018-08-26 15:43:14 +01:00
def test_log_connection_lost(app, debug, monkeypatch):
""" Should not log Connection lost exception on non debug """
stream = StringIO()
2018-12-30 11:18:06 +00:00
root = logging.getLogger("sanic.root")
root.addHandler(logging.StreamHandler(stream))
2018-12-30 11:18:06 +00:00
monkeypatch.setattr(sanic.server, "logger", root)
2018-12-30 11:18:06 +00:00
@app.route("/conn_lost")
async def conn_lost(request):
2018-12-30 11:18:06 +00:00
response = text("Ok")
response.output = Mock(side_effect=RuntimeError)
return response
with pytest.raises(ValueError):
# catch ValueError: Exception during request
2018-12-30 11:18:06 +00:00
app.test_client.get("/conn_lost", debug=debug)
log = stream.getvalue()
if debug:
2018-12-30 11:18:06 +00:00
assert "Connection lost before response written @" in log
else:
2018-12-30 11:18:06 +00:00
assert "Connection lost before response written @" not in log
def test_logger(caplog):
rand_string = str(uuid.uuid4())
app = Sanic()
2018-12-30 11:18:06 +00:00
@app.get("/")
def log_info(request):
logger.info(rand_string)
2018-12-30 11:18:06 +00:00
return text("hello")
with caplog.at_level(logging.INFO):
2018-12-30 11:18:06 +00:00
request, response = app.test_client.get("/")
2018-12-30 11:18:06 +00:00
assert caplog.record_tuples[0] == (
"sanic.root",
logging.INFO,
"Goin' Fast @ http://127.0.0.1:42101",
)
assert caplog.record_tuples[1] == (
"sanic.root",
logging.INFO,
"http://127.0.0.1:42101/",
)
assert caplog.record_tuples[2] == ("sanic.root", logging.INFO, rand_string)
assert caplog.record_tuples[-1] == (
"sanic.root",
logging.INFO,
"Server Stopped",
)
def test_logging_modified_root_logger_config():
# reset_logging()
modified_config = LOGGING_CONFIG_DEFAULTS
2018-12-30 11:18:06 +00:00
modified_config["loggers"]["sanic.root"]["level"] = "DEBUG"
app = Sanic("test_logging", log_config=modified_config)
2018-12-30 11:18:06 +00:00
assert logging.getLogger("sanic.root").getEffectiveLevel() == logging.DEBUG