Spaces:
Sleeping
Sleeping
""" | |
Contains logging functions to initialize and configure loggers, facilitating efficient tracking of ETL processes. | |
Also Provides methods to log messages with different log levels and additional context information such as channel name and client name | |
""" | |
import os | |
import streamlit as st | |
import logging, logging.handlers | |
from datetime import datetime, timezone | |
def delete_old_log_files(): | |
""" | |
Deletes all log files in the 'logs' directory that are older than the current month. | |
Returns: | |
None | |
""" | |
# Set the logs directory to 'logs' within the current working directory | |
logs_directory = os.path.join(os.getcwd(), "logs") | |
# Ensure the logs directory exists | |
if not os.path.exists(logs_directory): | |
print(f"Directory {logs_directory} does not exist.") | |
return | |
# Get the current year and month in UTC | |
current_utc_time = datetime.now(timezone.utc) | |
current_year_month = current_utc_time.strftime("%Y%m") | |
# Iterate through all files in the logs directory | |
for filename in os.listdir(logs_directory): | |
# We assume the log files are in the format "eid_YYYYMM.log" | |
if filename.endswith(".log"): | |
# Extract the date portion from the filename | |
try: | |
file_date = filename.split("_")[-1].replace(".log", "") | |
# Compare the file date with the current date | |
if file_date < current_year_month: | |
# Construct the full file path | |
file_path = os.path.join(logs_directory, filename) | |
# Delete the file | |
os.remove(file_path) | |
except IndexError: | |
# If the filename doesn't match the expected pattern, skip it | |
pass | |
def create_log_file_name(emp_id, project_name): | |
""" | |
Generates a log file name using the format eid_YYYYMMDD.log based on UTC time. | |
Returns: | |
str: The generated log file name. | |
""" | |
# Get the current UTC time | |
utc_now = datetime.now(timezone.utc) | |
# Format the date as YYYYMMDD | |
date_str = utc_now.strftime("%Y%m%d") | |
# Create the file name with the format eid_YYYYMMDD.log | |
log_file_name = f"{emp_id}_{project_name}_{date_str}.log" | |
return log_file_name | |
def get_logger(log_file): | |
""" | |
Initializes and configures a logger. If the log file already exists, it appends to it. | |
Returns the same logger instance if called multiple times. | |
Args: | |
log_file (str): The path to the log file where logs will be written. | |
Returns: | |
logging.Logger: Configured logger instance. | |
""" | |
# Define the logger name | |
logger_name = os.path.basename(log_file) | |
logger = logging.getLogger(logger_name) | |
# If the logger already has handlers, return it to prevent duplicate handlers | |
if logger.hasHandlers(): | |
return logger | |
# Set the logging level | |
logging_level = logging.INFO | |
logger.setLevel(logging_level) | |
# Ensure the logs directory exists and is writable | |
logs_dir = os.path.dirname(log_file) | |
if not os.path.exists(logs_dir): | |
os.makedirs(logs_dir, exist_ok=True) | |
# Change the directory permissions to 0777 (0o777 in Python 3) | |
os.chmod(logs_dir, 0o777) | |
# Create a file handler to append to the log file | |
file_handler = logging.FileHandler(log_file) | |
file_handler.setFormatter( | |
logging.Formatter("%(asctime)s %(levelname)s %(message)s", "%Y-%m-%d %H:%M:%S") | |
) | |
logger.addHandler(file_handler) | |
# Create a stream handler to print to console | |
stream_handler = logging.StreamHandler() | |
stream_handler.setFormatter( | |
logging.Formatter("%(asctime)s %(levelname)s %(message)s", "%Y-%m-%d %H:%M:%S") | |
) | |
logger.addHandler(stream_handler) | |
return logger | |
def log_message(log_type, message, page_name): | |
""" | |
Logs a message with the specified log type and additional context information. | |
Args: | |
log_type (str): The type of log ('info', 'error', 'warning', 'debug'). | |
message (str): The message to log. | |
page_name (str): The name of the page associated with the message. | |
Returns: | |
None | |
""" | |
# Retrieve the employee ID and project name from session state | |
emp_id = st.session_state["emp_id"] | |
project_name = st.session_state["project_name"] | |
# Create log file name using a function that generates a name based on the current date and EID | |
log_file_name = create_log_file_name(emp_id, project_name) | |
# Construct the full path to the log file within the "logs" within the current working directory | |
file_path = os.path.join(os.getcwd(), "logs", log_file_name) | |
# Generate and store the logger instance in session state | |
logger = get_logger(file_path) | |
# Construct the log message with all required context information | |
log_message = ( | |
f"USER_EID: {emp_id} ; " | |
f"PROJECT_NAME: {project_name} ; " | |
f"PAGE_NAME: {page_name} ; " | |
f"MESSAGE: {message}" | |
) | |
# Log the message with the appropriate log level based on the log_type argument | |
if log_type == "info": | |
logger.info(log_message) | |
elif log_type == "error": | |
logger.error(log_message) | |
elif log_type == "warning": | |
logger.warning(log_message) | |
else: | |
logger.debug(log_message) | |