dreamlessx commited on
Commit
0d32769
·
verified ·
1 Parent(s): 9bfed75

Upload landmarkdiff/log.py with huggingface_hub

Browse files
Files changed (1) hide show
  1. landmarkdiff/log.py +78 -0
landmarkdiff/log.py ADDED
@@ -0,0 +1,78 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Centralized logging configuration for LandmarkDiff.
2
+
3
+ Usage:
4
+ from landmarkdiff.log import get_logger
5
+ logger = get_logger(__name__)
6
+ logger.info("Training started")
7
+
8
+ Configure globally:
9
+ from landmarkdiff.log import setup_logging
10
+ setup_logging(level="DEBUG") # affects all LandmarkDiff loggers
11
+ """
12
+
13
+ from __future__ import annotations
14
+
15
+ import logging
16
+ import sys
17
+
18
+ _CONFIGURED = False
19
+
20
+ # Default format
21
+ LOG_FORMAT = "%(asctime)s [%(levelname)s] %(name)s: %(message)s"
22
+ LOG_DATE_FORMAT = "%Y-%m-%d %H:%M:%S"
23
+
24
+
25
+ def setup_logging(
26
+ level: str | int = "INFO",
27
+ fmt: str | None = None,
28
+ stream: object = None,
29
+ ) -> None:
30
+ """Configure logging for the landmarkdiff package.
31
+
32
+ Call once at application startup. Subsequent calls update the level.
33
+
34
+ Args:
35
+ level: Log level (DEBUG, INFO, WARNING, ERROR, CRITICAL).
36
+ fmt: Custom format string. None uses the default.
37
+ stream: Output stream. None defaults to stderr.
38
+ """
39
+ global _CONFIGURED
40
+
41
+ if isinstance(level, str):
42
+ level = getattr(logging, level.upper(), logging.INFO)
43
+
44
+ root_logger = logging.getLogger("landmarkdiff")
45
+ root_logger.setLevel(level)
46
+
47
+ if not _CONFIGURED:
48
+ handler = logging.StreamHandler(stream or sys.stderr)
49
+ handler.setFormatter(logging.Formatter(
50
+ fmt or LOG_FORMAT,
51
+ datefmt=LOG_DATE_FORMAT,
52
+ ))
53
+ root_logger.addHandler(handler)
54
+ # Prevent propagation to root logger to avoid duplicate messages
55
+ root_logger.propagate = False
56
+ _CONFIGURED = True
57
+ else:
58
+ # Just update the level
59
+ root_logger.setLevel(level)
60
+
61
+
62
+ def get_logger(name: str) -> logging.Logger:
63
+ """Get a logger for a LandmarkDiff module.
64
+
65
+ The returned logger is a child of the 'landmarkdiff' root logger,
66
+ so setup_logging() controls its level and formatting.
67
+
68
+ Args:
69
+ name: Module name (typically __name__).
70
+
71
+ Returns:
72
+ Configured logging.Logger instance.
73
+ """
74
+ # Ensure base configuration exists
75
+ if not _CONFIGURED:
76
+ setup_logging()
77
+
78
+ return logging.getLogger(name)