def logListenerSetup(loggingQueue, opts: dict = None) -> 'logging.handlers.QueueListener': """Create and start a SpiderFoot log listener in its own thread. This function should be called as soon as possible in the main process, or whichever process is attached to stdin/stdout. Args: loggingQueue (Queue): Queue (accepts both normal and multiprocessing queue types) Must be instantiated in the main process. opts (dict): SpiderFoot config Returns: spiderFootLogListener (logging.handlers.QueueListener): Log listener """ if opts is None: opts = dict() doLogging = opts.get("__logging", True) debug = opts.get("_debug", False) logLevel = (logging.DEBUG if debug else logging.INFO) # Log to terminal console_handler = logging.StreamHandler(sys.stderr) # Log debug messages to file log_dir = SpiderFootHelpers.logPath() debug_handler = logging.handlers.TimedRotatingFileHandler( f"{log_dir}/spiderfoot.debug.log", when="d", interval=1, backupCount=30) # Log error messages to file error_handler = logging.handlers.TimedRotatingFileHandler( f"{log_dir}/spiderfoot.error.log", when="d", interval=1, backupCount=30) # Filter by log level console_handler.addFilter(lambda x: x.levelno >= logLevel) debug_handler.addFilter(lambda x: x.levelno >= logging.DEBUG) error_handler.addFilter(lambda x: x.levelno >= logging.WARN) # Set log format log_format = logging.Formatter( "%(asctime)s [%(levelname)s] %(module)s : %(message)s") debug_format = logging.Formatter( "%(asctime)s [%(levelname)s] %(filename)s:%(lineno)s : %(message)s") console_handler.setFormatter(log_format) debug_handler.setFormatter(debug_format) error_handler.setFormatter(debug_format) if doLogging: handlers = [console_handler, debug_handler, error_handler] else: handlers = [] if doLogging and opts is not None: sqlite_handler = SpiderFootSqliteLogHandler(opts) sqlite_handler.setLevel(logLevel) sqlite_handler.setFormatter(log_format) handlers.append(sqlite_handler) spiderFootLogListener = QueueListener(loggingQueue, *handlers) spiderFootLogListener.start() atexit.register(stop_listener, spiderFootLogListener) return spiderFootLogListener
def test_log_path_should_return_a_string(self): """ Test logPath() """ log_path = SpiderFootHelpers.logPath() self.assertIsInstance(log_path, str)