From a09b6bf8aae6bd7c2a758ec67e57063d07b23e74 Mon Sep 17 00:00:00 2001 From: martin legrand Date: Sat, 5 Apr 2025 12:12:38 +0200 Subject: [PATCH] feat : logger class for better logging --- sources/browser.py | 18 +++++---------- sources/logger.py | 55 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+), 12 deletions(-) create mode 100644 sources/logger.py diff --git a/sources/browser.py b/sources/browser.py index cd94274..fbf73ad 100644 --- a/sources/browser.py +++ b/sources/browser.py @@ -18,19 +18,18 @@ import random import os import shutil import markdownify -import logging import sys import re if __name__ == "__main__": from utility import pretty_print, animate_thinking + from logger import Logger else: from sources.utility import pretty_print, animate_thinking - -logging.basicConfig(filename='browser.log', level=logging.ERROR, - format='%(asctime)s - %(name)s - %(levelname)s - %(message)s') + from sources.logger import Logger def get_chrome_path() -> str: + """Get the path to the Chrome executable.""" if sys.platform.startswith("win"): paths = [ "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe", @@ -111,14 +110,11 @@ class Browser: """Initialize the browser with optional AntiCaptcha installation.""" self.js_scripts_folder = "./sources/web_scripts/" if not __name__ == "__main__" else "./web_scripts/" self.anticaptcha = "https://chrome.google.com/webstore/detail/nopecha-captcha-solver/dknlfmjaanfblgfdfebhijalfmhmjjjo/related" + self.logger = Logger("browser.log") try: self.driver = driver self.wait = WebDriverWait(self.driver, 10) - self.logger = logging.getLogger(__name__) - self.logger.info("Browser initialized successfully") except Exception as e: - logging.basicConfig(filename='browser.log', level=logging.ERROR, - format='%(asctime)s - %(name)s - %(levelname)s - %(message)s') raise Exception(f"Failed to initialize browser: {str(e)}") self.driver.get("https://www.google.com") if anticaptcha_manual_install: @@ -142,7 +138,7 @@ class Browser: message="stuck on 'checking browser' or verification screen" ) self.apply_web_safety() - self.logger.info(f"Navigated to: {url}") + self.logger.log(f"Navigated to: {url}") return True except TimeoutException as e: self.logger.error(f"Timeout waiting for {url} to load: {str(e)}") @@ -167,7 +163,7 @@ class Browser: return (word_count >= 5 and (has_punctuation or is_long_enough)) def get_text(self) -> str | None: - """Get page text and convert it to README (Markdown) format.""" + """Get page text.""" try: soup = BeautifulSoup(self.driver.page_source, 'html.parser') @@ -450,8 +446,6 @@ class Browser: input_elements = self.driver.execute_script(script) if __name__ == "__main__": - logging.basicConfig(level=logging.INFO) - driver = create_driver() browser = Browser(driver, anticaptcha_manual_install=True) time.sleep(10) diff --git a/sources/logger.py b/sources/logger.py new file mode 100644 index 0000000..af0d0f0 --- /dev/null +++ b/sources/logger.py @@ -0,0 +1,55 @@ +import os, sys +from typing import List, Tuple, Type, Dict, Tuple +import datetime +import logging + +class Logger: + def __init__(self, log_filename): + self.folder = '.logs' + self.create_folder(self.folder) + self.log_path = os.path.join(self.folder, log_filename) + self.enabled = True + self.logger = None + if self.enabled: + self.create_logging(log_filename) + + def create_logging(self, log_filename): + self.logger = logging.getLogger(log_filename) + self.logger.setLevel(logging.DEBUG) + if not self.logger.handlers: + file_handler = logging.FileHandler(self.log_path) + formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') + file_handler.setFormatter(formatter) + self.logger.addHandler(file_handler) + + def create_folder(self, path): + """Create log dir""" + try: + if not os.path.exists(path): + os.makedirs(path, exist_ok=True) + return True + except Exception as e: + self.enabled = False + return False + + def log(self, message, level=logging.INFO): + if self.enabled: + self.logger.log(level, message) + + def info(self, message): + self.log(message) + + def error(self, message): + self.log(message, level=logging.ERROR) + + def warning(self, message): + self.log(message, level=logging.WARN) + +if __name__ == "__main__": + lg = Logger("test.log") + lg.log("hello") + lg2 = Logger("toto.log") + lg2.log("yo") + + + \ No newline at end of file