Coverage for src/srunx/logging.py: 35%
26 statements
« prev ^ index » next coverage.py v7.9.1, created at 2025-06-22 15:10 +0000
« prev ^ index » next coverage.py v7.9.1, created at 2025-06-22 15:10 +0000
1"""Centralized logging configuration for srunx."""
3import sys
5from loguru import logger
6from loguru._logger import Logger
9def configure_logging(
10 level: str = "INFO",
11 format_string: str | None = None,
12 show_time: bool = True,
13 show_level: bool = True,
14 colorize: bool = True,
15) -> None:
16 """Configure loguru logging for srunx.
18 Args:
19 level: Logging level (DEBUG, INFO, WARNING, ERROR, CRITICAL).
20 format_string: Custom format string. If None, uses default format.
21 show_time: Whether to show timestamp in logs.
22 show_level: Whether to show log level in logs.
23 colorize: Whether to colorize the output.
24 """
25 # Remove default logger
26 logger.remove()
28 # Build format string
29 if format_string is None:
30 format_parts = []
31 if show_time:
32 format_parts.append("<green>{time:YYYY-MM-DD HH:mm:ss}</green>")
33 if show_level:
34 format_parts.append("<level>{level: <8}</level>")
35 format_parts.append(
36 "<cyan>{name}</cyan>:<cyan>{function}</cyan>:<cyan>{line}</cyan>"
37 )
38 format_parts.append("<level>{message}</level>")
39 format_string = " | ".join(format_parts)
41 # Add stderr handler
42 logger.add(
43 sys.stderr,
44 format=format_string,
45 level=level,
46 colorize=colorize,
47 backtrace=True,
48 diagnose=True,
49 )
52def configure_cli_logging(level: str = "INFO", quiet: bool = False) -> None:
53 """Configure logging specifically for CLI usage.
55 Args:
56 level: Logging level.
57 quiet: If True, only show WARNING and above.
58 """
59 if quiet:
60 level = "WARNING"
62 # Simple format for CLI
63 format_string = "<level>{level: <8}</level> | <level>{message}</level>"
65 configure_logging(
66 level=level,
67 format_string=format_string,
68 show_time=False,
69 show_level=True,
70 colorize=True,
71 )
74def configure_workflow_logging(level: str = "INFO") -> None:
75 """Configure logging for workflow execution.
77 Args:
78 level: Logging level.
79 """
80 # Detailed format for workflows
81 format_string = (
82 "<green>{time:HH:mm:ss}</green> | "
83 "<level>{level: <8}</level> | "
84 "<level>{message}</level>"
85 )
87 configure_logging(
88 level=level,
89 format_string=format_string,
90 show_time=True,
91 show_level=True,
92 colorize=True,
93 )
96def get_logger(name: str) -> Logger:
97 """Get a logger instance for a module.
99 Args:
100 name: Module name (usually __name__).
102 Returns:
103 Logger instance.
104 """
105 return logger.bind(name=name) # type: ignore
108# Export logger for convenience
109__all__ = [
110 "logger",
111 "configure_logging",
112 "configure_cli_logging",
113 "configure_workflow_logging",
114 "get_logger",
115]