"""
Logging functions
"""
import logging
from os import makedirs, path
from logging.handlers import RotatingFileHandler
[docs]
class LogManager:
"""
Main logging class.
"""
def __init__(self,
filename: str,
name: str = None,
folder: str = 'logs',
info_level='DEBUG',
max_log_size_mb: int = 10,
backup_count: int = 5):
if name is None:
if '\\' in filename:
name = filename.split('\\')[-1].split('.')[0]
else:
name = filename.split('/')[-1].split('.')[0]
try:
makedirs(name=folder, exist_ok=True)
except PermissionError: # linux
home = path.expanduser('~')
makedirs(f'{home}/.binpan/', exist_ok=True)
self.logger = logging.getLogger(name)
# avoid duplicated logs
if self.logger.hasHandlers():
self.logger.handlers = []
self.log_file = filename
# Create handlers
self.screen_handler = logging.StreamHandler()
self.file_handler = RotatingFileHandler(self.log_file, maxBytes=max_log_size_mb * 1024 * 1024, backupCount=backup_count, encoding='utf-8')
self.line_format = '%(asctime)s %(levelname)8s %(message)s'
self.screen_format = logging.Formatter(self.line_format, datefmt='%Y-%m-%d\t %H:%M:%S')
self.file_format = logging.Formatter(self.line_format, datefmt='%Y-%m-%d\t %H:%M:%S')
self.screen_handler.setFormatter(self.screen_format)
self.file_handler.setFormatter(self.file_format)
# Add handlers to the logger
self.logger.addHandler(self.screen_handler)
self.logger.addHandler(self.file_handler)
# Set level
self.level = getattr(logging, info_level)
self.logger.setLevel(self.level)
[docs]
def debug(self, msg):
"""DEBUG Method"""
self.logger.debug(msg)
[docs]
def info(self, msg):
"""INFO Method"""
self.logger.info(msg)
[docs]
def warning(self, msg):
"""WARNING Method"""
self.logger.warning(msg)
[docs]
def error(self, msg):
"""ERROR Method"""
self.logger.error(msg, exc_info=True)
[docs]
def critical(self, msg):
"""CRITICAL Method"""
self.logger.critical(msg, exc_info=True)
[docs]
def read_last_lines(self, num_lines):
with open(self.log_file, 'r', encoding='utf-8') as file:
lines = file.readlines()
return lines[-num_lines:]