Skip to content

Sanip IP information is a str not a list #63

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Nov 8, 2020
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 27 additions & 17 deletions json_logging/framework/sanic/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,12 @@

import json_logging
import json_logging.framework
from json_logging.framework_base import FrameworkConfigurator, AppRequestInstrumentationConfigurator, RequestAdapter, \
ResponseAdapter
from json_logging.framework_base import (
FrameworkConfigurator,
AppRequestInstrumentationConfigurator,
RequestAdapter,
ResponseAdapter,
)
from json_logging.util import is_not_match_any_pattern


Expand All @@ -16,13 +20,13 @@ def is_sanic_present():
try:
# noinspection PyPackageRequirements
from sanic import Sanic

return True
except:
return False


class SanicAppConfigurator(FrameworkConfigurator):

def config(self):
if not is_sanic_present():
raise RuntimeError("Sanic is not available in system runtime")
Expand All @@ -31,12 +35,16 @@ def config(self):
# noinspection PyPackageRequirements
from sanic.log import LOGGING_CONFIG_DEFAULTS

LOGGING_CONFIG_DEFAULTS['disable_existing_loggers'] = False
LOGGING_CONFIG_DEFAULTS['formatters']['generic']['class'] = "json_logging.JSONLogFormatter"
del LOGGING_CONFIG_DEFAULTS['formatters']['generic']['format']
LOGGING_CONFIG_DEFAULTS["disable_existing_loggers"] = False
LOGGING_CONFIG_DEFAULTS["formatters"]["generic"][
"class"
] = "json_logging.JSONLogFormatter"
del LOGGING_CONFIG_DEFAULTS["formatters"]["generic"]["format"]

LOGGING_CONFIG_DEFAULTS['formatters']['access']['class'] = "json_logging.JSONLogFormatter"
del LOGGING_CONFIG_DEFAULTS['formatters']['access']['format']
LOGGING_CONFIG_DEFAULTS["formatters"]["access"][
"class"
] = "json_logging.JSONLogFormatter"
del LOGGING_CONFIG_DEFAULTS["formatters"]["access"]["format"]

# logging.config.dictConfig(LOGGING_CONFIG_DEFAULTS)

Expand All @@ -47,32 +55,34 @@ def config(self, app, exclude_url_patterns=[]):
raise RuntimeError("Sanic is not available in system runtime")
# noinspection PyPackageRequirements
from sanic import Sanic

if not isinstance(app, Sanic):
raise RuntimeError("app is not a valid Sanic.app.Sanic app instance")

# noinspection PyAttributeOutsideInit
self.request_logger = logging.getLogger('sanic-request')
self.request_logger = logging.getLogger("sanic-request")

logging.getLogger('sanic.access').disabled = True
logging.getLogger("sanic.access").disabled = True

@app.middleware('request')
@app.middleware("request")
def before_request(request):
if is_not_match_any_pattern(request.path, exclude_url_patterns):
request.ctx.request_info = json_logging.RequestInfo(request)

@app.middleware('response')
@app.middleware("response")
def after_request(request, response):
if hasattr(request.ctx, 'request_info'):
if hasattr(request.ctx, "request_info"):
request_info = request.ctx.request_info
request_info.update_response_status(response)
self.request_logger.info("", extra={'request_info': request_info, 'type': 'request'})
self.request_logger.info(
"", extra={"request_info": request_info, "type": "request"}
)

def get_request_logger(self):
return self.request_logger


class SanicRequestAdapter(RequestAdapter):

@staticmethod
def get_current_request():
raise NotImplementedError
Expand All @@ -85,6 +95,7 @@ def support_global_request_object():
@staticmethod
def get_request_class_type():
from sanic.request import Request

return Request

def get_remote_user(self, request):
Expand Down Expand Up @@ -118,14 +129,13 @@ def get_method(self, request):
return request.method

def get_remote_ip(self, request):
return request.ip[0]
return request.ip

def get_remote_port(self, request):
return json_logging.EMPTY_VALUE


class SanicResponseAdapter(ResponseAdapter):

def get_status_code(self, response):
return response.status

Expand Down