Spaces:
Sleeping
Sleeping
File size: 2,699 Bytes
f171e60 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 | import logging
import sys
from pathlib import Path
from datetime import datetime
from logging.handlers import RotatingFileHandler
from app.config import settings
class CustomFormatter(logging.Formatter):
"""Custom formatter với colors cho console"""
grey = "\x1b[38;21m"
blue = "\x1b[38;5;39m"
yellow = "\x1b[38;5;226m"
red = "\x1b[38;5;196m"
bold_red = "\x1b[31;1m"
reset = "\x1b[0m"
format_str = "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
FORMATS = {
logging.DEBUG: grey + format_str + reset,
logging.INFO: blue + format_str + reset,
logging.WARNING: yellow + format_str + reset,
logging.ERROR: red + format_str + reset,
logging.CRITICAL: bold_red + format_str + reset
}
def format(self, record):
log_fmt = self.FORMATS.get(record.levelno)
formatter = logging.Formatter(log_fmt, datefmt='%Y-%m-%d %H:%M:%S')
return formatter.format(record)
def setup_logger(name: str = "ai-core") -> logging.Logger:
"""
Setup logger với console và file handlers
Args:
name: Tên của logger
Returns:
Configured logger instance
"""
logger = logging.getLogger(name)
# Set level
log_level = logging.DEBUG if settings.DEBUG else logging.INFO
logger.setLevel(log_level)
# Tránh duplicate handlers
if logger.handlers:
return logger
# Console Handler
console_handler = logging.StreamHandler(sys.stdout)
console_handler.setLevel(log_level)
console_handler.setFormatter(CustomFormatter())
logger.addHandler(console_handler)
# File Handler
logs_dir = Path("logs")
logs_dir.mkdir(exist_ok=True)
# Rotating file handler (10MB max, keep 5 backup files)
file_handler = RotatingFileHandler(
logs_dir / f"{name}.log",
maxBytes=10 * 1024 * 1024, # 10MB
backupCount=5,
encoding='utf-8'
)
file_handler.setLevel(logging.INFO)
file_formatter = logging.Formatter(
'%(asctime)s - %(name)s - %(levelname)s - %(funcName)s:%(lineno)d - %(message)s',
datefmt='%Y-%m-%d %H:%M:%S'
)
file_handler.setFormatter(file_formatter)
logger.addHandler(file_handler)
# Error file handler (chỉ log errors)
error_handler = RotatingFileHandler(
logs_dir / f"{name}_error.log",
maxBytes=10 * 1024 * 1024,
backupCount=5,
encoding='utf-8'
)
error_handler.setLevel(logging.ERROR)
error_handler.setFormatter(file_formatter)
logger.addHandler(error_handler)
return logger
# Global logger instance
logger = setup_logger() |