Source code for icclim.logger

"""Logging utilities for icclim."""

from __future__ import annotations

import dataclasses
import logging
import time

from icclim._core.model.registry import Registry

_logger = logging.getLogger(__name__)


@dataclasses.dataclass
class Verbosity:
    """Represent a verbosity level for icclim logging."""

    verbosity_level: str
    log_level: str


[docs] class VerbosityRegistry(Registry[Verbosity]): """Registry of available verbosity levels.""" _item_class = Verbosity LOW = Verbosity("LOW", "INFO") HIGH = Verbosity("HIGH", "INFO") SILENT = Verbosity("SILENT", "ERROR") @staticmethod
[docs] def get_item_aliases(item: Verbosity) -> list[str]: """Return the aliases for the given verbosity level.""" return [item.verbosity_level.upper()]
[docs] class IcclimLogger: """ Singleton to display and control logs in icclim library. """ __instance = None verbosity: Verbosity = VerbosityRegistry.LOW @staticmethod def get_instance(verbosity: Verbosity = VerbosityRegistry.LOW) -> IcclimLogger: """Return the singleton instance of IcclimLogger.""" if IcclimLogger.__instance is None: return IcclimLogger(verbosity) return IcclimLogger.__instance def __init__(self, verbosity: Verbosity) -> None: """Initialize the IcclimLogger singleton.""" if IcclimLogger.__instance is not None: msg = "This class is a singleton! Use IcclimLogger.get_instance()." raise RuntimeError(msg) IcclimLogger.__instance = self self.verbosity = verbosity logging.basicConfig(level=verbosity.log_level, format="%(asctime)s %(message)s") def set_verbosity(self, verbosity: str | Verbosity) -> None: """Set the verbosity level of icclim logging.""" if isinstance(verbosity, str): verbosity = VerbosityRegistry.lookup(verbosity) self.verbosity = verbosity logging.root.setLevel(verbosity.log_level) def start_message(self) -> None: """Log the start message for icclim computation.""" from icclim import __version__ as icclim_version # noqa: PLC0415 time_now = time.asctime(time.gmtime()) if self.verbosity == VerbosityRegistry.SILENT: return if self.verbosity == VerbosityRegistry.LOW: _logger.info("--- icclim %s", icclim_version) _logger.info("--- BEGIN EXECUTION") return _logger.info( " ********************************************************************************************" ) _logger.info( " * *" ) _logger.info(" * icclim %s *", icclim_version) _logger.info( " * *" ) _logger.info( " * *" ) _logger.info( " * %s *", time_now, ) _logger.info( " * *" ) _logger.info( " * BEGIN EXECUTION *" ) _logger.info( " * *" ) _logger.info( " ********************************************************************************************" ) def ending_message(self, time_cpu: float) -> None: """Log the ending message for icclim computation.""" from icclim import __version__ as icclim_version # noqa: PLC0415 time_now = time.asctime(time.gmtime()) if self.verbosity == VerbosityRegistry.SILENT: return if self.verbosity == VerbosityRegistry.LOW: _logger.info("--- icclim %s", icclim_version) _logger.info("--- CPU SECS = %-10.3f", time_cpu) _logger.info("--- END EXECUTION") return _logger.info( " ********************************************************************************************" ) _logger.info( " * *" ) _logger.info(" * icclim %s *", icclim_version) _logger.info( " * *" ) _logger.info( " * *" ) _logger.info( " * %s *", time_now, ) _logger.info( " * *" ) _logger.info( " * END EXECUTION *" ) _logger.info( " * *" ) _logger.info( " * CP SECS = %s *", time_cpu, ) _logger.info( " * *" ) _logger.info( " ********************************************************************************************" ) def info(self, *args: object) -> None: """Log an info message.""" _logger.info(args) def deprecation_warning(self, old: str, new: str | None = None) -> None: """Emit a deprecation warning.""" if new: _logger.warning( "DEPRECATION_WARNING: `%s` is deprecated. Use `%s` instead.", old, new, ) else: _logger.warning( "DEPRECATION_WARNING: `%s` is deprecated and will be removed. Its value is ignored.", old, ) def callback(self, percent: float) -> None: """Log the current processing percentage.""" _logger.info("Processing: %s%%", percent)