@@ -22,53 +22,98 @@ def format(self, record: logging.LogRecord) -> str:
2222 return super ().format (record )
2323
2424
25- def get_logger (
26- name : str = "scrapegraph" ,
27- level : str = "INFO" ,
28- log_file : Optional [str ] = None ,
29- log_format : Optional [str ] = None ,
30- ) -> logging .Logger :
31- """
32- Get a configured logger instance with emoji support.
33-
34- Args:
35- name: Name of the logger (default: 'scrapegraph')
36- level: Logging level (default: 'INFO')
37- log_file: Optional file path to write logs to
38- log_format: Optional custom log format string
39-
40- Returns:
41- logging.Logger: Configured logger instance
42- """
43- logger = logging .getLogger (name )
44-
45- # Return existing logger if already configured
46- if logger .handlers :
47- return logger
48-
49- # Set log level
50- level = getattr (logging , level .upper (), logging .INFO )
51- logger .setLevel (level )
52-
53- # Default format if none provided
54- if not log_format :
55- log_format = "%(levelname)-6s %(asctime)-15s %(message)s"
56-
57- formatter = EmojiFormatter (log_format )
58-
59- # Console handler
60- console_handler = logging .StreamHandler ()
61- console_handler .setFormatter (formatter )
62- logger .addHandler (console_handler )
63-
64- # File handler if log_file specified
65- if log_file :
66- file_handler = logging .FileHandler (log_file )
67- file_handler .setFormatter (formatter )
68- logger .addHandler (file_handler )
69-
70- return logger
71-
72-
73- # Default sgai logger instance
74- sgai_logger = get_logger ()
25+ class ScrapegraphLogger :
26+ """Class to manage Scrapegraph logging configuration"""
27+
28+ _instance = None
29+ _initialized = False
30+
31+ def __new__ (cls ):
32+ if cls ._instance is None :
33+ cls ._instance = super (ScrapegraphLogger , cls ).__new__ (cls )
34+ return cls ._instance
35+
36+ def __init__ (self ):
37+ if not self ._initialized :
38+ self .logger = logging .getLogger ("scrapegraph" )
39+ self .logger .setLevel (logging .INFO )
40+ self .enabled = False
41+ self ._initialized = True
42+
43+ def set_logging (
44+ self ,
45+ level : Optional [str ] = None ,
46+ log_file : Optional [str ] = None ,
47+ log_format : Optional [str ] = None ,
48+ ) -> None :
49+ """
50+ Configure logging settings. If level is None, logging will be disabled.
51+
52+ Args:
53+ level: Logging level (e.g., 'DEBUG', 'INFO'). None to disable logging.
54+ log_file: Optional file path to write logs to
55+ log_format: Optional custom log format string
56+ """
57+ # Clear existing handlers
58+ self .logger .handlers .clear ()
59+
60+ if level is None :
61+ # Disable logging
62+ self .enabled = False
63+ return
64+
65+ # Enable logging with specified level
66+ self .enabled = True
67+ level = getattr (logging , level .upper (), logging .INFO )
68+ self .logger .setLevel (level )
69+
70+ # Default format if none provided
71+ if not log_format :
72+ log_format = "%(emoji)s %(asctime)-15s %(message)s"
73+
74+ formatter = EmojiFormatter (log_format )
75+
76+ # Console handler
77+ console_handler = logging .StreamHandler ()
78+ console_handler .setFormatter (formatter )
79+ self .logger .addHandler (console_handler )
80+
81+ # File handler if log_file specified
82+ if log_file :
83+ file_handler = logging .FileHandler (log_file )
84+ file_handler .setFormatter (formatter )
85+ self .logger .addHandler (file_handler )
86+
87+ def disable (self ) -> None :
88+ """Disable all logging"""
89+ self .logger .handlers .clear ()
90+ self .enabled = False
91+
92+ def debug (self , message : str ) -> None :
93+ """Log debug message if logging is enabled"""
94+ if self .enabled :
95+ self .logger .debug (message )
96+
97+ def info (self , message : str ) -> None :
98+ """Log info message if logging is enabled"""
99+ if self .enabled :
100+ self .logger .info (message )
101+
102+ def warning (self , message : str ) -> None :
103+ """Log warning message if logging is enabled"""
104+ if self .enabled :
105+ self .logger .warning (message )
106+
107+ def error (self , message : str ) -> None :
108+ """Log error message if logging is enabled"""
109+ if self .enabled :
110+ self .logger .error (message )
111+
112+ def critical (self , message : str ) -> None :
113+ """Log critical message if logging is enabled"""
114+ if self .enabled :
115+ self .logger .critical (message )
116+
117+
118+ # Default logger instance
119+ sgai_logger = ScrapegraphLogger ()
0 commit comments