mdbq 3.9.5__py3-none-any.whl → 3.9.6__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.
- mdbq/__version__.py +1 -1
- mdbq/log/{mlogger.py → mylogger.py} +59 -34
- {mdbq-3.9.5.dist-info → mdbq-3.9.6.dist-info}/METADATA +1 -1
- {mdbq-3.9.5.dist-info → mdbq-3.9.6.dist-info}/RECORD +6 -6
- {mdbq-3.9.5.dist-info → mdbq-3.9.6.dist-info}/WHEEL +0 -0
- {mdbq-3.9.5.dist-info → mdbq-3.9.6.dist-info}/top_level.txt +0 -0
mdbq/__version__.py
CHANGED
@@ -1 +1 @@
|
|
1
|
-
VERSION = '3.9.
|
1
|
+
VERSION = '3.9.6'
|
@@ -3,10 +3,12 @@ import logging.handlers
|
|
3
3
|
import datetime
|
4
4
|
import json
|
5
5
|
import os
|
6
|
+
import sys
|
6
7
|
import time
|
7
8
|
import threading
|
8
9
|
import queue
|
9
10
|
from typing import Optional, Dict, Any, List, Callable, Union
|
11
|
+
import atexit
|
10
12
|
|
11
13
|
try:
|
12
14
|
import psutil
|
@@ -49,7 +51,7 @@ class MyLogger:
|
|
49
51
|
|
50
52
|
def __init__(
|
51
53
|
self,
|
52
|
-
name: str = '
|
54
|
+
name: str = 'mylogger.log',
|
53
55
|
logging_mode: str = 'console', # 'both', 'console', 'file', 'none'
|
54
56
|
log_level: str = 'INFO', # 'DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL'
|
55
57
|
log_file: str = 'm_app.log',
|
@@ -83,10 +85,14 @@ class MyLogger:
|
|
83
85
|
:param metrics_interval: 指标采集间隔(秒)
|
84
86
|
:param message_limited: 简化日志内容,避免过长
|
85
87
|
"""
|
88
|
+
log_path = os.path.join(os.path.expanduser("~"), 'logfile')
|
89
|
+
if not os.path.isdir(log_path):
|
90
|
+
os.makedirs(log_path)
|
91
|
+
|
86
92
|
self.name = name
|
87
93
|
self.logging_mode = logging_mode.lower()
|
88
94
|
self.log_level = log_level.upper()
|
89
|
-
self.log_file = log_file
|
95
|
+
self.log_file = os.path.join(log_path, log_file)
|
90
96
|
self.log_format = log_format
|
91
97
|
self.max_log_size = max_log_size
|
92
98
|
self.backup_count = backup_count
|
@@ -119,6 +125,8 @@ class MyLogger:
|
|
119
125
|
if self.enable_async:
|
120
126
|
self._start_async_logging()
|
121
127
|
|
128
|
+
atexit.register(self.shutdown)
|
129
|
+
|
122
130
|
def __enter__(self):
|
123
131
|
"""上下文管理器入口"""
|
124
132
|
return self
|
@@ -205,11 +213,12 @@ class MyLogger:
|
|
205
213
|
'timestamp': datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
|
206
214
|
'level': record.levelname,
|
207
215
|
'message': record.getMessage(),
|
208
|
-
'module': record.module,
|
216
|
+
# 'module': record.module,
|
209
217
|
'function': record.funcName,
|
210
|
-
'line': record.lineno,
|
211
|
-
'thread': record.threadName,
|
212
|
-
'process': record.processName,
|
218
|
+
# 'line': record.lineno,
|
219
|
+
# 'thread': record.threadName,
|
220
|
+
# 'process': record.processName,
|
221
|
+
'name': record.name,
|
213
222
|
}
|
214
223
|
|
215
224
|
# 添加额外字段
|
@@ -252,7 +261,8 @@ class MyLogger:
|
|
252
261
|
filename=self.log_file,
|
253
262
|
maxBytes=self.max_log_size * 1024 * 1024,
|
254
263
|
backupCount=self.backup_count,
|
255
|
-
encoding='utf-8'
|
264
|
+
encoding='utf-8',
|
265
|
+
delay=False
|
256
266
|
)
|
257
267
|
file_handler.setFormatter(formatter)
|
258
268
|
self.logger.addHandler(file_handler)
|
@@ -461,10 +471,43 @@ class MyLogger:
|
|
461
471
|
"""记录异常信息"""
|
462
472
|
if not extra:
|
463
473
|
extra = {}
|
464
|
-
|
465
|
-
|
474
|
+
# # 获取异常发生的实际位置
|
475
|
+
# tb = exc_info.__traceback__
|
476
|
+
#
|
477
|
+
# if tb:
|
478
|
+
# extra.update({
|
479
|
+
# 'module': tb.tb_frame.f_globals.get('__name__', ''),
|
480
|
+
# 'function': tb.tb_frame.f_code.co_name,
|
481
|
+
# 'line': tb.tb_lineno,
|
482
|
+
# 'file': tb.tb_frame.f_code.co_filename
|
483
|
+
# })
|
484
|
+
# extra['异常'] = str(exc_info)
|
485
|
+
# extra['类型'] = exc_info.__class__.__name__
|
486
|
+
# self.log('error', message, extra)
|
487
|
+
|
488
|
+
# 获取完整的异常堆栈
|
489
|
+
tb = exc_info.__traceback__
|
490
|
+
while tb.tb_next:
|
491
|
+
tb = tb.tb_next # 获取最内层的堆栈帧
|
492
|
+
|
493
|
+
extra.update({
|
494
|
+
'module': tb.tb_frame.f_globals.get('__name__', ''),
|
495
|
+
'function': tb.tb_frame.f_code.co_name,
|
496
|
+
'line': tb.tb_lineno,
|
497
|
+
'file': tb.tb_frame.f_code.co_filename,
|
498
|
+
'异常': str(exc_info),
|
499
|
+
'类型': exc_info.__class__.__name__,
|
500
|
+
'堆栈': self._format_traceback(exc_info)
|
501
|
+
})
|
502
|
+
|
503
|
+
# 直接使用logger的error方法记录,保留原始调用栈
|
466
504
|
self.log('error', message, extra)
|
467
505
|
|
506
|
+
def _format_traceback(self, exc_info):
|
507
|
+
"""格式化异常堆栈"""
|
508
|
+
import traceback
|
509
|
+
return ''.join(traceback.format_exception(type(exc_info), exc_info, exc_info.__traceback__))
|
510
|
+
|
468
511
|
def timeit(self, message: str = "Execution time"):
|
469
512
|
"""返回一个计时器上下文管理器"""
|
470
513
|
return self._Timer(self, message)
|
@@ -493,34 +536,16 @@ def main():
|
|
493
536
|
logging_mode='both',
|
494
537
|
log_level='DEBUG',
|
495
538
|
log_file='/Users/xigua/Downloads/my_app.log',
|
496
|
-
log_format='
|
497
|
-
|
539
|
+
log_format='json',
|
540
|
+
max_log_size=50,
|
541
|
+
backup_count=5,
|
542
|
+
enable_async=True, # 是否启用异步日志
|
498
543
|
sample_rate=1, # 采样50%的DEBUG/INFO日志
|
499
|
-
sensitive_fields=[
|
500
|
-
enable_metrics=
|
544
|
+
sensitive_fields=[], # 敏感字段列表
|
545
|
+
enable_metrics=False, # 是否启用性能指标
|
501
546
|
)
|
502
547
|
|
503
|
-
|
504
|
-
def keyword_filter(level, message, extra):
|
505
|
-
blocked_keywords = ['secret', 'password']
|
506
|
-
return not any(keyword in message.lower() for keyword in blocked_keywords)
|
507
|
-
|
508
|
-
logger.add_filter(keyword_filter)
|
509
|
-
|
510
|
-
# 使用上下文管理器
|
511
|
-
with logger.context(request_id='12345', user='admin'):
|
512
|
-
logger.info("开始处理请求")
|
513
|
-
|
514
|
-
# 使用计时器
|
515
|
-
with logger.timeit("数据库查询"):
|
516
|
-
time.sleep(0.1) # 模拟耗时操作
|
517
|
-
|
518
|
-
logger.debug("调试信息", extra={'data': {'key': 'value'}})
|
519
|
-
|
520
|
-
try:
|
521
|
-
1 / 0
|
522
|
-
except Exception as e:
|
523
|
-
logger.exception("发生错误", e)
|
548
|
+
logger.info('123')
|
524
549
|
|
525
550
|
# 确保所有日志被刷新
|
526
551
|
logger.shutdown()
|
@@ -1,12 +1,12 @@
|
|
1
1
|
mdbq/__init__.py,sha256=Il5Q9ATdX8yXqVxtP_nYqUhExzxPC_qk_WXQ_4h0exg,16
|
2
|
-
mdbq/__version__.py,sha256=
|
2
|
+
mdbq/__version__.py,sha256=rCARLRw4aYsH5Ac1n95qGJBlNNqAlv-EapPM3bcYkto,17
|
3
3
|
mdbq/aggregation/__init__.py,sha256=EeDqX2Aml6SPx8363J-v1lz0EcZtgwIBYyCJV6CcEDU,40
|
4
4
|
mdbq/aggregation/optimize.py,sha256=2oalzD9weZhDclUC22OLxYa8Zj7KnmsGUoUau_Jlyc4,19796
|
5
5
|
mdbq/aggregation/query_data.py,sha256=5_OzjGR5Sq00q-EgAYmSE5V9i4Solw9y4hkldl4mvt8,179808
|
6
6
|
mdbq/config/__init__.py,sha256=jso1oHcy6cJEfa7udS_9uO5X6kZLoPBF8l3wCYmr5dM,18
|
7
7
|
mdbq/config/config.py,sha256=eaTfrfXQ65xLqjr5I8-HkZd_jEY1JkGinEgv3TSLeoQ,3170
|
8
8
|
mdbq/log/__init__.py,sha256=Mpbrav0s0ifLL7lVDAuePEi1hJKiSHhxcv1byBKDl5E,15
|
9
|
-
mdbq/log/
|
9
|
+
mdbq/log/mylogger.py,sha256=CeQf8RcVITm9bVr-hHYdx6QtIbA--YkmWBAaPcMcXnY,20724
|
10
10
|
mdbq/log/spider_logging.py,sha256=-ozWWEGm3HVv604ozs_OOvVwumjokmUPwbaodesUrPY,1664
|
11
11
|
mdbq/mysql/__init__.py,sha256=A_DPJyAoEvTSFojiI2e94zP0FKtCkkwKP1kYUCSyQzo,11
|
12
12
|
mdbq/mysql/mysql.py,sha256=WFkv2flWuYRJqTzCOvxyiPeJgyJvVQzSG24jH_x5oEg,132390
|
@@ -23,7 +23,7 @@ mdbq/redis/__init__.py,sha256=YtgBlVSMDphtpwYX248wGge1x-Ex_mMufz4-8W0XRmA,12
|
|
23
23
|
mdbq/redis/getredis.py,sha256=Uk8-cOWT0JU1qRyIVqdbYokSLvkDIAfcokmYj1ebw8k,24104
|
24
24
|
mdbq/spider/__init__.py,sha256=RBMFXGy_jd1HXZhngB2T2XTvJqki8P_Fr-pBcwijnew,18
|
25
25
|
mdbq/spider/aikucun.py,sha256=OhyEv1VyAKTOHjLDM37iNDQeRg5OnrNoKODoG2VxHes,19806
|
26
|
-
mdbq-3.9.
|
27
|
-
mdbq-3.9.
|
28
|
-
mdbq-3.9.
|
29
|
-
mdbq-3.9.
|
26
|
+
mdbq-3.9.6.dist-info/METADATA,sha256=RyMeBh6UL0QDEClon62yAzpowavd-5sUZKjniEex-hs,363
|
27
|
+
mdbq-3.9.6.dist-info/WHEEL,sha256=jB7zZ3N9hIM9adW7qlTAyycLYW9npaWKLRzaoVcLKcM,91
|
28
|
+
mdbq-3.9.6.dist-info/top_level.txt,sha256=2FQ-uLnCSB-OwFiWntzmwosW3X2Xqsg0ewh1axsaylA,5
|
29
|
+
mdbq-3.9.6.dist-info/RECORD,,
|
File without changes
|
File without changes
|