mdbq 3.9.6__py3-none-any.whl → 3.9.7__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/mylogger.py +57 -7
- mdbq/mysql/deduplicator.py +595 -0
- mdbq/mysql/mysql.py +146 -431
- mdbq/mysql/uploader.py +1151 -0
- {mdbq-3.9.6.dist-info → mdbq-3.9.7.dist-info}/METADATA +1 -1
- {mdbq-3.9.6.dist-info → mdbq-3.9.7.dist-info}/RECORD +9 -7
- {mdbq-3.9.6.dist-info → mdbq-3.9.7.dist-info}/WHEEL +0 -0
- {mdbq-3.9.6.dist-info → mdbq-3.9.7.dist-info}/top_level.txt +0 -0
mdbq/__version__.py
CHANGED
@@ -1 +1 @@
|
|
1
|
-
VERSION = '3.9.
|
1
|
+
VERSION = '3.9.7'
|
mdbq/log/mylogger.py
CHANGED
@@ -65,7 +65,8 @@ class MyLogger:
|
|
65
65
|
filters: Optional[List[Callable]] = None,
|
66
66
|
enable_metrics: bool = False,
|
67
67
|
metrics_interval: int = 300,
|
68
|
-
message_limited: int = 1000
|
68
|
+
message_limited: int = 1000,
|
69
|
+
flush_interval: int = 5
|
69
70
|
):
|
70
71
|
"""
|
71
72
|
初始化日志记录器
|
@@ -84,15 +85,15 @@ class MyLogger:
|
|
84
85
|
:param enable_metrics: 是否启用系统指标采集
|
85
86
|
:param metrics_interval: 指标采集间隔(秒)
|
86
87
|
:param message_limited: 简化日志内容,避免过长
|
88
|
+
:param flush_interval: 定时刷新日志器间隔(秒)
|
87
89
|
"""
|
88
90
|
log_path = os.path.join(os.path.expanduser("~"), 'logfile')
|
89
|
-
if not os.path.isdir(log_path):
|
90
|
-
os.makedirs(log_path)
|
91
|
-
|
92
91
|
self.name = name
|
93
92
|
self.logging_mode = logging_mode.lower()
|
94
93
|
self.log_level = log_level.upper()
|
95
94
|
self.log_file = os.path.join(log_path, log_file)
|
95
|
+
if not os.path.isdir(os.path.dirname(self.log_file)):
|
96
|
+
os.makedirs(os.path.dirname(self.log_file))
|
96
97
|
self.log_format = log_format
|
97
98
|
self.max_log_size = max_log_size
|
98
99
|
self.backup_count = backup_count
|
@@ -104,6 +105,7 @@ class MyLogger:
|
|
104
105
|
self.enable_metrics = enable_metrics and HAS_PSUTIL
|
105
106
|
self.metrics_interval = metrics_interval
|
106
107
|
self.message_limited = message_limited
|
108
|
+
self.flush_interval = flush_interval
|
107
109
|
|
108
110
|
# 上下文相关
|
109
111
|
self._context = threading.local()
|
@@ -118,6 +120,10 @@ class MyLogger:
|
|
118
120
|
self._async_thread = None
|
119
121
|
self._stop_event = threading.Event()
|
120
122
|
|
123
|
+
# 定时刷新相关
|
124
|
+
self._flush_thread = None
|
125
|
+
self._last_flush_time = 0
|
126
|
+
|
121
127
|
# 创建日志记录器
|
122
128
|
self.logger = logging.getLogger(name)
|
123
129
|
self._init_logging()
|
@@ -439,13 +445,23 @@ class MyLogger:
|
|
439
445
|
"""关闭日志记录器,确保所有日志被刷新"""
|
440
446
|
if self.enable_async:
|
441
447
|
self._stop_event.set()
|
448
|
+
# 等待队列清空
|
449
|
+
while not self._log_queue.empty():
|
450
|
+
time.sleep(0.1)
|
442
451
|
if self._async_thread and self._async_thread.is_alive():
|
443
|
-
self._async_thread.join(timeout=
|
452
|
+
self._async_thread.join(timeout=2)
|
453
|
+
if self._flush_thread and self._flush_thread.is_alive():
|
454
|
+
self._flush_thread.join(timeout=2)
|
444
455
|
|
445
456
|
# 确保所有handler被刷新
|
457
|
+
self._flush_handlers()
|
458
|
+
|
459
|
+
# 关闭所有handler
|
446
460
|
for handler in self.logger.handlers:
|
447
|
-
|
448
|
-
|
461
|
+
try:
|
462
|
+
handler.close()
|
463
|
+
except:
|
464
|
+
pass
|
449
465
|
|
450
466
|
def debug(self, message: str, extra: Optional[Dict] = None):
|
451
467
|
"""记录调试信息"""
|
@@ -528,6 +544,40 @@ class MyLogger:
|
|
528
544
|
extra={'elapsed_seconds': elapsed})
|
529
545
|
return False
|
530
546
|
|
547
|
+
def _start_flush_thread(self):
|
548
|
+
"""启动定时刷新线程"""
|
549
|
+
self._stop_event.clear()
|
550
|
+
self._flush_thread = threading.Thread(
|
551
|
+
target=self._flush_worker,
|
552
|
+
name=f"{self.name}_flush_thread",
|
553
|
+
daemon=True
|
554
|
+
)
|
555
|
+
self._flush_thread.start()
|
556
|
+
|
557
|
+
def _flush_worker(self):
|
558
|
+
"""定时刷新工作线程"""
|
559
|
+
while not self._stop_event.is_set():
|
560
|
+
try:
|
561
|
+
time.sleep(self.flush_interval)
|
562
|
+
self._flush_handlers()
|
563
|
+
except Exception as e:
|
564
|
+
try:
|
565
|
+
self.logger.error(f"刷新线程异常: {e}",
|
566
|
+
extra={'extra_data': {'flush_error': str(e)}})
|
567
|
+
except:
|
568
|
+
pass
|
569
|
+
|
570
|
+
def _flush_handlers(self):
|
571
|
+
"""刷新所有handler"""
|
572
|
+
for handler in self.logger.handlers:
|
573
|
+
try:
|
574
|
+
handler.flush()
|
575
|
+
except Exception as e:
|
576
|
+
try:
|
577
|
+
self.logger.error(f"刷新handler失败: {e}",
|
578
|
+
extra={'extra_data': {'handler_flush_error': str(e)}})
|
579
|
+
except:
|
580
|
+
pass
|
531
581
|
|
532
582
|
def main():
|
533
583
|
# 创建日志记录器
|