Skip to content

Commit

Permalink
Merge pull request #2705 from cisagov/ms/2561-alter-log-format
Browse files Browse the repository at this point in the history
Issue #2561: format logs as json (on getgov-ms)
  • Loading branch information
Matt-Spence authored Sep 12, 2024
2 parents 58a32df + 529178c commit 00e784e
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 8 deletions.
6 changes: 3 additions & 3 deletions src/epplibwrapper/cert.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import os
import tempfile

from django.conf import settings
from django.conf import settings # type: ignore


class Cert:
Expand All @@ -12,7 +12,7 @@ class Cert:
variable but Python's ssl library requires a file.
"""

def __init__(self, data=settings.SECRET_REGISTRY_CERT) -> None:
def __init__(self, data=settings.SECRET_REGISTRY_CERT) -> None: # type: ignore
self.filename = self._write(data)

def __del__(self):
Expand All @@ -31,4 +31,4 @@ class Key(Cert):
"""Location of private key as written to disk."""

def __init__(self) -> None:
super().__init__(data=settings.SECRET_REGISTRY_KEY)
super().__init__(data=settings.SECRET_REGISTRY_KEY) # type: ignore
53 changes: 48 additions & 5 deletions src/registrar/config/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,9 @@
from pathlib import Path
from typing import Final
from botocore.config import Config
import json
import logging
from django.utils.log import ServerFormatter

# # # ###
# Setup code goes here #
Expand Down Expand Up @@ -57,7 +60,7 @@
env_debug = env.bool("DJANGO_DEBUG", default=False)
env_is_production = env.bool("IS_PRODUCTION", default=False)
env_log_level = env.str("DJANGO_LOG_LEVEL", "DEBUG")
env_base_url = env.str("DJANGO_BASE_URL")
env_base_url: str = env.str("DJANGO_BASE_URL")
env_getgov_public_site_url = env.str("GETGOV_PUBLIC_SITE_URL", "")
env_oidc_active_provider = env.str("OIDC_ACTIVE_PROVIDER", "identity sandbox")

Expand Down Expand Up @@ -192,7 +195,7 @@
"registrar.registrar_middleware.CheckPortfolioMiddleware",
]

# application object used by Djangos built-in servers (e.g. `runserver`)
# application object used by Django's built-in servers (e.g. `runserver`)
WSGI_APPLICATION = "registrar.config.wsgi.application"

# endregion
Expand Down Expand Up @@ -415,7 +418,7 @@
# and to interpret datetimes entered in forms
TIME_ZONE = "UTC"

# enable Djangos translation system
# enable Django's translation system
USE_I18N = True

# enable localized formatting of numbers and dates
Expand Down Expand Up @@ -450,6 +453,40 @@
# logger.error("Can't do this important task. Something is very wrong.")
# logger.critical("Going to crash now.")


class JsonFormatter(logging.Formatter):
"""Formats logs into JSON for better parsing"""

def __init__(self):
super().__init__(datefmt="%d/%b/%Y %H:%M:%S")

def format(self, record):
log_record = {
"timestamp": self.formatTime(record, self.datefmt),
"level": record.levelname,
"name": record.name,
"lineno": record.lineno,
"message": record.getMessage(),
}
return json.dumps(log_record)


class JsonServerFormatter(ServerFormatter):
"""Formats server logs into JSON for better parsing"""

def format(self, record):
formatted_record = super().format(record)
log_entry = {"server_time": record.server_time, "level": record.levelname, "message": formatted_record}
return json.dumps(log_entry)


# default to json formatted logs
server_formatter, console_formatter = "json.server", "json"

# don't use json format locally, it makes logs hard to read in console
if "localhost" in env_base_url:
server_formatter, console_formatter = "django.server", "verbose"

LOGGING = {
"version": 1,
# Don't import Django's existing loggers
Expand All @@ -469,19 +506,25 @@
"format": "[{server_time}] {message}",
"style": "{",
},
"json.server": {
"()": JsonServerFormatter,
},
"json": {
"()": JsonFormatter,
},
},
# define where log messages will be sent;
# each logger can have one or more handlers
"handlers": {
"console": {
"level": env_log_level,
"class": "logging.StreamHandler",
"formatter": "verbose",
"formatter": console_formatter,
},
"django.server": {
"level": "INFO",
"class": "logging.StreamHandler",
"formatter": "django.server",
"formatter": server_formatter,
},
# No file logger is configured,
# because containerized apps
Expand Down

0 comments on commit 00e784e

Please sign in to comment.