/ dashboard / utils / logging_config.py
logging_config.py
 1  """
 2  Logging configuration helper for Streamlit apps
 3  Import this at the top of your Streamlit app to ensure all logs are captured
 4  """
 5  
 6  import logging
 7  import sys
 8  import traceback
 9  from datetime import datetime
10  from pathlib import Path
11  
12  def configure_app_logging(app_name="streamlit-app"):
13      """
14      Configure logging for a Streamlit app
15      Call this at the start of your app.py
16  
17      Example:
18          import logging
19          from utils.logging_config import configure_app_logging
20  
21          configure_app_logging("my-app")
22          logger = logging.getLogger(__name__)
23  
24          # Now use logger throughout your app
25          logger.info("App started")
26          logger.error("Something went wrong", exc_info=True)
27      """
28      logger = logging.getLogger(app_name)
29  
30      # Don't reconfigure if already configured
31      if logger.handlers:
32          return logger
33  
34      logger.setLevel(logging.INFO)
35  
36      # Create logs directory
37      log_dir = Path("./logs")
38      log_dir.mkdir(exist_ok=True)
39  
40      # Generate log filename with date
41      date = datetime.now().strftime("%Y-%m-%d")
42      log_file = log_dir / f"{app_name}-{date}.log"
43  
44      # Create file handler
45      file_handler = logging.FileHandler(log_file, mode='a')
46      file_handler.setLevel(logging.INFO)
47  
48      # Create formatter
49      formatter = logging.Formatter(
50          '[%(asctime)s] [%(name)s] [%(levelname)s] %(message)s'
51      )
52      file_handler.setFormatter(formatter)
53  
54      # Add handler
55      logger.addHandler(file_handler)
56  
57      logger.info(f"Logging configured for {app_name} -> {log_file}")
58  
59      return logger
60  
61  def log_exception(logger, message="An error occurred"):
62      """
63      Helper to log the current exception with full traceback
64      Use in except blocks
65  
66      Example:
67          try:
68              risky_operation()
69          except Exception as e:
70              log_exception(logger, f"Failed to do risky operation: {e}")
71              st.error("An error occurred - check logs for details")
72      """
73      exc_type, exc_value, exc_traceback = sys.exc_info()
74      tb_str = ''.join(traceback.format_exception(exc_type, exc_value, exc_traceback))
75      logger.error(f"{message}\n{tb_str}")
76  
77  # Usage example:
78  # if __name__ == "__main__":
79  #     logger = configure_app_logging("my-streamlit-app")
80  #     logger.info("App started")