ErisPulse 2.2.1.dev0__py3-none-any.whl → 2.3.0.dev5__py3-none-any.whl
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.
- ErisPulse/Core/Bases/__init__.py +14 -0
- ErisPulse/Core/Bases/adapter.py +196 -0
- ErisPulse/Core/Bases/module.py +54 -0
- ErisPulse/Core/Event/__init__.py +14 -0
- ErisPulse/Core/Event/base.py +15 -2
- ErisPulse/Core/Event/command.py +21 -2
- ErisPulse/Core/Event/message.py +15 -0
- ErisPulse/Core/Event/meta.py +15 -0
- ErisPulse/Core/Event/notice.py +15 -0
- ErisPulse/Core/Event/request.py +16 -1
- ErisPulse/Core/__init__.py +38 -19
- ErisPulse/Core/{erispulse_config.py → _self_config.py} +16 -3
- ErisPulse/Core/adapter.py +374 -377
- ErisPulse/Core/config.py +137 -38
- ErisPulse/Core/exceptions.py +6 -1
- ErisPulse/Core/lifecycle.py +167 -0
- ErisPulse/Core/logger.py +97 -49
- ErisPulse/Core/module.py +279 -56
- ErisPulse/Core/router.py +112 -23
- ErisPulse/Core/storage.py +258 -77
- ErisPulse/Core/ux.py +664 -0
- ErisPulse/__init__.py +587 -242
- ErisPulse/__main__.py +1 -1999
- ErisPulse/utils/__init__.py +15 -0
- ErisPulse/utils/cli.py +1102 -0
- ErisPulse/utils/package_manager.py +847 -0
- ErisPulse/utils/reload_handler.py +135 -0
- {erispulse-2.2.1.dev0.dist-info → erispulse-2.3.0.dev5.dist-info}/METADATA +24 -6
- erispulse-2.3.0.dev5.dist-info/RECORD +33 -0
- {erispulse-2.2.1.dev0.dist-info → erispulse-2.3.0.dev5.dist-info}/WHEEL +1 -1
- {erispulse-2.2.1.dev0.dist-info → erispulse-2.3.0.dev5.dist-info}/licenses/LICENSE +1 -1
- ErisPulse/Core/env.py +0 -15
- ErisPulse/Core/module_registry.py +0 -227
- erispulse-2.2.1.dev0.dist-info/RECORD +0 -26
- {erispulse-2.2.1.dev0.dist-info → erispulse-2.3.0.dev5.dist-info}/entry_points.txt +0 -0
ErisPulse/Core/logger.py
CHANGED
|
@@ -13,22 +13,23 @@ ErisPulse 日志系统
|
|
|
13
13
|
import logging
|
|
14
14
|
import inspect
|
|
15
15
|
import datetime
|
|
16
|
-
from typing import List, Dict, Any, Optional, Union, Type, Set, Tuple, FrozenSet
|
|
17
16
|
from rich.logging import RichHandler
|
|
18
17
|
from rich.console import Console
|
|
19
18
|
|
|
19
|
+
|
|
20
20
|
class Logger:
|
|
21
21
|
"""
|
|
22
22
|
日志管理器
|
|
23
|
-
|
|
23
|
+
|
|
24
24
|
提供模块化日志记录和存储功能
|
|
25
|
-
|
|
25
|
+
|
|
26
26
|
{!--< tips >!--}
|
|
27
27
|
1. 使用set_module_level设置模块日志级别
|
|
28
28
|
2. 使用get_logs获取历史日志
|
|
29
29
|
3. 支持标准日志级别(DEBUG, INFO等)
|
|
30
30
|
{!--< /tips >!--}
|
|
31
31
|
"""
|
|
32
|
+
|
|
32
33
|
def __init__(self):
|
|
33
34
|
self._max_logs = 1000
|
|
34
35
|
self._logs = {}
|
|
@@ -42,15 +43,15 @@ class Logger:
|
|
|
42
43
|
show_time=False,
|
|
43
44
|
show_level=True,
|
|
44
45
|
show_path=False,
|
|
45
|
-
markup=False
|
|
46
|
+
markup=False,
|
|
46
47
|
)
|
|
47
48
|
self._logger.addHandler(console_handler)
|
|
48
49
|
self._setup_config()
|
|
49
|
-
|
|
50
|
+
|
|
50
51
|
def set_memory_limit(self, limit: int) -> bool:
|
|
51
52
|
"""
|
|
52
53
|
设置日志内存存储上限
|
|
53
|
-
|
|
54
|
+
|
|
54
55
|
:param limit: 日志存储上限
|
|
55
56
|
:return: bool 设置是否成功
|
|
56
57
|
"""
|
|
@@ -68,7 +69,7 @@ class Logger:
|
|
|
68
69
|
def set_level(self, level: str) -> bool:
|
|
69
70
|
"""
|
|
70
71
|
设置全局日志级别
|
|
71
|
-
|
|
72
|
+
|
|
72
73
|
:param level: 日志级别(DEBUG/INFO/WARNING/ERROR/CRITICAL)
|
|
73
74
|
:return: bool 设置是否成功
|
|
74
75
|
"""
|
|
@@ -78,7 +79,7 @@ class Logger:
|
|
|
78
79
|
self._logger.setLevel(getattr(logging, level))
|
|
79
80
|
return True
|
|
80
81
|
return False
|
|
81
|
-
except Exception
|
|
82
|
+
except Exception:
|
|
82
83
|
self._logger.error(f"无效的日志等级: {level}")
|
|
83
84
|
return False
|
|
84
85
|
|
|
@@ -90,8 +91,9 @@ class Logger:
|
|
|
90
91
|
:param level: 日志级别(DEBUG/INFO/WARNING/ERROR/CRITICAL)
|
|
91
92
|
:return: bool 设置是否成功
|
|
92
93
|
"""
|
|
93
|
-
from .
|
|
94
|
-
|
|
94
|
+
from .module import module
|
|
95
|
+
|
|
96
|
+
if not module.is_enabled(module_name):
|
|
95
97
|
self._logger.warning(f"模块 {module_name} 未启用,无法设置日志等级。")
|
|
96
98
|
return False
|
|
97
99
|
level = level.upper()
|
|
@@ -119,7 +121,7 @@ class Logger:
|
|
|
119
121
|
|
|
120
122
|
for p in path:
|
|
121
123
|
try:
|
|
122
|
-
file_handler = logging.FileHandler(p, encoding=
|
|
124
|
+
file_handler = logging.FileHandler(p, encoding="utf-8")
|
|
123
125
|
# 使用自定义格式化器去除rich markup标签
|
|
124
126
|
file_handler.setFormatter(logging.Formatter("[%(name)s] %(message)s"))
|
|
125
127
|
self._logger.addHandler(file_handler)
|
|
@@ -127,20 +129,23 @@ class Logger:
|
|
|
127
129
|
except Exception as e:
|
|
128
130
|
self._logger.error(f"无法设置日志文件 {p}: {e}")
|
|
129
131
|
return False
|
|
130
|
-
|
|
132
|
+
|
|
133
|
+
self._logger.warning("出现极端错误,无法设置日志文件。")
|
|
134
|
+
return False
|
|
135
|
+
|
|
131
136
|
def save_logs(self, path) -> bool:
|
|
132
137
|
"""
|
|
133
138
|
保存所有在内存中记录的日志
|
|
134
|
-
|
|
139
|
+
|
|
135
140
|
:param path: 日志文件路径 Str/List
|
|
136
141
|
:return: bool 设置是否成功
|
|
137
142
|
"""
|
|
138
|
-
if self._logs
|
|
143
|
+
if self._logs is None:
|
|
139
144
|
self._logger.warning("没有log记录可供保存。")
|
|
140
145
|
return False
|
|
141
146
|
if isinstance(path, str):
|
|
142
147
|
path = [path]
|
|
143
|
-
|
|
148
|
+
|
|
144
149
|
for p in path:
|
|
145
150
|
try:
|
|
146
151
|
with open(p, "w", encoding="utf-8") as file:
|
|
@@ -154,7 +159,10 @@ class Logger:
|
|
|
154
159
|
self._logger.error(f"无法保存日志到 {p}: {e}。")
|
|
155
160
|
return False
|
|
156
161
|
|
|
157
|
-
|
|
162
|
+
self._logger.warning("出现极端错误,无法保存日志。")
|
|
163
|
+
return False
|
|
164
|
+
|
|
165
|
+
def get_logs(self, module_name: str = "Unknown") -> dict:
|
|
158
166
|
"""
|
|
159
167
|
获取日志内容
|
|
160
168
|
|
|
@@ -164,21 +172,22 @@ class Logger:
|
|
|
164
172
|
if module_name:
|
|
165
173
|
return {module_name: self._logs.get(module_name, [])}
|
|
166
174
|
return {k: v.copy() for k, v in self._logs.items()}
|
|
167
|
-
|
|
175
|
+
|
|
168
176
|
def _save_in_memory(self, ModuleName, msg):
|
|
169
177
|
if ModuleName not in self._logs:
|
|
170
178
|
self._logs[ModuleName] = []
|
|
171
|
-
|
|
179
|
+
|
|
172
180
|
# 检查日志数量是否超过限制
|
|
173
181
|
if len(self._logs[ModuleName]) >= self._max_logs:
|
|
174
182
|
self._logs[ModuleName].pop(0)
|
|
175
|
-
|
|
183
|
+
|
|
176
184
|
timestamp = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
|
177
185
|
msg = f"{timestamp} - {msg}"
|
|
178
186
|
self._logs[ModuleName].append(msg)
|
|
179
187
|
|
|
180
188
|
def _setup_config(self):
|
|
181
|
-
from .
|
|
189
|
+
from ._self_config import get_logger_config
|
|
190
|
+
|
|
182
191
|
logger_config = get_logger_config()
|
|
183
192
|
if "level" in logger_config:
|
|
184
193
|
self.set_level(logger_config["level"])
|
|
@@ -186,26 +195,41 @@ class Logger:
|
|
|
186
195
|
self.set_output_file(logger_config["log_files"])
|
|
187
196
|
if "memory_limit" in logger_config:
|
|
188
197
|
self.set_memory_limit(logger_config["memory_limit"])
|
|
189
|
-
|
|
198
|
+
|
|
190
199
|
def _get_effective_level(self, module_name):
|
|
191
200
|
return self._module_levels.get(module_name, self._logger.level)
|
|
192
201
|
|
|
202
|
+
|
|
193
203
|
def _get_caller(self):
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
204
|
+
try:
|
|
205
|
+
frame = inspect.currentframe()
|
|
206
|
+
# 安全地获取调用栈帧
|
|
207
|
+
if frame is None or frame.f_back is None or frame.f_back.f_back is None:
|
|
208
|
+
return "Unknown"
|
|
209
|
+
|
|
210
|
+
frame = frame.f_back.f_back
|
|
211
|
+
module = inspect.getmodule(frame)
|
|
212
|
+
|
|
213
|
+
# 处理模块为None的情况
|
|
214
|
+
if module is None:
|
|
215
|
+
return "Unknown"
|
|
216
|
+
|
|
217
|
+
module_name = module.__name__
|
|
218
|
+
if module_name == "__main__":
|
|
219
|
+
module_name = "Main"
|
|
220
|
+
elif module_name.endswith(".Core"):
|
|
221
|
+
module_name = module_name[:-5]
|
|
222
|
+
elif module_name.startswith("ErisPulse"):
|
|
223
|
+
module_name = "ErisPulse"
|
|
224
|
+
|
|
225
|
+
return module_name
|
|
226
|
+
except Exception:
|
|
227
|
+
return "Unknown"
|
|
228
|
+
|
|
229
|
+
def get_child(self, child_name: str = "UnknownChild"):
|
|
206
230
|
"""
|
|
207
231
|
获取子日志记录器
|
|
208
|
-
|
|
232
|
+
|
|
209
233
|
:param child_name: 子模块名称(可选)
|
|
210
234
|
:return: LoggerChild 子日志记录器实例
|
|
211
235
|
"""
|
|
@@ -241,60 +265,86 @@ class Logger:
|
|
|
241
265
|
self._logger.error(f"[{caller_module}] {msg}", *args, **kwargs)
|
|
242
266
|
|
|
243
267
|
def critical(self, msg, *args, **kwargs):
|
|
268
|
+
"""
|
|
269
|
+
记录 CRITICAL 级别日志
|
|
270
|
+
这是最高级别的日志,表示严重的系统错误
|
|
271
|
+
注意:此方法不会触发程序崩溃,仅记录日志
|
|
272
|
+
|
|
273
|
+
{!--< tips >!--}
|
|
274
|
+
1. 这是最高级别的日志,表示严重系统错误
|
|
275
|
+
2. 不会触发程序崩溃,如需终止程序请显式调用 sys.exit()
|
|
276
|
+
3. 会在日志文件中添加 CRITICAL 标记便于后续分析
|
|
277
|
+
{!--< /tips >!--}
|
|
278
|
+
"""
|
|
244
279
|
caller_module = self._get_caller()
|
|
245
280
|
if self._get_effective_level(caller_module) <= logging.CRITICAL:
|
|
246
281
|
self._save_in_memory(caller_module, msg)
|
|
247
282
|
self._logger.critical(f"[{caller_module}] {msg}", *args, **kwargs)
|
|
248
|
-
raise Exception(msg)
|
|
249
283
|
|
|
250
284
|
|
|
251
285
|
class LoggerChild:
|
|
252
286
|
"""
|
|
253
287
|
子日志记录器
|
|
254
|
-
|
|
288
|
+
|
|
255
289
|
用于创建具有特定名称的子日志记录器,仅改变模块名称,其他功能全部委托给父日志记录器
|
|
256
290
|
"""
|
|
257
|
-
|
|
291
|
+
|
|
258
292
|
def __init__(self, parent_logger: Logger, name: str):
|
|
259
293
|
"""
|
|
260
294
|
初始化子日志记录器
|
|
261
|
-
|
|
295
|
+
|
|
262
296
|
:param parent_logger: 父日志记录器实例
|
|
263
297
|
:param name: 子日志记录器名称
|
|
264
298
|
"""
|
|
265
299
|
self._parent = parent_logger
|
|
266
300
|
self._name = name
|
|
267
|
-
|
|
301
|
+
|
|
268
302
|
def debug(self, msg, *args, **kwargs):
|
|
269
|
-
if self._parent._get_effective_level(self._name.split(
|
|
303
|
+
if self._parent._get_effective_level(self._name.split(".")[0]) <= logging.DEBUG:
|
|
270
304
|
self._parent._save_in_memory(self._name, msg)
|
|
271
305
|
self._parent._logger.debug(f"[{self._name}] {msg}", *args, **kwargs)
|
|
272
306
|
|
|
273
307
|
def info(self, msg, *args, **kwargs):
|
|
274
|
-
if self._parent._get_effective_level(self._name.split(
|
|
308
|
+
if self._parent._get_effective_level(self._name.split(".")[0]) <= logging.INFO:
|
|
275
309
|
self._parent._save_in_memory(self._name, msg)
|
|
276
310
|
self._parent._logger.info(f"[{self._name}] {msg}", *args, **kwargs)
|
|
277
311
|
|
|
278
312
|
def warning(self, msg, *args, **kwargs):
|
|
279
|
-
if
|
|
313
|
+
if (
|
|
314
|
+
self._parent._get_effective_level(self._name.split(".")[0])
|
|
315
|
+
<= logging.WARNING
|
|
316
|
+
):
|
|
280
317
|
self._parent._save_in_memory(self._name, msg)
|
|
281
318
|
self._parent._logger.warning(f"[{self._name}] {msg}", *args, **kwargs)
|
|
282
319
|
|
|
283
320
|
def error(self, msg, *args, **kwargs):
|
|
284
|
-
if self._parent._get_effective_level(self._name.split(
|
|
321
|
+
if self._parent._get_effective_level(self._name.split(".")[0]) <= logging.ERROR:
|
|
285
322
|
self._parent._save_in_memory(self._name, msg)
|
|
286
323
|
self._parent._logger.error(f"[{self._name}] {msg}", *args, **kwargs)
|
|
287
324
|
|
|
288
325
|
def critical(self, msg, *args, **kwargs):
|
|
289
|
-
|
|
326
|
+
"""
|
|
327
|
+
记录 CRITICAL 级别日志
|
|
328
|
+
这是最高级别的日志,表示严重的系统错误
|
|
329
|
+
注意:此方法不会触发程序崩溃,仅记录日志
|
|
330
|
+
|
|
331
|
+
{!--< tips >!--}
|
|
332
|
+
1. 这是最高级别的日志,表示严重系统错误
|
|
333
|
+
2. 不会触发程序崩溃,如需终止程序请显式调用 sys.exit()
|
|
334
|
+
3. 会在日志文件中添加 CRITICAL 标记便于后续分析
|
|
335
|
+
{!--< /tips >!--}
|
|
336
|
+
"""
|
|
337
|
+
if (
|
|
338
|
+
self._parent._get_effective_level(self._name.split(".")[0])
|
|
339
|
+
<= logging.CRITICAL
|
|
340
|
+
):
|
|
290
341
|
self._parent._save_in_memory(self._name, msg)
|
|
291
342
|
self._parent._logger.critical(f"[{self._name}] {msg}", *args, **kwargs)
|
|
292
|
-
raise Exception(msg)
|
|
293
343
|
|
|
294
344
|
def get_child(self, child_name: str):
|
|
295
345
|
"""
|
|
296
346
|
获取子日志记录器的子记录器
|
|
297
|
-
|
|
347
|
+
|
|
298
348
|
:param child_name: 子模块名称
|
|
299
349
|
:return: LoggerChild 子日志记录器实例
|
|
300
350
|
"""
|
|
@@ -304,6 +354,4 @@ class LoggerChild:
|
|
|
304
354
|
|
|
305
355
|
logger = Logger()
|
|
306
356
|
|
|
307
|
-
__all__ = [
|
|
308
|
-
"logger"
|
|
309
|
-
]
|
|
357
|
+
__all__ = ["logger"]
|