Skip to content

Instantly share code, notes, and snippets.

@hoseinit
Created March 6, 2025 14:58
Show Gist options
  • Save hoseinit/b933833a5e0db0c5c030f9e7028a8956 to your computer and use it in GitHub Desktop.
Save hoseinit/b933833a5e0db0c5c030f9e7028a8956 to your computer and use it in GitHub Desktop.
A logger which can be used accross the python module classes and write into a file which is labled based on date
import logging
import os
from datetime import datetime
class Logger:
_instance = None
def __new__(cls, log_prefix='projectname', level=logging.INFO, log_folder='logs'):
if cls._instance is None:
cls._instance = super(Logger, cls).__new__(cls)
cls._instance.initialize_logger(log_prefix, level, log_folder)
return cls._instance
def initialize_logger(self, log_prefix, level, log_folder):
self.log_prefix = log_prefix
self.log_folder = log_folder
self.current_date = datetime.now().strftime('%d%m%Y')
self.logger = logging.getLogger('dated_logger')
self.logger.setLevel(level)
self.setup_file_handler()
def setup_file_handler(self):
# Remove existing handlers to avoid duplicate logs
for handler in self.logger.handlers[:]:
self.logger.removeHandler(handler)
# Ensure logs directory exists
if not os.path.exists(self.log_folder):
os.makedirs(self.log_folder)
# Create new file handler with current date
log_file = os.path.join(self.log_folder, f"{self.log_prefix}-{self.current_date}.log")
file_handler = logging.FileHandler(log_file)
file_handler.setLevel(logging.DEBUG)
# Create formatter
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
file_handler.setFormatter(formatter)
# Add handler to logger
self.logger.addHandler(file_handler)
def check_date_change(self):
today = datetime.now().strftime('%d%m%Y')
if today != self.current_date:
self.current_date = today
self.setup_file_handler()
@classmethod
def get_logger(cls):
if cls._instance is None:
cls() # Initialize with default parameters
cls._instance.check_date_change()
return cls._instance.logger
# Convenience methods
@classmethod
def debug(cls, message):
cls.get_logger().debug(message)
@classmethod
def info(cls, message):
cls.get_logger().info(message)
@classmethod
def warning(cls, message):
cls.get_logger().warning(message)
@classmethod
def error(cls, message):
cls.get_logger().error(message)
@classmethod
def critical(cls, message):
cls.get_logger().critical(message)
@hoseinit
Copy link
Author

hoseinit commented Mar 6, 2025

Use it like

from logging_config import Logger as log

log.info("Hello World!")

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment