Source code for smonitor.emitters.logging
from __future__ import annotations
import logging
from typing import Optional
from ..core.manager import get_manager
[docs]
class SmonitorLoggingHandler(logging.Handler):
[docs]
def emit(self, record: logging.LogRecord) -> None:
manager = get_manager()
if getattr(record, "smonitor", False):
return
try:
message = record.getMessage()
except Exception:
message = str(record.msg)
manager.emit(
record.levelname,
message,
source=record.name,
extra={"module": record.module, "funcName": record.funcName},
)
_installed_handler: Optional[SmonitorLoggingHandler] = None
_capture_warnings_enabled = False
[docs]
def enable_logging(*, capture_warnings: bool = False) -> None:
global _installed_handler, _capture_warnings_enabled
root_logger = logging.getLogger()
if _installed_handler is None and not root_logger.handlers:
_installed_handler = SmonitorLoggingHandler()
root_logger.addHandler(_installed_handler)
if capture_warnings and not _capture_warnings_enabled:
logging.captureWarnings(True)
_capture_warnings_enabled = True
[docs]
def disable_logging() -> None:
global _installed_handler, _capture_warnings_enabled
if _installed_handler is not None:
logging.getLogger().removeHandler(_installed_handler)
_installed_handler = None
if _capture_warnings_enabled:
logging.captureWarnings(False)
_capture_warnings_enabled = False