@@ -100,7 +100,7 @@ def __init__(self, *args, **kwargs) -> None:
100100from app .api_client import SpringWorkerApiClient
101101from app .config import settings
102102from app .consumer import RabbitMqConsumer
103- from app .logging_utils import WorkerContextFilter , bind_log_context
103+ from app .logging_utils import JsonLogFormatter , WorkerContextFilter , bind_log_context
104104from app .openai_client import AnalysisOpenAiWorker
105105from app .recovery import PendingDeliveryStore , TerminalMessageStore
106106from app .schemas import (
@@ -527,6 +527,33 @@ def test_worker_context_filter_sets_defaults_for_missing_fields(self) -> None:
527527 self .assertIsNone (log_record .retryCount )
528528 self .assertEqual (log_record .logType , "application" )
529529
530+ def test_json_log_formatter_does_not_mask_token_usage_metrics (self ) -> None :
531+ log_record = logging .LogRecord (
532+ name = "app.openai_client" ,
533+ level = logging .INFO ,
534+ pathname = __file__ ,
535+ lineno = 1 ,
536+ msg = "OpenAI analysis 호출이 완료되었습니다." ,
537+ args = (),
538+ exc_info = None ,
539+ )
540+ log_record .event = "openai.generate.completed"
541+ log_record .inputTokens = 12000
542+ log_record .outputTokens = 1500
543+ log_record .totalTokens = 13500
544+ log_record .cachedInputTokens = 1024
545+ log_record .reasoningOutputTokens = 0
546+ log_record .openai_api_key = "sk-test"
547+
548+ payload = json .loads (JsonLogFormatter ().format (log_record ))
549+
550+ self .assertEqual (payload ["inputTokens" ], 12000 )
551+ self .assertEqual (payload ["outputTokens" ], 1500 )
552+ self .assertEqual (payload ["totalTokens" ], 13500 )
553+ self .assertEqual (payload ["cachedInputTokens" ], 1024 )
554+ self .assertEqual (payload ["reasoningOutputTokens" ], 0 )
555+ self .assertEqual (payload ["openai_api_key" ], "***masked***" )
556+
530557 def test_deserialize_message_reads_headers (self ) -> None :
531558 consumer = RabbitMqConsumer (
532559 api_client = FakeApiClient (),
0 commit comments