-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathutils_logger.py
More file actions
76 lines (67 loc) · 2.87 KB
/
utils_logger.py
File metadata and controls
76 lines (67 loc) · 2.87 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
import configparser
from functools import wraps
from pathlib import Path
import sys
import time
from loguru import logger
def get_base_path():
# если запущено как exe
if getattr(sys, 'frozen', False):
return Path(sys.executable).parent
# если обычный .py
return Path(__file__).parent
def configure_logger() -> str:
"""Настройка логирования на файл RepExecutor.ini
Уровень возвращается для того, чтобы его можно было использовать
при добавлении консольного логгера, если параметр командной строки
не переопределяет его.
"""
ini_path = get_base_path() / "RepExecutor.ini"
config = configparser.ConfigParser()
config.read(ini_path, encoding="utf-8")
log_path = config.get("log", "path", fallback="")
file_name = config.get("log", "file", fallback="RepExecutor.log")
log_file = Path(log_path) / file_name if log_path else Path(file_name)
level = config.get("log", "level", fallback="INFO").upper()
logger.remove()
logger.add(
log_file,
level=level,
rotation=config.get("log", "rotation", fallback="10 MB"),
retention=config.get("log", "retention", fallback="7 days"),
compression=config.get("log", "compression", fallback="zip"),
encoding="utf-8",
# format="{time:YYYY-MM-DD HH:mm:ss} | {level} | {extra.get(func_name, function)} | {message}"
format="{time:YYYY-MM-DD HH:mm:ss} | {level} | {function} | {message}"
)
logger.debug(f"configure_logger Load")
return level
# def log_execution(level="DEBUG"):
# def decorator(func):
# @wraps(func)
# def wrapper(*args, **kwargs):
# logger.log(level, f"{func.__name__} | BEGIN")
# start = time.perf_counter()
# try:
# return func(*args, **kwargs)
# finally:
# elapsed = time.perf_counter() - start
# logger.log(level, f"{func.__name__} | END | {elapsed:.3f}s")
# return wrapper
# return decorator
def log_execution(level="DEBUG"):
def decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
# Создаем "заплатку", которая подменяет имя функции в объекте record
patched_logger = logger.patch(lambda record: record.update(function=func.__name__))
patched_logger.log(level, "BEGIN")
start = time.perf_counter()
try:
result = func(*args, **kwargs)
return result
finally:
elapsed = time.perf_counter() - start
patched_logger.log(level, f"END | {elapsed:.3f}s")
return wrapper
return decorator