Skip to content

Commit 2a51625

Browse files
committed
Improves logger format handling and adds tests
Updates the logger to properly handle and sanitize the `LOG_FORMAT` environment variable. It now trims whitespace and converts the format to uppercase, ensuring consistency. Adds new tests to cover JSON and inline log formats, including a scenario with a messy environment configuration.
1 parent da44588 commit 2a51625

File tree

2 files changed

+28
-2
lines changed

2 files changed

+28
-2
lines changed

acai_aws/common/logger/common_logger.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ class CommonLogger:
1010

1111
def __init__(self):
1212
self.__json = jsonpickle
13-
self.__format = os.getenv('LOG_FORMAT', 'JSON')
13+
env_format = os.getenv('LOG_FORMAT', 'JSON') or 'JSON'
14+
self.__format = env_format.strip().upper()
1415
self.__log_level = os.getenv('LOG_LEVEL', 'INFO')
1516
self.__json.set_encoder_options('simplejson', use_decimal=True)
1617
self.__json.set_preferred_backend('simplejson')

tests/acai_aws/common/test_logger.py

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1+
import io
2+
import json
13
import os
4+
from contextlib import redirect_stdout
25
from unittest import TestCase, mock
36

47
from acai_aws.common import logger
@@ -54,6 +57,29 @@ def test_logger_logs_error_inline(self):
5457
except Exception as error:
5558
logger.log(level='ERROR', log=error)
5659

60+
@mock.patch.dict(os.environ, {'RUN_MODE': 'SEE-LOGS', 'LOG_STAGE_VARIABLE': 'STAGE', 'STAGE': 'local', 'LOG_FORMAT': ' inline '})
61+
def test_logger_logs_error_inline_with_messy_env(self):
62+
logger.log(level='INFO', log={'message': 'inline-format'})
63+
64+
@mock.patch.dict(os.environ, {'RUN_MODE': 'SEE-LOGS', 'LOG_STAGE_VARIABLE': 'STAGE', 'STAGE': 'local', 'LOG_FORMAT': 'JSON'})
65+
def test_logger_json_output(self):
66+
buffer = io.StringIO()
67+
with redirect_stdout(buffer):
68+
logger.log(level='WARN', log={'json': True})
69+
log_output = buffer.getvalue().strip()
70+
parsed = json.loads(log_output)
71+
self.assertEqual('WARN', parsed['level'])
72+
self.assertEqual({'json': True}, parsed['log'])
73+
74+
@mock.patch.dict(os.environ, {'RUN_MODE': 'SEE-LOGS', 'LOG_STAGE_VARIABLE': 'STAGE', 'STAGE': 'local', 'LOG_FORMAT': 'INLINE'})
75+
def test_logger_inline_output(self):
76+
buffer = io.StringIO()
77+
with redirect_stdout(buffer):
78+
logger.log(level='INFO', log={'inline': True})
79+
log_output = buffer.getvalue().strip()
80+
self.assertTrue(log_output.startswith('INFO|'))
81+
self.assertIn("inline': True", log_output)
82+
5783
@mock.patch.dict(os.environ, {'RUN_MODE': 'SEE-LOGS', 'LOG_STAGE_VARIABLE': 'STAGE', 'STAGE': 'local'})
5884
def test_logger_logs_error_as_object(self):
5985
try:
@@ -96,4 +122,3 @@ def test_logger_handles_bad_level(self):
96122
@mock.patch.dict(os.environ, {'RUN_MODE': 'SEE-LOGS', 'LOG_STAGE_VARIABLE': 'STAGE', 'STAGE': 'local', 'LOG_LEVEL': 'ERROR', 'LOG_FORMAT': 'BAD'})
97123
def test_logger_handles_bad_format(self):
98124
logger.log(level='INFO', log={'INFO': 'ignore'})
99-

0 commit comments

Comments
 (0)