codekingpro/portable-devtools
114k
1from __future__ import annotations2 3import asyncio4import logging5import sys6from typing import IO7 8from mitmproxy import ctx9from mitmproxy import log10from mitmproxy.utils import vt_codes11 12 13class TermLog:14 _teardown_task: asyncio.Task | None = None15 16 def __init__(self, out: IO[str] | None = None):17 self.logger = TermLogHandler(out)18 self.logger.install()19 20 def load(self, loader):21 loader.add_option(22 "termlog_verbosity", str, "info", "Log verbosity.", choices=log.LogLevels23 )24 self.logger.setLevel(logging.INFO)25 26 def configure(self, updated):27 if "termlog_verbosity" in updated:28 self.logger.setLevel(ctx.options.termlog_verbosity.upper())29 30 def uninstall(self) -> None:31 # uninstall the log dumper.32 # This happens at the very very end after done() is completed,33 # because we don't want to uninstall while other addons are still logging.34 self.logger.uninstall()35 36 37class TermLogHandler(log.MitmLogHandler):38 def __init__(self, out: IO[str] | None = None):39 super().__init__()40 self.file: IO[str] = out or sys.stdout41 self.has_vt_codes = vt_codes.ensure_supported(self.file)42 self.formatter = log.MitmFormatter(self.has_vt_codes)43 44 def emit(self, record: logging.LogRecord) -> None:45 try:46 print(self.format(record), file=self.file)47 except OSError:48 # We cannot print, exit immediately.49 # See https://github.com/mitmproxy/mitmproxy/issues/466950 sys.exit(1)51 