File size: 2,386 Bytes
b3cb0b5 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
"""
Structured Logger for Voice Agent
Provides JSON-formatted logging for better observability
"""
import logging
import json
from datetime import datetime
import sys
class JsonFormatter(logging.Formatter):
"""Format logs as JSON"""
def format(self, record):
log_data = {
"timestamp": datetime.now().isoformat(),
"level": record.levelname,
"message": record.getMessage(),
"module": record.module,
"function": record.funcName,
"line": record.lineno
}
# Add extra fields if present
if hasattr(record, 'user_id'):
log_data['user_id'] = record.user_id
if hasattr(record, 'session_id'):
log_data['session_id'] = record.session_id
if hasattr(record, 'duration'):
log_data['duration'] = record.duration
if hasattr(record, 'error'):
log_data['error'] = record.error
return json.dumps(log_data)
class StructuredLogger:
"""Structured logger with JSON output"""
def __init__(self, name="voice-agent"):
self.logger = logging.getLogger(name)
self.logger.setLevel(logging.INFO)
# Remove existing handlers
self.logger.handlers = []
# Console handler with JSON format
handler = logging.StreamHandler(sys.stdout)
handler.setFormatter(JsonFormatter())
self.logger.addHandler(handler)
def info(self, message, **kwargs):
"""Log info message with optional context"""
extra = {k: v for k, v in kwargs.items()}
self.logger.info(message, extra=extra)
def error(self, message, **kwargs):
"""Log error message with optional context"""
extra = {k: v for k, v in kwargs.items()}
self.logger.error(message, extra=extra)
def warning(self, message, **kwargs):
"""Log warning message with optional context"""
extra = {k: v for k, v in kwargs.items()}
self.logger.warning(message, extra=extra)
def debug(self, message, **kwargs):
"""Log debug message with optional context"""
extra = {k: v for k, v in kwargs.items()}
self.logger.debug(message, extra=extra)
# Global logger instance
logger = StructuredLogger()
|