-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathlogger.py
More file actions
58 lines (47 loc) · 1.68 KB
/
logger.py
File metadata and controls
58 lines (47 loc) · 1.68 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
from __future__ import annotations
import json
import logging
from logging.handlers import RotatingFileHandler
from pathlib import Path
from typing import Any
class JsonFormatter(logging.Formatter):
def format(self, record: logging.LogRecord) -> str:
payload: dict[str, Any] = {
"level": record.levelname,
"message": record.getMessage(),
"logger": record.name,
"time": self.formatTime(record, self.datefmt),
}
if hasattr(record, "extra_data"):
payload["extra"] = getattr(record, "extra_data")
if record.exc_info:
payload["exception"] = self.formatException(record.exc_info)
return json.dumps(payload, ensure_ascii=False)
def setup_logger(log_dir: str | Path, level: str = "INFO", json_logs: bool = False) -> logging.Logger:
path = Path(log_dir)
path.mkdir(parents=True, exist_ok=True)
logger = logging.getLogger("folder_automation")
logger.setLevel(getattr(logging, level.upper(), logging.INFO))
logger.propagate = False
if logger.handlers:
return logger
formatter: logging.Formatter
if json_logs:
formatter = JsonFormatter()
else:
formatter = logging.Formatter(
fmt="%(asctime)s | %(levelname)s | %(message)s",
datefmt="%Y-%m-%d %H:%M:%S",
)
console = logging.StreamHandler()
console.setFormatter(formatter)
file_handler = RotatingFileHandler(
path / "automation.log",
maxBytes=2_000_000,
backupCount=5,
encoding="utf-8",
)
file_handler.setFormatter(formatter)
logger.addHandler(console)
logger.addHandler(file_handler)
return logger