-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathLesson_8_3.py
More file actions
76 lines (66 loc) · 2.45 KB
/
Copy pathLesson_8_3.py
File metadata and controls
76 lines (66 loc) · 2.45 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
"""
Задание 3
Доработаем задачу 2.
Сохраняйте в лог файл раздельно:
○ уровень логирования,
○ дату события,
○ имя функции (не декоратора),
○ аргументы вызова,
○ результат.
"""
import logging
from functools import wraps
# Декоратор-фабрика для записи логов в файл с указанием уровня, даты, имени функции, аргументов и результата
def log_to_file(filepath):
"""
Декоратор, создающий логгер, который пишет в файл:
- уровень логирования
- дату события
- имя функции
- переданные args и kwargs
- результат или информацию об ошибке
:param filepath: путь до файла лога
"""
# Создаем и настраиваем обработчик
handler = logging.FileHandler(filepath, encoding='utf-8')
formatter = logging.Formatter(
'%(levelname)s %(asctime)s %(funcName)s: %(message)s',
datefmt='%Y-%m-%d %H:%M:%S'
)
handler.setFormatter(formatter)
def decorator(func):
logger = logging.getLogger(func.__name__)
logger.setLevel(logging.INFO)
# Избегаем дублирования добавляемых handler'ов
if not logger.handlers:
logger.addHandler(handler)
logger.propagate = False
@wraps(func)
def wrapper(*args, **kwargs):
try:
result = func(*args, **kwargs)
logger.info(f"args={args}, kwargs={kwargs}, result={result}")
return result
except Exception as e:
logger.error(f"args={args}, kwargs={kwargs}, error={e}")
raise
return wrapper
return decorator
# Пример использования
if __name__ == '__main__':
@log_to_file('app.log')
def divide(a, b):
return a / b
@log_to_file('app.log')
def greet(name, greeting='Hello'):
return f"{greeting}, {name}!"
# Успешный вызов
print(divide(10, 2))
# Ошибка деления
try:
divide(5, 0)
except ZeroDivisionError:
pass
# Другие вызовы
print(greet('Alice'))
print(greet('Bob', greeting='Hi'))