48 lines
1.2 KiB
Python
48 lines
1.2 KiB
Python
import logging
|
|
from logging.handlers import TimedRotatingFileHandler
|
|
from pathlib import Path
|
|
|
|
_logger: logging.Logger | None = None
|
|
|
|
|
|
def get_logger() -> logging.Logger:
|
|
global _logger
|
|
if _logger is None:
|
|
_logger = logging.getLogger('rpa_dashboard')
|
|
return _logger
|
|
|
|
|
|
def setup_logging(log_dir: Path, backup_count: int = 30) -> logging.Logger:
|
|
global _logger
|
|
log_dir.mkdir(parents=True, exist_ok=True)
|
|
|
|
logger = logging.getLogger('rpa_dashboard')
|
|
logger.setLevel(logging.INFO)
|
|
|
|
if logger.handlers:
|
|
return logger
|
|
|
|
fmt = logging.Formatter(
|
|
'[%(asctime)s] %(levelname)-5s %(message)s',
|
|
datefmt='%Y-%m-%d %H:%M:%S',
|
|
)
|
|
|
|
# Daily rotation at midnight — keeps last `backup_count` days
|
|
# Current day: logs/dashboard.log
|
|
# Past days: logs/dashboard.log.YYYY-MM-DD
|
|
file_handler = TimedRotatingFileHandler(
|
|
log_dir / 'dashboard.log',
|
|
when='midnight',
|
|
backupCount=backup_count,
|
|
encoding='utf-8',
|
|
)
|
|
file_handler.setFormatter(fmt)
|
|
logger.addHandler(file_handler)
|
|
|
|
console = logging.StreamHandler()
|
|
console.setFormatter(fmt)
|
|
logger.addHandler(console)
|
|
|
|
_logger = logger
|
|
return logger
|