Anshul Prasad commited on
Commit
9f3385c
Β·
1 Parent(s): 6a82f14

Initial commit.

Browse files
Files changed (1) hide show
  1. src/logger.py +72 -0
src/logger.py ADDED
@@ -0,0 +1,72 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ Centralized logging setup for the project.
3
+
4
+ Usage β€” call once at the very start of any entry point:
5
+
6
+ from utils.logger import setup_logging
7
+ setup_logging()
8
+
9
+ Then in any module just use:
10
+
11
+ import logging
12
+ logger = logging.getLogger(__name__)
13
+ logger.info("...")
14
+ """
15
+
16
+ import logging
17
+ import sys
18
+ from pathlib import Path
19
+ from datetime import datetime
20
+
21
+ # ── Constants ──────────────────────────────────────────────────────────────────
22
+ LOG_DIR = Path("logs")
23
+ LOG_FMT = "%(asctime)s %(levelname)-8s [%(name)s] %(message)s"
24
+ DATE_FMT = "%Y-%m-%d %H:%M:%S"
25
+
26
+
27
+ def setup_logging(
28
+ level: int = logging.INFO,
29
+ log_dir: Path = LOG_DIR,
30
+ filename: str | None = None,
31
+ ) -> None:
32
+ """
33
+ Configure root logger to stream to both terminal and a rotating log file.
34
+
35
+ Args:
36
+ level: logging level (default: INFO)
37
+ log_dir: directory where log files are stored (default: logs/)
38
+ filename: log file name (default: YYYY-MM-DD_HH-MM-SS.log)
39
+ """
40
+ log_dir.mkdir(parents=True, exist_ok=True)
41
+
42
+ if filename is None:
43
+ filename = datetime.now().strftime("%Y-%m-%d_%H-%M-%S") + ".log"
44
+
45
+ log_path = log_dir / filename
46
+
47
+ formatter = logging.Formatter(fmt=LOG_FMT, datefmt=DATE_FMT)
48
+
49
+ # ── Terminal handler ───────────────────────────────────────────────────────
50
+ stream_handler = logging.StreamHandler(sys.stdout)
51
+ stream_handler.setFormatter(formatter)
52
+ stream_handler.setLevel(level)
53
+
54
+ # ── File handler ───────────────────────────────────────────────────────────
55
+ file_handler = logging.FileHandler(log_path, encoding="utf-8")
56
+ file_handler.setFormatter(formatter)
57
+ file_handler.setLevel(level)
58
+
59
+ # ── Root logger ────────────────────────────────────────────────────────────
60
+ root = logging.getLogger()
61
+ root.setLevel(level)
62
+
63
+ # Avoid adding duplicate handlers if called more than once
64
+ if not root.handlers:
65
+ root.addHandler(stream_handler)
66
+ root.addHandler(file_handler)
67
+ else:
68
+ root.handlers.clear()
69
+ root.addHandler(stream_handler)
70
+ root.addHandler(file_handler)
71
+
72
+ logging.info("Logging initialised β†’ %s", log_path)