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 CHANGED
@@ -1 +1 @@
1
- VERSION = '3.9.6'
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=5)
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
- handler.flush()
448
- handler.close()
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
  # 创建日志记录器