#!/usr/bin/env python3 # SPDX-FileCopyrightText: (C) 2025 Enno Tensing # # SPDX-License-Identifier: GPL-2.0-only """Implement a simple logging framework.""" import datetime from pathlib import Path from typing import TypeAlias UNKNOWN = -1 ERROR = 0 WARNING = 1 INFO = 2 DEBUG = 3 LogLevel: TypeAlias = int class Log: """Class for Logging.""" level: LogLevel = ERROR messages: list = [] logfile: Path def __init__(self, path: str) -> None: """Init for Log.""" if path == "": path = "/dev/stdout" self.logfile = Path(path) def log_error(self, msg: str) -> None: """Log an error.""" if self.level >= ERROR: now = self.timestamp() prefix = "EE" log_message = f"[{now}] ({prefix}) {msg}" self.write_message(log_message) def log_warning(self, msg: str) -> None: """Log a warning.""" if self.level >= WARNING: now = self.timestamp() prefix = "WW" log_message = f"[{now}] ({prefix}) {msg}" self.write_message(log_message) def log_info(self, msg: str) -> None: """Log an information.""" if self.level >= INFO: now = self.timestamp() prefix = "II" log_message = f"[{now}] ({prefix}) {msg}" self.write_message(log_message) def log_debug(self, msg: str) -> None: """Log a debug message.""" if self.level >= DEBUG: now = self.timestamp() prefix = "DD" log_message = f"[{now}] ({prefix}) {msg}" self.write_message(log_message) def write_message(self, msg: str) -> None: """Write the message.""" print(msg) if self.logfile == Path("/dev/stdout"): return with self.logfile.open("a+", encoding="utf-8") as f: f.write(msg) def timestamp(self) -> str: """Log timestamp.""" return datetime.datetime.now(tz=datetime.UTC).strftime( "%Y-%m-%d %H:%M:%S", )