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 CHANGED
@@ -1 +1 @@
1
- VERSION = '3.9.5'
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 = 'mlogger',
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
- extra['异常'] = str(exc_info)
465
- extra['类型'] = exc_info.__class__.__name__
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='simple',
497
- enable_async=True,
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=['password', 'token'],
500
- enable_metrics=True
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,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: mdbq
3
- Version: 3.9.5
3
+ Version: 3.9.6
4
4
  Home-page: https://pypi.org/project/mdbq
5
5
  Author: xigua,
6
6
  Author-email: 2587125111@qq.com
@@ -1,12 +1,12 @@
1
1
  mdbq/__init__.py,sha256=Il5Q9ATdX8yXqVxtP_nYqUhExzxPC_qk_WXQ_4h0exg,16
2
- mdbq/__version__.py,sha256=6a9QWBZBLdUXab5LGTsteurYczwlY3DSfMu9kjZZUlA,17
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/mlogger.py,sha256=eM_0CYSWZsiwl6jHkm9F7S7pb_V54LdImrC3tOtxojg,19686
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.5.dist-info/METADATA,sha256=uv8f_2V0nVGSA9GFa39R9Pdg1ZX2O8ACLQnZkjR9T7I,363
27
- mdbq-3.9.5.dist-info/WHEEL,sha256=jB7zZ3N9hIM9adW7qlTAyycLYW9npaWKLRzaoVcLKcM,91
28
- mdbq-3.9.5.dist-info/top_level.txt,sha256=2FQ-uLnCSB-OwFiWntzmwosW3X2Xqsg0ewh1axsaylA,5
29
- mdbq-3.9.5.dist-info/RECORD,,
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