Przeglądaj źródła

explorer/site: Enhance logging functionality and add application startup banner

Improved logging capabilities for better visibility in the `localnet` environment and during application startup.

Summary of Updates:
- Added a function `add_console_handler_if_localnet` to enable console logging for all loggers when running on `localnet`
- Automatically create the log directory if it does not exist
- Log a banner with key startup details when the application successfully starts
kalm 1 rok temu
rodzic
commit
18dc05283d
2 zmienionych plików z 60 dodań i 37 usunięć
  1. 10 13
      bin/explorer/site/app.py
  2. 50 24
      bin/explorer/site/log.py

+ 10 - 13
bin/explorer/site/app.py

@@ -91,6 +91,15 @@ def create_app():
         # Render the custom 500 error page
         # Render the custom 500 error page
         return render_template('500.html'), 500
         return render_template('500.html'), 500
 
 
+    # Log that we started the site
+    app.logger.info("=" * 60)
+    app.logger.info("Started Explorer Site")
+    app.logger.info("=" * 60)
+    app.logger.info(f"Network: {env}")
+    app.logger.info(f"Explorer Node Endpoint: {app.config['explorer_rpc_url']}:{app.config['explorer_rpc_port']}")
+    app.logger.info(f"Log Path: {app.config['log_path']}")
+    app.logger.info("=" * 60)
+
     return app
     return app
 
 
 def load_toml_config(app, env="localnet", config_path="site_config.toml"):
 def load_toml_config(app, env="localnet", config_path="site_config.toml"):
@@ -119,18 +128,6 @@ def load_toml_config(app, env="localnet", config_path="site_config.toml"):
     if env not in config:
     if env not in config:
         raise KeyError(f"Environment '{env}' not found in {config_path}")
         raise KeyError(f"Environment '{env}' not found in {config_path}")
 
 
-    # Load the environment specific configurations into the Flask app's config object
+    # Load the environment specific configurations into app.config
     for key, value in config[env].items():
     for key, value in config[env].items():
         app.config[key] = value
         app.config[key] = value
-
-    # Print the loaded configuration for debugging or confirmation purposes
-    print("\n" + "=" * 40)
-    print("Loaded Explorer Site Configuration")
-    print("=" * 40)
-
-    for key in config[env]:
-        print(f"{key} = {app.config[key]}")
-
-    print("=" * 40 + "\n")
-
-

+ 50 - 24
bin/explorer/site/log.py

@@ -46,17 +46,16 @@ def setup_logger(app, env):
     """
     """
     log_path = app.config.get('log_path', '.')
     log_path = app.config.get('log_path', '.')
 
 
-    # Error logger setup
-    error_logger = setup_error_logger(log_path, env)
-    app.error_logger = error_logger
-
-    # App logger setup
-    app_logger = setup_app_logger(log_path, env)
-    app.logger = app_logger
+    # Expand the path if home directory is specified
+    log_path = os.path.expanduser(log_path)
 
 
-    # Request logger setup
-    app_log_file = os.path.join(log_path, 'app.log')
-    setup_request_logger(app_log_file, env)
+    # Ensure the log path exists or create it if not
+    if not os.path.exists(log_path):
+        try:
+            os.makedirs(log_path)
+            print(f"created log dir: {log_path}")
+        except OSError as e:
+            raise RuntimeError(f"Unable to create log directory at '{log_path}': {e}")
 
 
     # Get log level from environment variable, default to INFO
     # Get log level from environment variable, default to INFO
     log_level_name = os.environ.get('LOG_LEVEL', 'INFO').upper()
     log_level_name = os.environ.get('LOG_LEVEL', 'INFO').upper()
@@ -67,8 +66,17 @@ def setup_logger(app, env):
             app.logger.warning(f"Invalid LOG_LEVEL '{log_level_name}'. Defaulting to INFO.")
             app.logger.warning(f"Invalid LOG_LEVEL '{log_level_name}'. Defaulting to INFO.")
         log_level = logging.INFO
         log_level = logging.INFO
 
 
