Coverage for src/susi/base/logging.py: 62%

48 statements  

« prev     ^ index     » next       coverage.py v7.5.0, created at 2025-06-13 14:15 +0000

1"""SUSI Logging module""" 

2import os 

3import logging 

4 

5 

6class Logging: 

7 """ 

8 Facade for python logging. 

9 Provides easy setup and configuration methods. 

10 """ 

11 #: Default name of the SUSI logger 

12 LOG_NAME = 'SUSI' 

13 #: Default Log Format 

14 FORMAT = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') 

15 

16 @staticmethod 

17 def init_console(level: int = logging.INFO) -> None: 

18 """ 

19 Init console logging. 

20 """ 

21 # Delete Jupyter notebook root logger handler, see https://github.com/ipython/ipython/issues/8282 

22 logger = logging.getLogger() 

23 logger.handlers = [] 

24 

25 # Create root logger with minimum supported log level 

26 logger = logging.getLogger(Logging.LOG_NAME) 

27 logger.setLevel(level) 

28 

29 # create console logging handler 

30 ch = logging.StreamHandler() 

31 ch.setLevel(logging.DEBUG) 

32 ch.setFormatter(Logging.FORMAT) 

33 logger.addHandler(ch) 

34 

35 @staticmethod 

36 def init_file(file_name: str, level: int = logging.INFO) -> None: 

37 """ 

38 Init logging to a log file. 

39 """ 

40 os.makedirs(os.path.dirname(file_name), exist_ok=True) 

41 logger = Logging.get_logger() 

42 fh = logging.FileHandler(file_name) 

43 fh.setLevel(level) 

44 fh.setFormatter(Logging.FORMAT) 

45 logger.addHandler(fh) 

46 

47 @staticmethod 

48 def get_logger() -> logging.Logger: 

49 """ 

50 Retrieve the SUSI default logger 

51 """ 

52 return logging.getLogger(Logging.LOG_NAME) 

53 

54 @staticmethod 

55 def set_log_level(level: int) -> None: 

56 """ 

57 Set the logging level of the application. Per default the level is set to INFO (1). 

58 

59 ### Params 

60 - level: (int) The level to set, where 

61 - 0: DEBUG 

62 - 1: INFO 

63 - 2: WARNING 

64 - 3: ERROR 

65 - 4: CRITICAL 

66 """ 

67 log = Logging.get_logger() 

68 if level < 1: 

69 log.setLevel(logging.DEBUG) 

70 elif level < 2: 

71 log.setLevel(logging.INFO) 

72 elif level < 3: 

73 log.setLevel(logging.WARNING) 

74 elif level < 4: 

75 log.setLevel(logging.ERROR) 

76 else: 

77 log.setLevel(logging.CRITICAL) 

78 

79 @staticmethod 

80 def welcome(args, script_name, version: str = None, log_dir=None) -> None: 

81 """ 

82 Print a welcome message in CLI scripts. 

83 """ 

84 log = Logging.get_logger() 

85 log.info("========== %s ==============", script_name) 

86 if version is not None: 

87 log.info('Version: %s', version) 

88 log.info('Arguments: %s', args) 

89 if log_dir is not None: 

90 log.info('Logging directory: %s', log_dir) 

91 log.info("======================================")