-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathlogger.py
More file actions
95 lines (72 loc) · 2.59 KB
/
Copy pathlogger.py
File metadata and controls
95 lines (72 loc) · 2.59 KB
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
93
94
"""Logging configuration for the application.
Provides structured logging with:
- Console output with color-coded levels
- File output for persistent logs
- Request/response tracing
- Database operation tracking
- Custom CRON level for cron job tracking
"""
import logging
import sys
from datetime import datetime
from pathlib import Path
# Create logs directory if it doesn't exist
log_dir = Path("logs")
log_dir.mkdir(exist_ok=True)
# Define custom CRON log level (between INFO=20 and WARNING=30)
CRON_LEVEL = 25
logging.addLevelName(CRON_LEVEL, "CRON")
def cron(self, message, *args, **kwargs):
"""Log a message with CRON level."""
if self.isEnabledFor(CRON_LEVEL):
self._log(CRON_LEVEL, message, args, **kwargs)
# Add cron method to Logger class
logging.Logger.cron = cron
# Define log format
LOG_FORMAT = "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
DATE_FORMAT = "%Y-%m-%d %H:%M:%S"
# Create formatter
formatter = logging.Formatter(LOG_FORMAT, DATE_FORMAT)
# Console handler - always output to terminal
console_handler = logging.StreamHandler(sys.stdout)
console_handler.setLevel(logging.DEBUG) # Show all levels in terminal
console_handler.setFormatter(formatter)
# File handler for all logs
file_handler = logging.FileHandler(
log_dir / f"cortex_{datetime.now().strftime('%Y%m%d')}.log"
)
file_handler.setLevel(logging.DEBUG)
file_handler.setFormatter(formatter)
# Error file handler
error_handler = logging.FileHandler(
log_dir / f"errors_{datetime.now().strftime('%Y%m%d')}.log"
)
error_handler.setLevel(logging.ERROR)
error_handler.setFormatter(formatter)
# Cron file handler - dedicated log file for cron jobs
cron_handler = logging.FileHandler(
log_dir / f"cron_{datetime.now().strftime('%Y%m%d')}.log"
)
cron_handler.setLevel(CRON_LEVEL)
cron_handler.setFormatter(formatter)
# Only log CRON level messages to this file
cron_handler.addFilter(lambda record: record.levelno == CRON_LEVEL)
def get_logger(name: str) -> logging.Logger:
"""Get a configured logger instance.
Args:
name: Logger name (usually __name__ of the module)
Returns:
logging.Logger: Configured logger instance with cron() method
"""
logger = logging.getLogger(name)
logger.setLevel(logging.DEBUG)
# Prevent propagation to avoid duplicate logs
logger.propagate = False
# Remove existing handlers to avoid duplicates
logger.handlers.clear()
# Add handlers
logger.addHandler(console_handler)
logger.addHandler(file_handler)
logger.addHandler(error_handler)
logger.addHandler(cron_handler)
return logger