From 747a59825a5e698e431c61f155413eb2cc08fef9 Mon Sep 17 00:00:00 2001 From: Montana Date: Wed, 3 Apr 2019 15:39:18 -0400 Subject: [PATCH] Use JSONLogger to log audit event information --- atst/models/audit_event.py | 13 +++++++++++++ atst/models/mixins/auditable.py | 21 +++++++++++++++++---- atst/utils/logging.py | 1 + 3 files changed, 31 insertions(+), 4 deletions(-) diff --git a/atst/models/audit_event.py b/atst/models/audit_event.py index 0e46b086..3a442f5b 100644 --- a/atst/models/audit_event.py +++ b/atst/models/audit_event.py @@ -25,6 +25,19 @@ class AuditEvent(Base, TimestampsMixin): display_name = Column(String()) action = Column(String(), nullable=False) + @property + def log(self): + return { + "user_id": str(self.id), + "portfolio_id": str(self.portfolio_id), + "changed_state": self.changed_state, + "event_details": self.event_details, + "resource_type": self.resource_type, + "resource_id": str(self.resource_id), + "display_name": self.display_name, + "action": self.action, + } + def save(self, connection): attrs = inspect(self).dict diff --git a/atst/models/mixins/auditable.py b/atst/models/mixins/auditable.py index 86ada487..140e4743 100644 --- a/atst/models/mixins/auditable.py +++ b/atst/models/mixins/auditable.py @@ -1,5 +1,5 @@ from sqlalchemy import event, inspect -from flask import g +from flask import g, current_app as app from atst.models.audit_event import AuditEvent from atst.utils import camel_to_snake, getattr_path @@ -32,6 +32,7 @@ class AuditableMixin(object): ) audit_event.save(connection) + return audit_event @classmethod def __declare_last__(cls): @@ -42,17 +43,29 @@ class AuditableMixin(object): @staticmethod def audit_insert(mapper, connection, target): """Listen for the `after_insert` event and create an AuditLog entry""" - target.create_audit_event(connection, target, ACTION_CREATE) + event = target.create_audit_event(connection, target, ACTION_CREATE) + app.logger.info( + "Audit Event insert", + extra={"audit_event": event.log, "tags": ["audit_event", "insert"]}, + ) @staticmethod def audit_delete(mapper, connection, target): """Listen for the `after_delete` event and create an AuditLog entry""" - target.create_audit_event(connection, target, ACTION_DELETE) + event = target.create_audit_event(connection, target, ACTION_DELETE) + app.logger.info( + "Audit Event delete", + extra={"audit_event": event.log, "tags": ["audit_event", "delete"]}, + ) @staticmethod def audit_update(mapper, connection, target): if AuditableMixin.get_changes(target): - target.create_audit_event(connection, target, ACTION_UPDATE) + event = target.create_audit_event(connection, target, ACTION_UPDATE) + app.logger.info( + "Audit Event update", + extra={"audit_event": event.log, "tags": ["audit_event", "update"]}, + ) def get_changes(self): """ diff --git a/atst/utils/logging.py b/atst/utils/logging.py index 1ef84d0a..5cc8e90d 100644 --- a/atst/utils/logging.py +++ b/atst/utils/logging.py @@ -31,6 +31,7 @@ class JsonFormatter(logging.Formatter): ("severity", lambda r: r.levelname), ("tags", lambda r: r.__dict__.get("tags")), ("message", lambda r: r.msg), + ("audit_event", lambda r: r.__dict__.get("audit_event")), ] def format(self, record):