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")