File indexing completed on 2026-04-27 07:41:41
0001 import logging
0002 import json
0003 from pythonjsonlogger.json import JsonFormatter
0004 import requests
0005 from datetime import datetime
0006
0007 class RestLogHandler(logging.Handler):
0008 """
0009 A logging handler that sends log records to a REST API endpoint.
0010 """
0011 def __init__(self, url, token=None):
0012 """
0013 Initializes the handler with the endpoint URL and an optional auth token.
0014 """
0015 super().__init__()
0016 self.url = url
0017 self.token = token
0018
0019 def emit(self, record):
0020 """
0021 Emits a log record to the REST endpoint.
0022 """
0023 try:
0024 log_entry = self.format(record)
0025 headers = {'Content-type': 'application/json'}
0026 if self.token:
0027 headers['Authorization'] = f'Token {self.token}'
0028
0029 response = requests.post(self.url, data=log_entry, headers=headers, timeout=5)
0030 response.raise_for_status()
0031 except requests.RequestException as e:
0032
0033 import sys
0034 sys.stderr.write(f"Failed to send log to {self.url}: {e}\n")
0035
0036 def setup_rest_logging(app_name, instance_name, base_url, token=None, level=logging.INFO):
0037 """
0038 Sets up a logger that sends records to a REST API endpoint.
0039
0040 Args:
0041 app_name: Name of the application (e.g., 'data_agent')
0042 instance_name: Specific instance name (e.g., 'data-agent-1')
0043 base_url: Base URL of the REST API (e.g., 'http://localhost:8002')
0044 token: Optional authentication token
0045 level: Logging level (default: INFO)
0046
0047 Returns:
0048 Configured logger instance
0049 """
0050 logger = logging.getLogger(f"{app_name}.{instance_name}")
0051 logger.setLevel(level)
0052 logger.propagate = False
0053
0054
0055 logger.handlers.clear()
0056
0057
0058 rest_url = f"{base_url}/api/logs/"
0059 handler = RestLogHandler(rest_url, token=token)
0060
0061 log_format = (
0062 '%(asctime)s %(name)s %(levelname)s %(module)s %(funcName)s %(lineno)d %(message)s'
0063 )
0064
0065 formatter = JsonFormatter(log_format, rename_fields={
0066 'funcName': 'funcname'
0067 })
0068 handler.setFormatter(formatter)
0069
0070 logger.addHandler(handler)
0071 return logger