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
« 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.
6Usage:
7 Import the module and get the default logger:
8 import twe_logger
9 logger = twe_logger.get_logger()
11 If you need a logger with different parameters, call `get_logger` with the desired parameters:
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:
18 logger.info("This is an info message")
19 logger.error("This is an error message")
20"""
22import logging
23import sys
25LOGGER_DEFAULT_NAME = "twe_logger"
28def log_str_to_level(str_level):
29 """
30 Converts a string to a corresponding logging level.
32 Args:
33 str_level (str): The logging level as a string.
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
53def get_logger(name=LOGGER_DEFAULT_NAME, level="debug", filename=None, output=None):
54 """
55 Creates and returns a logger.
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'.
64 Returns:
65 logging.Logger: The logger.
66 """
67 if isinstance(level, str):
68 level = log_str_to_level(level)
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"
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 )
81 handlers = []
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)
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)
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