Coverage for graphqler / utils / logging_utils.py: 88%

58 statements  

« prev     ^ index     » next       coverage.py v7.13.4, created at 2026-03-20 10:09 -0400

1import logging 

2from graphqler import config 

3from pathlib import Path 

4from graphqler.utils.singleton import singleton 

5from graphqler.utils.file_utils import initialize_file 

6 

7 

8@singleton 

9class Logger: 

10 fuzzer_logger = None 

11 compiler_logger = None 

12 detector_logger = None 

13 idor_logger = None 

14 fuzzer_log_path = Path(config.OUTPUT_DIRECTORY) / Path(config.FUZZER_LOG_FILE_PATH) 

15 compiler_log_path = Path(config.OUTPUT_DIRECTORY) / Path(config.COMPILER_LOG_FILE_PATH) 

16 detector_log_path = Path(config.OUTPUT_DIRECTORY) / Path(config.DETECTOR_LOG_FILE_PATH) 

17 idor_log_path = Path(config.OUTPUT_DIRECTORY) / Path(config.IDOR_LOG_FILE_PATH) 

18 

19 def __init__(self): 

20 self.fuzzer_log_path = Path(config.OUTPUT_DIRECTORY) / Path(config.FUZZER_LOG_FILE_PATH) 

21 self.compiler_log_path = Path(config.OUTPUT_DIRECTORY) / Path(config.COMPILER_LOG_FILE_PATH) 

22 self.detector_log_path = Path(config.OUTPUT_DIRECTORY) / Path(config.DETECTOR_LOG_FILE_PATH) 

23 self.idor_log_path = Path(config.OUTPUT_DIRECTORY) / Path(config.IDOR_LOG_FILE_PATH) 

24 

25 def get_fuzzer_logger(self) -> logging.Logger: 

26 """Gets the fuzzer logger. Creates the logger if it doesn't exist, and creates the log file if it doesn't exist 

27 

28 Returns: 

29 logging.Logger: The fuzzer logger 

30 """ 

31 # create the log file if it doesn't exist 

32 if not self.fuzzer_log_path.exists(): 

33 self.fuzzer_log_path.parent.mkdir(parents=True, exist_ok=True) 

34 initialize_file(self.fuzzer_log_path) 

35 

36 # create the logger if it doesn't exist 

37 if not self.fuzzer_logger or not self.fuzzer_logger.hasHandlers(): 

38 self.fuzzer_logger = self._get_logger("fuzzer", self.fuzzer_log_path) 

39 

40 # return the logger 

41 return self.fuzzer_logger 

42 

43 def get_detector_logger(self) -> logging.Logger: 

44 """Gets the detector logger. Creates the logger if it doesn't exist, and creates the log file if it doesn't exist 

45 

46 Returns: 

47 logging.Logger: The detector logger 

48 """ 

49 # create the log file if it doesn't exist 

50 if not self.detector_log_path.exists(): 

51 self.detector_log_path.parent.mkdir(parents=True, exist_ok=True) 

52 initialize_file(self.detector_log_path) 

53 

54 # create the logger if it doesn't exist 

55 if not self.detector_logger or not self.detector_logger.hasHandlers(): 

56 self.detector_logger = self._get_logger("detector", self.detector_log_path) 

57 

58 # return the logger 

59 return self.detector_logger 

60 

61 def get_compiler_logger(self) -> logging.Logger: 

62 """Gets the compiler logger. Creates the logger if it doesn't exist, and creates the log file if it doesn't exist 

63 

64 Returns: 

65 logging.Logger: The compiler logger 

66 """ 

67 # create the log file if it doesn't exist 

68 if not self.compiler_log_path.exists(): 

69 self.compiler_log_path.parent.mkdir(parents=True, exist_ok=True) 

70 initialize_file(self.compiler_log_path) 

71 

72 # create the logger if it doesn't exist 

73 if not self.compiler_logger: 

74 self.compiler_logger = self._get_logger("compiler", self.compiler_log_path) 

75 

76 # return the logger 

77 return self.compiler_logger 

78 

79 def get_idor_logger(self) -> logging.Logger: 

80 """Gets the IDOR logger. Creates the logger if it doesn't exist, and creates the log file if it doesn't exist 

81 

82 Returns: 

83 logging.Logger: The IDOR logger 

84 """ 

85 # create the log file if it doesn't exist 

86 if not self.idor_log_path.exists(): 

87 self.idor_log_path.parent.mkdir(parents=True, exist_ok=True) 

88 initialize_file(self.idor_log_path) 

89 

90 # create the logger if it doesn't exist 

91 if not self.idor_logger: 

92 self.idor_logger = self._get_logger("idor", self.idor_log_path) 

93 

94 # return the logger 

95 return self.idor_logger 

96 

97 def _get_logger(self, name: str, file_path: str | Path) -> logging.Logger: 

98 """Gets a logger with the given name, file path, and level. Creates any required directories 

99 

100 Args: 

101 name (str): The name of the logger 

102 file_path (str): The file path of the logged file 

103 

104 Returns: 

105 logging.Logger: The logger returned 

106 """ 

107 # create directories if they don't exist 

108 formatter = logging.Formatter("[%(levelname)s][%(asctime)s][%(name)s]:%(message)s", datefmt="%Y-%m-%d %H:%M:%S") 

109 handler = logging.FileHandler(file_path) 

110 handler.setFormatter(formatter) 

111 

112 logger = logging.getLogger(name) 

113 if config.DEBUG: 

114 logger.setLevel(logging.DEBUG) 

115 else: 

116 logger.setLevel(logging.INFO) 

117 logger.addHandler(handler) 

118 

119 return logger