From 57393fb3ca4a3d934c93ff32a3598f16db864756 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 17 Jul 2025 21:06:18 +0000 Subject: [PATCH] feat(logging): Add data truncation to prevent oversized log entries Co-authored-by: ntindle <8845353+ntindle@users.noreply.github.com> --- .../backend/backend/util/logging.py | 43 +++++++++++++++---- 1 file changed, 34 insertions(+), 9 deletions(-) diff --git a/autogpt_platform/backend/backend/util/logging.py b/autogpt_platform/backend/backend/util/logging.py index 5f822c94a7..d335399917 100644 --- a/autogpt_platform/backend/backend/util/logging.py +++ b/autogpt_platform/backend/backend/util/logging.py @@ -35,27 +35,43 @@ class TruncatedLogger: def info(self, msg: str, **extra): msg = self._wrap(msg, **extra) - self.logger.info(msg, extra=self._get_metadata(**extra)) + truncated_extra = self._truncate_large_data(extra) + truncated_metadata = self._truncate_large_data(self.metadata) + self.logger.info( + msg, extra={"json_fields": {**truncated_metadata, **truncated_extra}} + ) def warning(self, msg: str, **extra): msg = self._wrap(msg, **extra) - self.logger.warning(msg, extra=self._get_metadata(**extra)) + truncated_extra = self._truncate_large_data(extra) + truncated_metadata = self._truncate_large_data(self.metadata) + self.logger.warning( + msg, extra={"json_fields": {**truncated_metadata, **truncated_extra}} + ) def error(self, msg: str, **extra): msg = self._wrap(msg, **extra) - self.logger.error(msg, extra=self._get_metadata(**extra)) + truncated_extra = self._truncate_large_data(extra) + truncated_metadata = self._truncate_large_data(self.metadata) + self.logger.error( + msg, extra={"json_fields": {**truncated_metadata, **truncated_extra}} + ) def debug(self, msg: str, **extra): msg = self._wrap(msg, **extra) - self.logger.debug(msg, extra=self._get_metadata(**extra)) + truncated_extra = self._truncate_large_data(extra) + truncated_metadata = self._truncate_large_data(self.metadata) + self.logger.debug( + msg, extra={"json_fields": {**truncated_metadata, **truncated_extra}} + ) def exception(self, msg: str, **extra): msg = self._wrap(msg, **extra) - self.logger.exception(msg, extra=self._get_metadata(**extra)) - - def _get_metadata(self, **extra): - metadata = {**self.metadata, **extra} - return {"json_fields": metadata} if metadata else {} + truncated_extra = self._truncate_large_data(extra) + truncated_metadata = self._truncate_large_data(self.metadata) + self.logger.exception( + msg, extra={"json_fields": {**truncated_metadata, **truncated_extra}} + ) def _wrap(self, msg: str, **extra): extra_msg = str(extra or "") @@ -64,6 +80,15 @@ class TruncatedLogger: text = text[: self.max_length] + "..." return text + def _truncate_large_data(self, data, max_size=10000): + if isinstance(data, dict): + return {k: self._truncate_large_data(v, max_size) for k, v in data.items()} + elif isinstance(data, list): + return [self._truncate_large_data(v, max_size) for v in data[:100]] + elif isinstance(data, str) and len(data) > max_size: + return data[:max_size] + "... [truncated]" + return data + class PrefixFilter(logging.Filter): def __init__(self, prefix: str):