-
Notifications
You must be signed in to change notification settings - Fork 2
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat: Add correlation ids to logs to improve debugging (#606)
- Add a unique request_id to all messages logged per request. - Return a unique X-Request-ID that correlated with log messages produce during a request. - Add JSON log formatter to format all logs into JSON.
- Loading branch information
Showing
5 changed files
with
65 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
import logging | ||
from typing import List | ||
|
||
from pythonjsonlogger import jsonlogger | ||
|
||
from server.app.request_id import RequestIdFilter | ||
|
||
|
||
def format_log_string(fields: List[str]) -> str: | ||
return " ".join([f"%({field})" for field in fields]) | ||
|
||
|
||
LOGGED_FIELDS = ["levelname", "asctime", "name", "message", "lineno", "pathname", "request_id"] | ||
LOG_FORMAT = format_log_string(LOGGED_FIELDS) | ||
|
||
|
||
DATETIME_FORMAT = "%Y-%m-%dT%H:%M:%S.%03dZ" | ||
|
||
|
||
def configure_logging(): | ||
logHandler = logging.StreamHandler() | ||
formatter = jsonlogger.JsonFormatter(fmt=LOG_FORMAT, datefmt=DATETIME_FORMAT) | ||
logHandler.setFormatter(formatter) | ||
logHandler.addFilter(RequestIdFilter()) | ||
logging.basicConfig(level=logging.INFO, handlers=[logHandler], force=True) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
""" | ||
Inspired by: http://blog.mcpolemic.com/2016/01/18/adding-request-ids-to-flask.html | ||
""" | ||
import logging | ||
import uuid | ||
|
||
import flask | ||
|
||
|
||
def generate_request_id(): | ||
return uuid.uuid4() | ||
|
||
|
||
def get_request_id(): | ||
return getattr(flask.g, "request_id", None) | ||
|
||
|
||
class RequestIdFilter(logging.Filter): | ||
# This is a logging filter that makes the request ID available for use in | ||
# the logging format. Note that we're checking if we're in a request | ||
# context, as we may want to log things before Flask is fully loaded. | ||
def filter(self, record): | ||
record.request_id = flask.g.request_id if flask.has_request_context() else "" | ||
return True |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters