Coverage for dqm/utils/twe_logger.py: 63%

41 statements  

« prev     ^ index     » next       coverage.py v7.10.6, created at 2025-09-05 14:00 +0000

1""" 

2The confiance_logger module provides a preconfigured logger for logging messages 

3with specified formatting and output control. It can log messages to the standard output, 

4to a specified file, or both. 

5 

6Usage: 

7 Import the module and get the default logger: 

8 import twe_logger 

9 logger = twe_logger.get_logger() 

10 

11 If you need a logger with different parameters, call `get_logger` with the desired parameters: 

12 

13 logger = twe_logger.get_logger(filename="my_logs.log") 

14 logger = twe_logger.get_logger(name="my_logger", level='debug', 

15 filename='my_logs.log', output="both") 

16 Then, use the logger within your code: 

17 

18 logger.info("This is an info message") 

19 logger.error("This is an error message") 

20""" 

21 

22import logging 

23import sys 

24 

25LOGGER_DEFAULT_NAME = "twe_logger" 

26 

27 

28def log_str_to_level(str_level): 

29 """ 

30 Converts a string to a corresponding logging level. 

31 

32 Args: 

33 str_level (str): The logging level as a string. 

34 

35 Returns: 

36 int: The corresponding logging level. 

37 """ 

38 if str_level == "debug": 

39 level = logging.DEBUG 

40 elif str_level == "info": 

41 level = logging.INFO 

42 elif str_level == "warning": 

43 level = logging.WARNING 

44 elif str_level == "error": 

45 level = logging.ERROR 

46 elif str_level == "critical": 

47 level = logging.CRITICAL 

48 else: 

49 level = logging.NOTSET 

50 return level 

51 

52 

53def get_logger(name=LOGGER_DEFAULT_NAME, level="debug", filename=None, output=None): 

54 """ 

55 Creates and returns a logger. 

56 

57 Args: 

58 name (str, optional): The name of the logger. 

59 level (int or str, optional): The logging level. 

60 filename (str, optional): The name of the file where the logger should write. 

61 output (str, optional): Where should the logger write. 

62 Can be 'stdout', 'file', or 'both'. 

63 

64 Returns: 

65 logging.Logger: The logger. 

66 """ 

67 if isinstance(level, str): 

68 level = log_str_to_level(level) 

69 

70 # Decide the output based on whether a filename is provided and output is specified 

71 if output is None: 

72 output = "file" if filename else "stdout" 

73 

74 logger = logging.getLogger(name) 

75 formatter = logging.Formatter( 

76 "[%(asctime)s] {%(pathname)s:%(lineno)d} %(levelname)s \ 

77 - %(message)s", 

78 "%m-%d %H:%M:%S", 

79 ) 

80 

81 handlers = [] 

82 

83 if output in ["stdout", "both"]: 

84 # StreamHandler to send logs to stdout 

85 stream_handler = logging.StreamHandler(stream=sys.stdout) 

86 stream_handler.setFormatter(formatter) 

87 stream_handler.setLevel(level) 

88 handlers.append(stream_handler) 

89 

90 if output in ["file", "both"] and filename: 

91 # FileHandler to send logs to a file 

92 file_handler = logging.FileHandler(filename) 

93 file_handler.setFormatter(formatter) 

94 file_handler.setLevel(level) 

95 handlers.append(file_handler) 

96 

97 if not logging.getLogger(name).hasHandlers(): 

98 for handler in handlers: 

99 logger.addHandler(handler) 

100 else: 

101 logger.handlers = handlers 

102 logger.setLevel(level) 

103 logger.info("Logger: %s, handlers: %s", name, logger.handlers) 

104 return logger