Coverage for src/srunx/logging.py: 35%

26 statements  

« prev     ^ index     » next       coverage.py v7.9.1, created at 2025-06-17 20:31 +0900

1"""Centralized logging configuration for srunx.""" 

2 

3import sys 

4 

5from loguru import logger 

6from loguru._logger import Logger 

7 

8 

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. 

17 

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() 

27 

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) 

40 

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 ) 

50 

51 

52def configure_cli_logging(level: str = "INFO", quiet: bool = False) -> None: 

53 """Configure logging specifically for CLI usage. 

54 

55 Args: 

56 level: Logging level. 

57 quiet: If True, only show WARNING and above. 

58 """ 

59 if quiet: 

60 level = "WARNING" 

61 

62 # Simple format for CLI 

63 format_string = "<level>{level: <8}</level> | <level>{message}</level>" 

64 

65 configure_logging( 

66 level=level, 

67 format_string=format_string, 

68 show_time=False, 

69 show_level=True, 

70 colorize=True, 

71 ) 

72 

73 

74def configure_workflow_logging(level: str = "INFO") -> None: 

75 """Configure logging for workflow execution. 

76 

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 "<cyan>{name}</cyan> | " 

85 "<level>{message}</level>" 

86 ) 

87 

88 configure_logging( 

89 level=level, 

90 format_string=format_string, 

91 show_time=True, 

92 show_level=True, 

93 colorize=True, 

94 ) 

95 

96 

97def get_logger(name: str) -> Logger: 

98 """Get a logger instance for a module. 

99 

100 Args: 

101 name: Module name (usually __name__). 

102 

103 Returns: 

104 Logger instance. 

105 """ 

106 return logger.bind(name=name) # type: ignore 

107 

108 

109# Export logger for convenience 

110__all__ = [ 

111 "logger", 

112 "configure_logging", 

113 "configure_cli_logging", 

114 "configure_workflow_logging", 

115 "get_logger", 

116]