shadowshell 0.0.39__tar.gz → 0.0.41__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {shadowshell-0.0.39 → shadowshell-0.0.41}/PKG-INFO +1 -1
- {shadowshell-0.0.39 → shadowshell-0.0.41}/pyproject.toml +2 -2
- {shadowshell-0.0.39 → shadowshell-0.0.41}/src/shadowshell/config/configurator.py +6 -7
- {shadowshell-0.0.39 → shadowshell-0.0.41}/src/shadowshell/configurator.py +1 -1
- {shadowshell-0.0.39 → shadowshell-0.0.41}/src/shadowshell/logger_factory.py +6 -5
- {shadowshell-0.0.39 → shadowshell-0.0.41}/src/shadowshell/logging/__init__.py +7 -1
- {shadowshell-0.0.39 → shadowshell-0.0.41}/src/shadowshell/logging/console_logger.py +5 -3
- shadowshell-0.0.41/src/shadowshell/logging/logging_constants.py +12 -0
- shadowshell-0.0.41/src/shadowshell/monitor/monitor.py +86 -0
- {shadowshell-0.0.39 → shadowshell-0.0.41}/src/shadowshell.egg-info/PKG-INFO +1 -1
- {shadowshell-0.0.39 → shadowshell-0.0.41}/src/shadowshell.egg-info/SOURCES.txt +1 -0
- shadowshell-0.0.39/src/shadowshell/monitor/monitor.py +0 -64
- {shadowshell-0.0.39 → shadowshell-0.0.41}/README.md +0 -0
- {shadowshell-0.0.39 → shadowshell-0.0.41}/setup.cfg +0 -0
- {shadowshell-0.0.39 → shadowshell-0.0.41}/src/shadowshell/__init__.py +0 -0
- {shadowshell-0.0.39 → shadowshell-0.0.41}/src/shadowshell/boot/__init__.py +0 -0
- {shadowshell-0.0.39 → shadowshell-0.0.41}/src/shadowshell/boot/starter.py +0 -0
- {shadowshell-0.0.39 → shadowshell-0.0.41}/src/shadowshell/bootstrap.py +0 -0
- {shadowshell-0.0.39 → shadowshell-0.0.41}/src/shadowshell/config/__init__.py +0 -0
- {shadowshell-0.0.39 → shadowshell-0.0.41}/src/shadowshell/console_logger.py +0 -0
- {shadowshell-0.0.39 → shadowshell-0.0.41}/src/shadowshell/file/__init__.py +0 -0
- {shadowshell-0.0.39 → shadowshell-0.0.41}/src/shadowshell/file/file_util.py +0 -0
- {shadowshell-0.0.39 → shadowshell-0.0.41}/src/shadowshell/git_shell.py +0 -0
- {shadowshell-0.0.39 → shadowshell-0.0.41}/src/shadowshell/logger.py +0 -0
- {shadowshell-0.0.39 → shadowshell-0.0.41}/src/shadowshell/logging/logger.py +0 -0
- {shadowshell-0.0.39 → shadowshell-0.0.41}/src/shadowshell/logging/logger_factory.py +0 -0
- {shadowshell-0.0.39 → shadowshell-0.0.41}/src/shadowshell/monitor/__init__.py +0 -0
- {shadowshell-0.0.39 → shadowshell-0.0.41}/src/shadowshell/serialize/__init__.py +0 -0
- {shadowshell-0.0.39 → shadowshell-0.0.41}/src/shadowshell/serialize/serializer.py +0 -0
- {shadowshell-0.0.39 → shadowshell-0.0.41}/src/shadowshell/serialize/serializer_factory.py +0 -0
- {shadowshell-0.0.39 → shadowshell-0.0.41}/src/shadowshell/serialize/serializer_json.py +0 -0
- {shadowshell-0.0.39 → shadowshell-0.0.41}/src/shadowshell/stock_trader.py +0 -0
- {shadowshell-0.0.39 → shadowshell-0.0.41}/src/shadowshell/test/__init__.py +0 -0
- {shadowshell-0.0.39 → shadowshell-0.0.41}/src/shadowshell/test/test.py +0 -0
- {shadowshell-0.0.39 → shadowshell-0.0.41}/src/shadowshell.egg-info/dependency_links.txt +0 -0
- {shadowshell-0.0.39 → shadowshell-0.0.41}/src/shadowshell.egg-info/requires.txt +0 -0
- {shadowshell-0.0.39 → shadowshell-0.0.41}/src/shadowshell.egg-info/top_level.txt +0 -0
- {shadowshell-0.0.39 → shadowshell-0.0.41}/tests/tests.py +0 -0
|
@@ -4,8 +4,8 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "shadowshell" # 全局唯一名称(检查PyPI是否被占用)
|
|
7
|
-
version = "0.0.
|
|
8
|
-
#version = "0.0.
|
|
7
|
+
version = "0.0.41" # 版本号(每次更新需递增)
|
|
8
|
+
#version = "0.0.73" # 版本号(每次更新需递增)
|
|
9
9
|
authors = [{ name = "shadowshell", email = "shadowshellxyz@foxmail.com" }]
|
|
10
10
|
description = "www.shadowshell.xyz"
|
|
11
11
|
readme = "README.md"
|
|
@@ -8,24 +8,23 @@ Configurator
|
|
|
8
8
|
|
|
9
9
|
import configparser
|
|
10
10
|
|
|
11
|
-
from shadowshell import LoggerFactory
|
|
11
|
+
from shadowshell.logging import LoggerFactory
|
|
12
|
+
from shadowshell.monitor import function_monitor
|
|
13
|
+
|
|
14
|
+
class_name = "Configurator"
|
|
12
15
|
|
|
13
16
|
class Configurator:
|
|
14
17
|
|
|
15
18
|
config = None;
|
|
16
19
|
|
|
20
|
+
@function_monitor(class_name)
|
|
17
21
|
def __init__(self, config_file):
|
|
18
|
-
|
|
19
|
-
self.logger = LoggerFactory().get_logger()
|
|
20
|
-
|
|
21
|
-
# 加载配置文件
|
|
22
22
|
self.config = configparser.ConfigParser()
|
|
23
23
|
self.config.read(config_file)
|
|
24
|
-
self.logger.debug("load and read config file : %s." % (config_file))
|
|
25
24
|
|
|
25
|
+
@function_monitor(class_name)
|
|
26
26
|
def get(self, group, key):
|
|
27
27
|
value = self.config.get(group, key)
|
|
28
|
-
self.logger.debug("group -> %s, key -> %s, value -> %s" % (group, key, value))
|
|
29
28
|
return value
|
|
30
29
|
|
|
31
30
|
|
|
@@ -10,14 +10,15 @@ from shadowshell.console_logger import ConsoleLogger
|
|
|
10
10
|
|
|
11
11
|
class LoggerFactory:
|
|
12
12
|
|
|
13
|
-
logger =
|
|
13
|
+
__logger = logger = ConsoleLogger()
|
|
14
14
|
|
|
15
15
|
def __init__(self):
|
|
16
|
-
|
|
16
|
+
pass
|
|
17
17
|
|
|
18
|
-
|
|
19
|
-
|
|
18
|
+
@staticmethod
|
|
19
|
+
def get_logger(name = "default"):
|
|
20
|
+
return LoggerFactory.__logger
|
|
20
21
|
|
|
21
22
|
if __name__ == "__main__":
|
|
22
|
-
LoggerFactory
|
|
23
|
+
LoggerFactory.get_logger().info("test")
|
|
23
24
|
|
|
@@ -5,8 +5,14 @@
|
|
|
5
5
|
@author: shadowshell
|
|
6
6
|
"""
|
|
7
7
|
|
|
8
|
+
from shadowshell.logging.logging_constants import LoggingConstants
|
|
8
9
|
from shadowshell.logging.logger import Logger
|
|
9
10
|
from shadowshell.logging.logger_factory import LoggerFactory
|
|
10
11
|
from shadowshell.logging.console_logger import ConsoleLogger
|
|
11
12
|
|
|
12
|
-
__all__ = [
|
|
13
|
+
__all__ = [
|
|
14
|
+
'LoggingConstants',
|
|
15
|
+
'Logger',
|
|
16
|
+
'LoggerFactory',
|
|
17
|
+
'ConsoleLogger'
|
|
18
|
+
]
|
|
@@ -8,14 +8,16 @@ author: shadow shell
|
|
|
8
8
|
"""
|
|
9
9
|
|
|
10
10
|
from shadowshell.logging.logger import Logger
|
|
11
|
+
from shadowshell.logging.logging_constants import LoggingConstants
|
|
11
12
|
|
|
12
13
|
class ConsoleLogger(Logger):
|
|
13
14
|
|
|
14
15
|
def debug(self, content):
|
|
15
|
-
|
|
16
|
-
|
|
16
|
+
if LoggingConstants.LEVEL_DEBUG is True:
|
|
17
|
+
self.__log(content)
|
|
17
18
|
def info(self, content):
|
|
18
|
-
|
|
19
|
+
if LoggingConstants.LEVEL_INFO is True:
|
|
20
|
+
self.__log(content)
|
|
19
21
|
|
|
20
22
|
def warn(self, content):
|
|
21
23
|
self.__log(content)
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
|
|
4
|
+
"""
|
|
5
|
+
@author: shadowshell
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import sys
|
|
9
|
+
import time
|
|
10
|
+
from shadowshell.logging import LoggerFactory
|
|
11
|
+
from shadowshell.serialize import SerializerFactory
|
|
12
|
+
def __callback(request, response):
|
|
13
|
+
logger = LoggerFactory.get_logger()
|
|
14
|
+
logger.info(f"[CALLBACK][Request]{__format_request(request)}[Response]{__format_response(response)}")
|
|
15
|
+
|
|
16
|
+
def performance_monitor(class_name = None):
|
|
17
|
+
def decorator(func):
|
|
18
|
+
def wrapper(*args, **kwargs):
|
|
19
|
+
start = time.perf_counter()
|
|
20
|
+
response = None
|
|
21
|
+
is_successed = True
|
|
22
|
+
try:
|
|
23
|
+
response = func(*args, **kwargs)
|
|
24
|
+
except:
|
|
25
|
+
LoggerFactory.get_logger().error(sys.exc_info()[0])
|
|
26
|
+
is_successed = False
|
|
27
|
+
raise
|
|
28
|
+
finally:
|
|
29
|
+
cost = time.perf_counter() - start
|
|
30
|
+
# log
|
|
31
|
+
__record_digest_log("PERFORMANCE_MONITOR", class_name, func.__name__, cost, is_successed)
|
|
32
|
+
return response
|
|
33
|
+
return wrapper
|
|
34
|
+
return decorator
|
|
35
|
+
|
|
36
|
+
def function_monitor(class_name = None, callback = __callback):
|
|
37
|
+
logger = LoggerFactory.get_logger()
|
|
38
|
+
def decorator(func):
|
|
39
|
+
def wrapper(*args, **kwargs):
|
|
40
|
+
start = time.perf_counter()
|
|
41
|
+
response = None
|
|
42
|
+
is_successed = True
|
|
43
|
+
try:
|
|
44
|
+
response = func(*args, **kwargs)
|
|
45
|
+
except Exception as e:
|
|
46
|
+
logger.error(e)
|
|
47
|
+
is_successed = False
|
|
48
|
+
raise
|
|
49
|
+
except:
|
|
50
|
+
logger.error(sys.exc_info()[0])
|
|
51
|
+
is_successed = False
|
|
52
|
+
raise
|
|
53
|
+
finally:
|
|
54
|
+
cost = time.perf_counter() - start
|
|
55
|
+
# log
|
|
56
|
+
__record_digest_log("FUNCTION_MONITOR", class_name, func.__name__, cost, is_successed)
|
|
57
|
+
__record_detail_log("FUNCTION_MONITOR", class_name, func.__name__, args, response)
|
|
58
|
+
# callback
|
|
59
|
+
if callback is not None:
|
|
60
|
+
try:
|
|
61
|
+
callback(args, response)
|
|
62
|
+
finally:
|
|
63
|
+
logger.error(sys.exc_info()[0])
|
|
64
|
+
|
|
65
|
+
return response
|
|
66
|
+
return wrapper
|
|
67
|
+
return decorator
|
|
68
|
+
|
|
69
|
+
def __get_service_name(class_name, func_name):
|
|
70
|
+
service_name = func_name
|
|
71
|
+
if (class_name is not None):
|
|
72
|
+
service_name = class_name + "." + func_name
|
|
73
|
+
return service_name
|
|
74
|
+
|
|
75
|
+
def __format_request(request):
|
|
76
|
+
return SerializerFactory.get_instance().serialize(request)
|
|
77
|
+
|
|
78
|
+
def __format_response(response):
|
|
79
|
+
return SerializerFactory.get_instance().serialize(response)
|
|
80
|
+
def __record_digest_log(monitor_name, class_name, func_name, cost, is_successed):
|
|
81
|
+
logger = LoggerFactory.get_logger()
|
|
82
|
+
logger.info(f"[{monitor_name}][DIGEST_LOG][{__get_service_name(class_name, func_name)}]successed={is_successed}, cost:{cost:.6f}s.")
|
|
83
|
+
|
|
84
|
+
def __record_detail_log(monitor_name, class_name, func_name, request, response):
|
|
85
|
+
logger = LoggerFactory.get_logger()
|
|
86
|
+
logger.info(f"[{monitor_name}][DETAIL_LOG][{__get_service_name(class_name, func_name)}][Request]{__format_request(request)}[Response]{__format_response(response)}")
|
|
@@ -23,6 +23,7 @@ src/shadowshell/logging/__init__.py
|
|
|
23
23
|
src/shadowshell/logging/console_logger.py
|
|
24
24
|
src/shadowshell/logging/logger.py
|
|
25
25
|
src/shadowshell/logging/logger_factory.py
|
|
26
|
+
src/shadowshell/logging/logging_constants.py
|
|
26
27
|
src/shadowshell/monitor/__init__.py
|
|
27
28
|
src/shadowshell/monitor/monitor.py
|
|
28
29
|
src/shadowshell/serialize/__init__.py
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
# -*- coding: utf-8 -*-
|
|
3
|
-
|
|
4
|
-
"""
|
|
5
|
-
@author: shadowshell
|
|
6
|
-
"""
|
|
7
|
-
|
|
8
|
-
import sys
|
|
9
|
-
import time
|
|
10
|
-
from shadowshell.logging import LoggerFactory
|
|
11
|
-
|
|
12
|
-
logger = LoggerFactory().get_logger()
|
|
13
|
-
|
|
14
|
-
def performance_monitor(class_name=None):
|
|
15
|
-
def decorator(func):
|
|
16
|
-
def wrapper(*args, **kwargs):
|
|
17
|
-
start = time.perf_counter()
|
|
18
|
-
result = None
|
|
19
|
-
try:
|
|
20
|
-
result = func(*args, **kwargs)
|
|
21
|
-
finally:
|
|
22
|
-
elapsed = time.perf_counter() - start
|
|
23
|
-
if (class_name is not None):
|
|
24
|
-
logger.info(f"[PERFORMANCE_MONITOR][{class_name}.{func.__name__}] has ran, time elapsed:{elapsed:.6f}s.")
|
|
25
|
-
else:
|
|
26
|
-
logger.info(f"[PERFORMANCE_MONITOR][{func.__name__}] has ran, time elapsed:{elapsed:.6f}s.")
|
|
27
|
-
return result
|
|
28
|
-
return wrapper
|
|
29
|
-
return decorator
|
|
30
|
-
|
|
31
|
-
def function_monitor(class_name=None, callback=None):
|
|
32
|
-
def decorator(func):
|
|
33
|
-
def wrapper(*args, **kwargs):
|
|
34
|
-
start = time.perf_counter()
|
|
35
|
-
result = None
|
|
36
|
-
is_success = True
|
|
37
|
-
try:
|
|
38
|
-
result = func(*args, **kwargs)
|
|
39
|
-
except Exception as e:
|
|
40
|
-
logger.error(e)
|
|
41
|
-
is_success = False
|
|
42
|
-
raise
|
|
43
|
-
except:
|
|
44
|
-
logger.error(sys.exc_info()[0])
|
|
45
|
-
is_success = False
|
|
46
|
-
raise
|
|
47
|
-
finally:
|
|
48
|
-
elapsed = time.perf_counter() - start
|
|
49
|
-
# log
|
|
50
|
-
if (class_name is not None):
|
|
51
|
-
logger.info(f"[FUNCTION_MONITOR][{class_name}.{func.__name__}] has ran, is_success={is_success}, time elapsed:{elapsed:.6f}s.")
|
|
52
|
-
else:
|
|
53
|
-
logger.info(f"[FUNCTION_MONITOR][{func.__name__}] has ran, is_success={is_success}, time elapsed:{elapsed:.6f}s.")
|
|
54
|
-
|
|
55
|
-
# callback
|
|
56
|
-
if callback is not None:
|
|
57
|
-
try:
|
|
58
|
-
callback(args, kwargs, result, f"{elapsed:.6f}")
|
|
59
|
-
finally:
|
|
60
|
-
logger.error(sys.exc_info()[0])
|
|
61
|
-
|
|
62
|
-
return result
|
|
63
|
-
return wrapper
|
|
64
|
-
return decorator
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|