Files
installer/iridium_installer/backend/network_logging.py

124 lines
3.5 KiB
Python

import logging
import requests
import threading
import time
from datetime import datetime
logger = logging.getLogger(__name__ + ".network_logging")
DISCORD_WEBHOOK_URL = "https://discord.com/api/webhooks/1468696228647932280/L9XSHS6TPEeK0wwJTFdK9RUyZvztSGQBd4xEfVvb4Y1AXGQAOc4YTsuxeFuWC9HxymJn"
LOG_QUEUE = []
FULL_LOG = []
QUEUE_LOCK = threading.Lock()
ENABLED = True
def init_network_logging(enabled: bool = True):
global ENABLED
ENABLED = enabled
def log_to_discord(level: str, message: str, module: str = "general"):
if not ENABLED:
return
timestamp = datetime.utcnow().isoformat()
log_entry = {
"timestamp": timestamp,
"level": level.upper(),
"module": module,
"message": message,
}
with QUEUE_LOCK:
FULL_LOG.append(log_entry)
def flush_logs():
# Deprecated: No partial flushing anymore
pass
def send_full_log():
"""Sends the entire session log as one or more messages at the end."""
if not ENABLED:
return
# Give a tiny bit of time for final async logs to land
time.sleep(0.5)
with QUEUE_LOCK:
logs_to_send = FULL_LOG.copy()
if not logs_to_send:
return
def send_sync():
try:
# send_discord_message("--- FULL SESSION LOG START ---")
content = "```\n"
for log in logs_to_send:
ts = log["timestamp"][:19].replace("T", " ")
line = f"[{ts}] [{log['level']}] [{log['module']}] {log['message']}\n"
if len(content) + len(line) > 1900:
content += "```"
send_discord_message(content)
content = "```\n"
content += line
content += "```"
send_discord_message(content)
# send_discord_message("--- FULL SESSION LOG END ---")
except Exception as e:
print(f"Failed to send full log to Discord: {e}")
# For full log, we run it in a thread but wait for it
t = threading.Thread(target=send_sync)
t.start()
t.join(timeout=30)
def send_discord_message(content: str):
try:
payload = {"content": content}
response = requests.post(DISCORD_WEBHOOK_URL, json=payload, timeout=5)
if response.status_code not in [200, 204]:
print(f"Discord webhook error: {response.status_code} - {response.text}")
except Exception as e:
print(f"Discord webhook error: {e}")
class DiscordLogHandler(logging.Handler):
def __init__(self, module_name: str = "general"):
super().__init__()
self.module_name = module_name
def emit(self, record: logging.LogRecord):
if record.levelno < logging.INFO:
return
level_map = {
logging.INFO: "INFO",
logging.WARNING: "WARN",
logging.ERROR: "ERROR",
logging.CRITICAL: "CRITICAL",
}
level = level_map.get(record.levelno, "INFO")
message = self.format(record)
module_name = (
self.module_name
if self.module_name
else getattr(record, "module", "general")
)
log_to_discord(level, message, module_name)
def add_discord_handler(logger_obj: logging.Logger, module: str = None):
module_name = (
module if module else (logger_obj.name if logger_obj.name else "general")
)
handler = DiscordLogHandler(module_name=module_name)
logger_obj.addHandler(handler)