forked from MemTensor/MemOS
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathlog.py
More file actions
83 lines (69 loc) · 2.26 KB
/
log.py
File metadata and controls
83 lines (69 loc) · 2.26 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
import logging
from logging.config import dictConfig
from pathlib import Path
from sys import stdout
from dotenv import load_dotenv
from memos import settings
# Load environment variables
load_dotenv()
selected_log_level = logging.DEBUG if settings.DEBUG else logging.WARNING
def _setup_logfile() -> Path:
"""ensure the logger filepath is in place
Returns: the logfile Path
"""
logfile = Path(settings.MEMOS_DIR / "logs" / "memos.log")
logfile.parent.mkdir(parents=True, exist_ok=True)
logfile.touch(exist_ok=True)
return logfile
LOGGING_CONFIG = {
"version": 1,
"disable_existing_loggers": False,
"formatters": {
"standard": {
"format": "%(asctime)s - %(name)s - %(levelname)s - %(filename)s:%(lineno)d - %(funcName)s - %(message)s"
},
"no_datetime": {
"format": "%(name)s - %(levelname)s - %(filename)s:%(lineno)d - %(funcName)s - %(message)s"
},
},
"filters": {
"package_tree_filter": {"()": "logging.Filter", "name": settings.LOG_FILTER_TREE_PREFIX}
},
"handlers": {
"console": {
"level": selected_log_level,
"class": "logging.StreamHandler",
"stream": stdout,
"formatter": "no_datetime",
"filters": ["package_tree_filter"],
},
"file": {
"level": "DEBUG",
"class": "logging.handlers.RotatingFileHandler",
"filename": _setup_logfile(),
"maxBytes": 1024**2 * 10,
"backupCount": 10,
"formatter": "standard",
},
},
"root": { # Root logger handles all logs
"level": logging.DEBUG if settings.DEBUG else logging.INFO,
"handlers": ["console", "file"],
},
"loggers": {
"memos": {
"level": logging.DEBUG if settings.DEBUG else logging.INFO,
"propagate": True, # Let logs bubble up to root
},
},
}
def get_logger(name: str | None = None) -> logging.Logger:
"""returns the project logger, scoped to a child name if provided
Args:
name: will define a child logger
"""
dictConfig(LOGGING_CONFIG)
parent_logger = logging.getLogger("")
if name:
return parent_logger.getChild(name)
return parent_logger