Skip to content

Commit c5b28f8

Browse files
authored
Enable support fot Json logs (#2449)
1 parent 57bc112 commit c5b28f8

File tree

11 files changed

+317
-151
lines changed

11 files changed

+317
-151
lines changed

config/settings/base.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
from eth_typing import ChecksumAddress, HexAddress, HexStr
1010

1111
from safe_transaction_service import __version__
12+
from safe_transaction_service.loggers.custom_logger import SafeJsonFormatter
1213

1314
from ..gunicorn import (
1415
gunicorn_request_timeout,
@@ -122,7 +123,7 @@
122123
# ------------------------------------------------------------------------------
123124
# https://docs.djangoproject.com/en/dev/ref/settings/#middleware
124125
MIDDLEWARE = [
125-
"safe_transaction_service.utils.loggers.LoggingMiddleware",
126+
"safe_transaction_service.loggers.custom_logger.LoggingMiddleware",
126127
"corsheaders.middleware.CorsMiddleware",
127128
"django.middleware.security.SecurityMiddleware",
128129
"django.contrib.sessions.middleware.SessionMiddleware",
@@ -372,7 +373,7 @@
372373
"filters": {
373374
"require_debug_false": {"()": "django.utils.log.RequireDebugFalse"},
374375
"ignore_succeeded_none": {
375-
"()": "safe_transaction_service.utils.loggers.IgnoreSucceededNone"
376+
"()": "safe_transaction_service.loggers.custom_logger.IgnoreSucceededNone"
376377
},
377378
},
378379
"formatters": {
@@ -381,10 +382,10 @@
381382
"format": "%(asctime)s [%(levelname)s] [%(processName)s] %(message)s"
382383
},
383384
"celery_verbose": {
384-
"class": "safe_transaction_service.utils.celery.PatchedCeleryFormatter",
385-
"format": "%(asctime)s [%(levelname)s] [%(task_id)s/%(task_name)s] %(message)s",
386-
# 'format': '%(asctime)s [%(levelname)s] [%(processName)s] [%(task_id)s/%(task_name)s] %(message)s'
385+
"class": "safe_transaction_service.loggers.custom_logger.PatchedCeleryFormatter",
386+
"format": "%(message)s",
387387
},
388+
"json": {"()": SafeJsonFormatter},
388389
},
389390
"handlers": {
390391
"mail_admins": {
@@ -393,13 +394,12 @@
393394
"class": "django.utils.log.AdminEmailHandler",
394395
},
395396
"console": {
396-
"level": "DEBUG",
397397
"class": "logging.StreamHandler",
398-
"formatter": "verbose",
398+
"formatter": "json",
399399
},
400400
"console_short": {
401401
"class": "logging.StreamHandler",
402-
"formatter": "short",
402+
"formatter": "json",
403403
},
404404
"celery_console": {
405405
"level": "DEBUG",

gunicorn.conf.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
keep_alive = 2
1515
log_file = "-"
1616
log_level = "info"
17-
logger_class = "safe_transaction_service.utils.loggers.CustomGunicornLogger"
17+
logger_class = "safe_transaction_service.loggers.custom_logger.CustomGunicornLogger"
1818
preload_app = False # Load application code before the worker processes are forked (problems with gevent patching)
1919
# For timeout to work with gevent, a custom GeventWorker needs to be used
2020
timeout = gunicorn_request_timeout

safe_transaction_service/history/models.py

Lines changed: 40 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1526,33 +1526,33 @@ class Meta:
15261526
def __str__(self):
15271527
return f"{self.safe} - {self.nonce} - {self.safe_tx_hash}"
15281528

1529-
def to_log(self, message: str) -> str:
1529+
def to_dict(self) -> dict:
15301530
"""
1531-
:param message:
1532-
:return: MultisigTransaction ready to be printed in a log line
1531+
:return: MultisigTransaction as dict
15331532
"""
15341533
safe_tx_hash_str = to_0x_hex_str(HexBytes(self.safe_tx_hash))
1535-
return (
1536-
f"[MultisigTransaction {safe_tx_hash_str}] {message}. "
1537-
f"safe_tx_hash={safe_tx_hash_str} "
1538-
f"safe={self.safe} "
1539-
f"proposer={self.proposer} "
1540-
f"proposed_by_delegate={self.proposed_by_delegate} "
1541-
f"to={self.to} "
1542-
f"value={self.value} "
1543-
f"data={to_0x_hex_str(HexBytes(self.data)) if self.data else None} "
1544-
f"operation={self.operation} "
1545-
f"safe_tx_gas={self.safe_tx_gas} "
1546-
f"base_gas={self.base_gas} "
1547-
f"gas_price={self.gas_price} "
1548-
f"gas_token={self.gas_token} "
1549-
f"refund_receiver={self.refund_receiver} "
1550-
f"signatures={to_0x_hex_str(HexBytes(self.signatures)) if self.signatures else None} "
1551-
f"nonce={self.nonce} "
1552-
f"failed={self.failed} "
1553-
f"origin={self.origin} "
1554-
f"trusted={self.trusted} "
1555-
)
1534+
return {
1535+
"safe_tx_hash": safe_tx_hash_str,
1536+
"safe": self.safe,
1537+
"proposer": self.proposer,
1538+
"proposed_by_delegate": self.proposed_by_delegate,
1539+
"to": self.to,
1540+
"value": self.value,
1541+
"data": to_0x_hex_str(HexBytes(self.data)) if self.data else None,
1542+
"operation": self.operation,
1543+
"safe_tx_gas": self.safe_tx_gas,
1544+
"base_gas": self.base_gas,
1545+
"gas_price": self.gas_price,
1546+
"gas_token": self.gas_token,
1547+
"refund_receiver": self.refund_receiver,
1548+
"signatures": (
1549+
to_0x_hex_str(HexBytes(self.signatures)) if self.signatures else None
1550+
),
1551+
"nonce": self.nonce,
1552+
"failed": self.failed,
1553+
"origin": self.origin,
1554+
"trusted": self.trusted,
1555+
}
15561556

15571557
@property
15581558
def execution_date(self) -> Optional[datetime.datetime]:
@@ -1713,10 +1713,9 @@ def __str__(self):
17131713
else:
17141714
return f"Confirmation of owner={self.owner} for existing transaction={self.multisig_transaction_hash}"
17151715

1716-
def to_log(self, message: str) -> str:
1716+
def to_dict(self) -> dict:
17171717
"""
1718-
:param message:
1719-
:return: MultisigTransaction ready to be printed in a log line
1718+
:return: MultisigConfirmatiom as dict
17201719
"""
17211720
multisig_transaction_hash_str = to_0x_hex_str(
17221721
HexBytes(
@@ -1725,15 +1724,20 @@ def to_log(self, message: str) -> str:
17251724
else self.multisig_transaction_id
17261725
)
17271726
)
1728-
return (
1729-
f"[MultisigConfirmation for {multisig_transaction_hash_str}] {message}. "
1730-
f"ethereum_tx={to_0x_hex_str(HexBytes(self.ethereum_tx_id)) if self.ethereum_tx else None} "
1731-
f"multisig_transaction={'SET' if self.multisig_transaction else 'UNSET'} "
1732-
f"multisig_transaction-hash={multisig_transaction_hash_str} "
1733-
f"owner={self.owner} "
1734-
f"signature={to_0x_hex_str(bytes(self.signature)) if self.signature else None} "
1735-
f"signature_type={SafeSignatureType(self.signature_type).name} "
1736-
)
1727+
return {
1728+
"ethereum_tx": (
1729+
to_0x_hex_str(HexBytes(self.ethereum_tx_id))
1730+
if self.ethereum_tx
1731+
else None
1732+
),
1733+
"multisig_transaction": "SET" if self.multisig_transaction else "UNSET",
1734+
"multisig_transaction-hash": multisig_transaction_hash_str,
1735+
"owner": self.owner,
1736+
"signature": (
1737+
to_0x_hex_str(bytes(self.signature)) if self.signature else None
1738+
),
1739+
"signature_type": SafeSignatureType(self.signature_type).name,
1740+
}
17371741

17381742

17391743
class MonitoredAddress(models.Model):

safe_transaction_service/history/serializers.py

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,8 @@ def save(self, **kwargs):
160160
},
161161
)
162162
logger.info(
163-
multisig_confirmation.to_log(f"{'Created' if created else 'Updated'}")
163+
f"Multisigconfirmation {'Created' if created else 'Updated'}",
164+
extra={"extra_data": multisig_confirmation.to_dict()},
164165
)
165166
multisig_confirmations.append(multisig_confirmation)
166167

@@ -363,7 +364,10 @@ def save(self, **kwargs):
363364
multisig_transaction.save(update_fields=["origin", "trusted"])
364365

365366
logger.info(
366-
multisig_transaction.to_log(f"{"Created" if created else "Updated"}")
367+
f"MultisigTransaction {"Created" if created else "Updated"}",
368+
extra={
369+
"extra_data": multisig_transaction.to_dict(),
370+
},
367371
)
368372

369373
for safe_signature in self.validated_data.get("parsed_signatures"):
@@ -380,9 +384,10 @@ def save(self, **kwargs):
380384
)
381385
)
382386
logger.info(
383-
multisig_confirmation.to_log(
384-
f"{'Created' if created else 'Updated'}"
385-
)
387+
f"MultisigConfirmation {'Created' if created else 'Updated'}",
388+
extra={
389+
"extra_data": multisig_confirmation.to_dict(),
390+
},
386391
)
387392
return multisig_transaction
388393

