-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlog.py
71 lines (59 loc) · 2.61 KB
/
log.py
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
import logging, sys, functools, os
from inspect import getframeinfo, stack
from typing import Union
import bpy
class _CustomFormatter(logging.Formatter):
""" Custom Formatter does these 2 things:
1. Overrides 'funcName' with the value of 'func_name_override', if it exists.
2. Overrides 'filename' with the value of 'file_name_override', if it exists.
"""
def format(self, record):
if hasattr(record, 'func_name_override'):
record.funcName = record.func_name_override
if hasattr(record, 'file_name_override'):
record.filename = record.file_name_override
return super(_CustomFormatter, self).format(record)
__log_level = 20
logger = logging.getLogger("Armin's Toolbox")
try:
logger.setLevel(bpy.context.preferences.addons['armins_toolbox'].preferences['logging_level'])
except:
logger.setLevel(logging.DEBUG)
file_handler = logging.FileHandler("armins_toolbox.log")
stream_handler = logging.StreamHandler(sys.stdout)
default_formatter = _CustomFormatter('%(asctime)s - %(levelname)-10s - %(filename)s - %(funcName)s, l.%(lineno)d - %(message)s')
file_handler.setFormatter(default_formatter)
stream_handler.setFormatter(default_formatter)
logger.handlers.clear()
logger.addHandler(file_handler)
logger.addHandler(stream_handler)
def set_log_level(value):
global __log_level
global logger
logger.setLevel(value)
logger.debug("Log level set to " + str(value))
def get_log_level():
return __log_level
# Function decorator to log function details
def log(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
args_repr = [repr(a) for a in args]
kwargs_repr = [f"{k}={v!r}" for k, v in kwargs.items()]
signature = ", ".join(args_repr + kwargs_repr)
py_file_caller = getframeinfo(stack()[1][0])
file_handler.setFormatter(_CustomFormatter('%(asctime)s - %(levelname)-10s - %(message)s'))
stream_handler.setFormatter(_CustomFormatter('%(asctime)s - %(levelname)-10s - %(message)s'))
logger.debug(f"{os.path.basename(py_file_caller.filename)} - {func.__name__} - Args: {signature}")
try:
result = func(*args, **kwargs)
logger.debug(f"Returned: {result!r}")
file_handler.setFormatter(default_formatter)
stream_handler.setFormatter(default_formatter)
return result
except Exception as e:
logger.exception(f"Exception raised in {func.__name__}. Exception: {str(e)}")
file_handler.setFormatter(default_formatter)
stream_handler.setFormatter(default_formatter)
raise e
return wrapper