-    # Set the overall logger level
-    app.logger.setLevel(log_level)
+    # App logger setup
+    app_logger = setup_app_logger(log_path, env, log_level)
+    app.logger = app_logger
+
+    # Request logger setup
+    app_log_file = os.path.join(log_path, 'app.log')
+    setup_request_logger(app_log_file, env, log_level)
+
+    # Error logger setup
+    error_logger = setup_error_logger(log_path, env)
+    app.error_logger = error_logger
 
 
 def setup_error_logger(log_path, env):
 def setup_error_logger(log_path, env):
     """
     """
@@ -90,6 +98,9 @@ def setup_error_logger(log_path, env):
     error_logger.addHandler(error_handler)
     error_logger.addHandler(error_handler)
     error_logger.setLevel(logging.ERROR)
     error_logger.setLevel(logging.ERROR)
     error_logger.propagate = False
     error_logger.propagate = False
+
+    add_console_handler_if_localnet(env, error_logger, logging.ERROR)
+
     return error_logger
     return error_logger
 
 
 def setup_app_logger(log_path, env, log_level=logging.INFO):
 def setup_app_logger(log_path, env, log_level=logging.INFO):
@@ -110,9 +121,12 @@ def setup_app_logger(log_path, env, log_level=logging.INFO):
     app_logger.addHandler(app_handler)
     app_logger.addHandler(app_handler)
     app_logger.setLevel(log_level)
     app_logger.setLevel(log_level)
     app_logger.propagate = False
     app_logger.propagate = False
+
+    add_console_handler_if_localnet(env, app_logger, log_level)
+
     return app_logger
     return app_logger
 
 
-def setup_request_logger(log_file, env):
+def setup_request_logger(log_file, env, log_level=logging.INFO):
     """
     """
     Configures the request logger to handle HTTP request logs based on the specified environment.
     Configures the request logger to handle HTTP request logs based on the specified environment.
 
 
@@ -124,22 +138,18 @@ def setup_request_logger(log_file, env):
     Args:
     Args:
         log_file (str): Path to the log file where HTTP requests should be logged.
         log_file (str): Path to the log file where HTTP requests should be logged.
         env (str): The application environment (e.g., 'localnet', 'testnet', 'mainnet').
         env (str): The application environment (e.g., 'localnet', 'testnet', 'mainnet').
+        log_level (int): The logging level (default is INFO).
     """
     """
     # Get the werkzeug logger that logs requests
     # Get the werkzeug logger that logs requests
     request_logger = logging.getLogger('werkzeug')
     request_logger = logging.getLogger('werkzeug')
-    request_logger.setLevel(logging.INFO)
+    request_logger.setLevel(log_level)
     request_logger.propagate = False
     request_logger.propagate = False
 
 
-    # If localnet, log to console
-    if env == 'localnet':
-        console_handler = logging.StreamHandler()  # Outputs to the console
-        console_handler.setLevel(logging.INFO)
-        request_logger.addHandler(console_handler)
-    # Log to file for other environments
-    else:
-        file_handler = logging.FileHandler(log_file)
-        file_handler.setLevel(logging.INFO)
-        request_logger.addHandler(file_handler)
+    file_handler = logging.FileHandler(log_file)
+    file_handler.setLevel(log_level)
+    request_logger.addHandler(file_handler)
+
+    add_console_handler_if_localnet(env, request_logger, log_level)
 
 
 def initialize_log_handler(log_file, env):
 def initialize_log_handler(log_file, env):
     """
     """
@@ -154,4 +164,20 @@ def initialize_log_handler(log_file, env):
     else:
     else:
         return logging.FileHandler(log_file)
         return logging.FileHandler(log_file)
 
 
+def add_console_handler_if_localnet(env, logger, log_level=logging.INFO):
+    """
+    Adds a console handler to the given logger if the environment is 'localnet'.
 
 
+    Args:
+    env (str): The current environment (e.g., 'localnet', 'mainnet').
+    logger (logging.Logger): The logger to which the console handler should be added.
+    log_level (int): The logging level for the console handler.
+    """
+
+    # If localnet, also log to console
+    if env == 'localnet':
+        console_handler = logging.StreamHandler()
+        console_handler.setLevel(log_level)
+        formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
+        console_handler.setFormatter(formatter)
+        logger.addHandler(console_handler)