Back to home page

EIC code displayed by LXR

 
 

    


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() # Raise an exception for bad status codes
0031         except requests.RequestException as e:
0032             # Handle exceptions during the request (e.g., connection error, timeout)
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     # Clear existing handlers to avoid duplicates
0055     logger.handlers.clear()
0056 
0057     # Set up REST handler
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'  # Rename to avoid SQL mixed-case issues
0067     })
0068     handler.setFormatter(formatter)
0069 
0070     logger.addHandler(handler)
0071     return logger