Skip to content

morelogging.LogStream

Annotations

from functools import cached_property
import hashlib
import uuid as uuidlib
from typing import Any, Optional
from collections.abc import Iterable

from moretyping.meta import Unknown

from .abstract import LogHandler
from .data_wrappers import Log, LogStreamInfo
from .enums import LogLevel

class LogStream:
    name: str
    uuid: str

    def __init__(self, name: str) -> None:
        self.__dict__["name"] = name
        self.__dict__["uuid"] = uuidlib.uuid4().hex
        self.data: list[Log] = []
        self.handlers: dict[str, LogHandler] = {}
        self.logLevel = LogLevel.DEBUG

    @property
    def lsi(self) -> LogStreamInfo:
        return LogStreamInfo(name=self.name, logLevel=self.logLevel)

    @cached_property
    def identifier(self) -> str:
        return hashlib.sha3_512(str((self.name, self.uuid)).encode('utf8')).hexdigest()

    def add_handler(self, handler: LogHandler) -> str:
        ...

        return handler.identifier

    def remove_handler(self, handler_id: str) -> LogHandler:
        if h := self.handlers.get(handler_id):
            ...
            return h  # same id
        else:
            raise KeyError(f"Attempted to remove handler with identifier {handler_id} from log stream {self.name} ({self.identifier}), meanwhile {handler_id} was not found.")

    def clear_handlers(self) -> list[LogHandler]:
        h = list(self.handlers.values())
        self.handlers.clear()
        return h

    def _add_item(self, item: Log) -> None:
        self.data.append(item)
        for handler in self.handlers.values():
            handler._push(item)

    def log(self, level: LogLevel, message: str, *objects: Optional[Iterable[Any]],
            exc_info: Optional[Exception] = None) -> None:
        self._add_item(
            Log(
                level = level,
                message = message,
                objects = objects or [],
                lsi = self.lsi,
                exc_info = exc_info
            )
        )

    ...

Properties

name: str
The name associated with the log stream
stream: LogStream
The LogStream behind the log stream
identifier: str
A unique identifier

Methods

add_handler

def add_handler(self, handler: LogHandler) -> str:
    ...

Adds a log handler to the log stream, and returns its identifier.

remove_handler

def remove_handler(self, handler_id: str) -> LogHandler:
    ...

Removes a handler from the log stream, by its identifier, and returns the log handler instance. It is recommended not to keep the returned instance alive.

clear_handlers

def clear_handlers(self) -> list[LogHandler]:
    ...

Deletes all log handlers form the log stream, returning them in a list. It is recommended not to keep the returned instances alive.

log

def log(self, level: LogLevel, message: str | Unknown, *objects: Optional[Iterable[Any]],
        exc_info: Optional[Exception] = None) -> None:
    ...

Appends a log with log level level, message message, with the objects specified as positional arguments, and with the Exception passed to exc_info, if any.

Objects are concatenated at the end of the message.