safe_transaction_service/history/views.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
from safe_transaction_service.utils.ethereum import get_chain_id
3939
from safe_transaction_service.utils.utils import parse_boolean_query_param
4040

41+
from ..loggers.custom_logger import http_request_log
4142
from . import filters, pagination, serializers
4243
from .cache import CacheSafeTxsView, cache_txs_view_for_address
4344
from .exceptions import CannotGetSafeInfoFromBlockchain
@@ -102,6 +103,7 @@ def get(self, request, format=None):
102103
"TOKENS_LOGO_EXTENSION": settings.TOKENS_LOGO_EXTENSION,
103104
},
104105
}
106+
105107
return Response(content)
106108

107109

@@ -555,8 +557,8 @@ def post(self, request, *args, **kwargs):
555557
does not support the use of delegates to make transactions trusted.
556558
"""
557559
logger.info(
558-
f"Add request confirmation for {self.kwargs["safe_tx_hash"]}"
559-
f"signature={request.data.get('signature')}"
560+
"Creating MultisigConfirmation",
561+
extra={"http_request": http_request_log(request, log_data=True)},
560562
)
561563
return super().post(request, *args, **kwargs)
562564

@@ -752,7 +754,10 @@ def post(self, request, address, format=None):
752754

753755
request.data["safe"] = address
754756
serializer = self.get_serializer(data=request.data)
755-
logger.info(f"POST MultisigTransaction: {request.data}")
757+
logger.info(
758+
"Creating MultisigTransaction",
759+
extra={"http_request": http_request_log(request, log_data=True)},
760+
)
756761
if not serializer.is_valid():
757762
return Response(
758763
status=status.HTTP_422_UNPROCESSABLE_ENTITY, data=serializer.errors

safe_transaction_service/history/views_v2.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121

2222
from safe_transaction_service.utils.utils import parse_boolean_query_param
2323

24+
from ..loggers.custom_logger import http_request_log
2425
from . import filters, pagination, serializers
2526
from .cache import CacheSafeTxsView, cache_txs_view_for_address
2627
from .models import MultisigTransaction, SafeContract, SafeContractDelegate
@@ -478,7 +479,10 @@ def post(self, request, address, format=None):
478479

479480
request.data["safe"] = address
480481
serializer = self.get_serializer(data=request.data)
481-
logger.info(f"POST MultisigTransaction: {request.data}")
482+
logger.info(
483+
"Creating MultisigTransaction",
484+
extra={"http_request": http_request_log(request, log_data=True)},
485+
)
482486
if not serializer.is_valid():
483487
return Response(
484488
status=status.HTTP_422_UNPROCESSABLE_ENTITY, data=serializer.errors

safe_transaction_service/loggers/__init__.py

Whitespace-only changes.

0 commit comments

Comments
 (0)