import os
import shutil
import logging
import pika
from datetime import datetime
from colorama import Fore, Style, init
from config import LOG
preclass_context_size = 3
now = datetime.now
[docs]
def get_logger(__name__, __file__):
"""
Creates and configures a logger with colored output for different log levels.
This function sets up a logger that outputs log messages to the console with
color-coded log levels to make it easier to distinguish between different
severities. The logger's configuration includes:
- Log levels with distinct colors (DEBUG, INFO, WARNING, ERROR, CRITICAL).
- Relative file path display from the directory where the script is executed.
- Automatic color reset after each log message.
The function initializes the logger based on the module's `__name__` and `__file__`
parameters, sets the logging level from a global `LOG.LEVEL` variable, and uses
`colorama` for colored console output.
Parameters:
__name__ (str): The name of the current module, typically passed as `__name__`.
__file__ (str): The path of the current file, typically passed as `__file__`.
Returns:
logging.Logger: A configured logger instance with color-coded log level output.
Example:
logger = get_logger(__name__, __file__)
logger.info("This is an info message")
logger.error("This is an error message")
Notes:
The logger uses a `StreamHandler` to output to the console and a custom
`ColorFormatter` to add colors to the log level based on the severity.
It will only add a handler if no handlers are already configured to prevent
duplicate log entries.
"""
# Initialize colorama
init(autoreset=True)
# Configure the logger
logger = logging.getLogger(__name__)
# Set the logging level based on a variable LOG.LEVEL
log_level = getattr(logging, LOG.LEVEL.upper(), logging.INFO)
logger.setLevel(log_level)
# Get the relative path of the current file from where the script is executed
relative_file_path = os.path.relpath(__file__, os.getcwd())
# Define colors for each log level
LOG_COLORS = {
'DEBUG': Fore.CYAN,
'INFO': Fore.GREEN,
'WARNING': Fore.YELLOW,
'ERROR': Fore.RED,
'CRITICAL': Fore.MAGENTA
}
# Custom formatter to add color to the log level
class ColorFormatter(logging.Formatter):
def format(self, record):
log_color = LOG_COLORS.get(record.levelname, "")
record.levelname = f"{log_color}{record.levelname}{Style.RESET_ALL}"
return super().format(record)
# Create a console handler (StreamHandler)
console_handler = logging.StreamHandler()
console_handler.setLevel(log_level)
# Create a formatter with color support for the desired log message format
formatter = ColorFormatter(f'%(levelname)s {relative_file_path}: %(message)s')
console_handler.setFormatter(formatter)
# Add the console handler to the logger
if not logger.handlers: # Avoid adding multiple handlers if logger is configured again
logger.addHandler(console_handler)
return logger
[docs]
def change_file_path(input_file, new_directory, new_base_name):
"""
Change the input file path, keeping the original file extension unchanged and move the file.
Parameters:
input_file (str): The original file path with the extension.
new_directory (str): The new directory where the file should be moved.
new_base_name (str): The new base name for the file (without extension).
Returns:
str: The new file path with the original extension.
"""
# Extract the file extension
_, extension = os.path.splitext(input_file)
# Create the new directory if it doesn't exist
if not os.path.exists(new_directory):
os.makedirs(new_directory)
# Create the new file path
new_file_path = os.path.join(new_directory, new_base_name + extension)
# Move the file to the new location
shutil.move(input_file, new_file_path)
return new_file_path
[docs]
def get_channel(queue_name):
connection = pika.BlockingConnection(
pika.ConnectionParameters(host='localhost'))
channel = connection.channel()
channel.queue_declare(
queue=queue_name,
durable=True
)
return connection, channel