-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlogger.py
66 lines (52 loc) · 1.75 KB
/
logger.py
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
# src/lib/logger.py
import os
import logging
from dotenv import load_dotenv
from colorlog import ColoredFormatter
from logging.handlers import RotatingFileHandler
# Load environment variables
load_dotenv()
# Environment Config
LOG_DIR = "logs"
ENV = os.getenv("ENV")
LOG_LEVEL = os.getenv("LOG_LEVEL").upper()
LOG_FILE = os.path.join(LOG_DIR, "app.log")
# Ensure logs directory exists
os.makedirs(LOG_DIR, exist_ok=True)
# Formatter - Console and File (No color in file logs)
DATE_FORMAT = "%Y-%m-%d %H:%M:%S"
LOG_FORMAT = "%(asctime)s [%(name)s] - %(levelname)s - %(filename)s:%(lineno)d - %(message)s"
# Colored Formatter for console
COLORED_FORMAT = ColoredFormatter(
"%(log_color)s%(asctime)s [%(name)s] - %(levelname)s - %(filename)s:%(lineno)d - %(message)s",
datefmt=DATE_FORMAT,
log_colors={
"DEBUG": "cyan",
"INFO": "green",
"WARNING": "yellow",
"ERROR": "red",
"CRITICAL": "bold_red",
},
)
def get_logger(name: str) -> logging.Logger:
logger = logging.getLogger(name)
# Prevent duplicate handlers
if logger.handlers:
return logger
# Set global log level
logger.setLevel(LOG_LEVEL)
# Console Handler (Always enabled)
console_handler = logging.StreamHandler()
console_handler.setFormatter(COLORED_FORMAT)
console_handler.setLevel(LOG_LEVEL)
logger.addHandler(console_handler)
# File Handler with rotation (5MB x 5 backups)
file_handler = RotatingFileHandler(
LOG_FILE, maxBytes=5 * 1024 * 1024, backupCount=5
)
file_handler.setFormatter(logging.Formatter(LOG_FORMAT, datefmt=DATE_FORMAT))
file_handler.setLevel(LOG_LEVEL)
logger.addHandler(file_handler)
# Disable propagation if needed
logger.propagate = False
return logger