xmi-logger 0.0.2__tar.gz → 0.0.4__tar.gz

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.
@@ -0,0 +1,480 @@
1
+ Metadata-Version: 2.4
2
+ Name: xmi_logger
3
+ Version: 0.0.4
4
+ Summary: An enhanced logger based on Loguru
5
+ Home-page: https://github.com/wang-zhibo/xmi_logger
6
+ Author: gm.zhibo.wang
7
+ Author-email: gm.zhibo.wang@gmail.com
8
+ Project-URL: Bug Reports, https://github.com/wang-zhibo/xmi_logger/issues
9
+ Project-URL: Source, https://github.com/wang-zhibo/xmi_logger
10
+ Classifier: Programming Language :: Python :: 3
11
+ Classifier: Operating System :: OS Independent
12
+ Requires-Python: >=3.6
13
+ Description-Content-Type: text/markdown
14
+ Requires-Dist: loguru==0.7.3
15
+ Requires-Dist: requests
16
+ Requires-Dist: aiohttp
17
+ Dynamic: author
18
+ Dynamic: author-email
19
+ Dynamic: classifier
20
+ Dynamic: description
21
+ Dynamic: description-content-type
22
+ Dynamic: home-page
23
+ Dynamic: project-url
24
+ Dynamic: requires-dist
25
+ Dynamic: requires-python
26
+ Dynamic: summary
27
+
28
+ # XmiLogger
29
+
30
+ 基于 Loguru 的增强日志记录器,支持多语言、异步操作和高级统计功能。
31
+
32
+ ## 特性
33
+
34
+ - 🚀 高性能:使用 LRU 缓存和异步处理
35
+ - 🌐 多语言支持:支持中文和英文日志输出
36
+ - 📊 高级统计:支持日志分类统计和趋势分析
37
+ - 🔄 异步支持:支持异步函数日志记录
38
+ - 📝 自定义格式:支持自定义日志格式
39
+ - 🔒 安全性:内置错误处理和配置验证
40
+ - 📦 日志轮转:支持按大小和时间轮转
41
+ - 🌍 远程日志:支持异步远程日志收集
42
+ - 🐛 增强错误信息:显示详细的错误位置、调用链和代码行
43
+ - ⚡ 性能优化:智能缓存、连接池、内存优化
44
+
45
+ ## 安装
46
+
47
+ ```bash
48
+ pip install xmi-logger
49
+ ```
50
+
51
+ ## 快速开始
52
+
53
+ ### 基本使用
54
+
55
+ ```python
56
+ from xmi_logger import XmiLogger
57
+
58
+ # 创建日志记录器实例
59
+ logger = XmiLogger(
60
+ file_name="app",
61
+ log_dir="logs",
62
+ language="zh" # 使用中文输出
63
+ )
64
+
65
+ # 记录不同级别的日志
66
+ logger.info("这是一条信息日志")
67
+ logger.warning("这是一条警告日志")
68
+ logger.error("这是一条错误日志")
69
+ ```
70
+
71
+ ### 异步函数支持
72
+
73
+ ```python
74
+ import asyncio
75
+
76
+ @logger.log_decorator()
77
+ async def async_function():
78
+ await asyncio.sleep(1)
79
+ return "异步操作完成"
80
+
81
+ # 使用异步函数
82
+ async def main():
83
+ result = await async_function()
84
+ logger.info(f"异步函数结果: {result}")
85
+
86
+ asyncio.run(main())
87
+ ```
88
+
89
+ ### 增强错误信息
90
+
91
+ ```python
92
+ # 错误日志现在会显示详细的位置信息
93
+ @logger.log_decorator("除零错误", level="ERROR")
94
+ def divide_numbers(a, b):
95
+ return a / b
96
+
97
+ try:
98
+ result = divide_numbers(1, 0)
99
+ except ZeroDivisionError:
100
+ logger.exception("捕获到除零错误")
101
+ # 输出示例:
102
+ # 2025-01-03 10:30:15.123 | ERROR | ReqID:REQ-123 | app.py:25:divide_numbers | 12345 | 除零错误 [ZeroDivisionError]: division by zero | 位置: app.py:25:divide_numbers | 代码: return a / b
103
+ # 调用链: app.py:25:divide_numbers -> main.py:10:main
104
+ ```
105
+
106
+ ### 带位置信息的日志
107
+
108
+ ```python
109
+ # 使用 log_with_location 方法记录带位置信息的日志
110
+ logger.log_with_location("INFO", "这是带位置信息的日志")
111
+ # 输出示例:
112
+ # 2025-01-03 10:30:15.123 | INFO | ReqID:REQ-123 | app.py:30:main | 12345 | [app.py:30:main] 这是带位置信息的日志
113
+ ```
114
+
115
+ ### 性能监控
116
+
117
+ ```python
118
+ # 获取性能统计信息
119
+ perf_stats = logger.get_performance_stats()
120
+ print(json.dumps(perf_stats, indent=2))
121
+
122
+ # 清除缓存
123
+ logger.clear_caches()
124
+
125
+ # 性能优化配置
126
+ logger = XmiLogger(
127
+ file_name="app",
128
+ cache_size=512, # 增加缓存大小
129
+ enable_stats=True # 启用统计功能
130
+ )
131
+ ```
132
+
133
+ ### 批量日志处理
134
+
135
+ ```python
136
+ # 批量记录日志
137
+ batch_logs = [
138
+ {'level': 'INFO', 'message': '消息1', 'tag': 'BATCH'},
139
+ {'level': 'WARNING', 'message': '消息2', 'category': 'SYSTEM'},
140
+ {'level': 'ERROR', 'message': '消息3'}
141
+ ]
142
+
143
+ logger.batch_log(batch_logs) # 同步批量记录
144
+ logger.async_batch_log(batch_logs) # 异步批量记录
145
+ ```
146
+
147
+ ### 上下文日志
148
+
149
+ ```python
150
+ # 带上下文的日志记录
151
+ context = {
152
+ 'user_id': 12345,
153
+ 'session_id': 'sess_abc123',
154
+ 'request_id': 'req_xyz789'
155
+ }
156
+
157
+ logger.log_with_context("INFO", "用户登录", context)
158
+ logger.log_with_timing("INFO", "API请求完成", {'db_query': 0.125, 'total': 0.467})
159
+ ```
160
+
161
+ ### 自适应日志级别
162
+
163
+ ```python
164
+ # 启用自适应级别
165
+ logger = XmiLogger(
166
+ file_name="app",
167
+ adaptive_level=True, # 启用自适应级别
168
+ performance_mode=True # 启用性能模式
169
+ )
170
+
171
+ # 根据错误率自动调整级别
172
+ logger.set_adaptive_level(error_rate_threshold=0.1)
173
+ ```
174
+
175
+ ### 日志管理
176
+
177
+ ```python
178
+ # 压缩旧日志
179
+ logger.compress_logs(days_old=7)
180
+
181
+ # 归档日志
182
+ logger.archive_logs()
183
+
184
+ # 清理旧日志
185
+ logger.cleanup_old_logs(max_days=30)
186
+ ```
187
+
188
+ ### 日志分析
189
+
190
+ ```python
191
+ # 分析日志
192
+ analysis = logger.analyze_logs(hours=24)
193
+ print(f"错误率: {analysis['error_rate']:.2%}")
194
+
195
+ # 生成报告
196
+ report = logger.generate_log_report(hours=24)
197
+ print(report)
198
+
199
+ # 导出日志
200
+ logger.export_logs_to_json("logs.json", hours=24)
201
+ ```
202
+
203
+ ### 智能分析功能
204
+
205
+ ```python
206
+ from xmi_logger.advanced_features import *
207
+
208
+ # 智能日志分析
209
+ analyzer = LogAnalyzer()
210
+ analysis = analyzer.analyze_log({
211
+ 'message': '数据库连接失败: Connection refused',
212
+ 'level': 'ERROR'
213
+ })
214
+ print(f"严重程度: {analysis['severity']}") # high
215
+ print(f"类别: {analysis['categories']}") # ['error']
216
+ print(f"建议: {analysis['suggestions']}") # ['检查相关服务和依赖']
217
+
218
+ # 分布式日志支持
219
+ dist_logger = DistributedLogger("node-001")
220
+ log_id = dist_logger.get_log_id() # node-001_1640995200000_1
221
+ logger.info(f"分布式日志消息 (ID: {log_id})")
222
+
223
+ # 日志安全功能
224
+ security = LogSecurity()
225
+ original = "用户密码: 123456"
226
+ sanitized = security.sanitize_message(original)
227
+ print(sanitized) # 用户密码=***
228
+
229
+ # 性能监控
230
+ monitor = PerformanceMonitor()
231
+ monitor.record_log("INFO", 0.05) # 记录处理时间
232
+ metrics = monitor.get_metrics()
233
+ print(f"总日志数: {metrics['log_count']}")
234
+ print(f"平均处理时间: {metrics['avg_processing_time']:.2f}ms")
235
+
236
+ # 日志聚合
237
+ aggregator = LogAggregator(window_size=100, flush_interval=5.0)
238
+ for i in range(20):
239
+ aggregator.add_log({
240
+ 'level': 'INFO',
241
+ 'message': '重复的日志消息',
242
+ 'timestamp': time.time()
243
+ })
244
+ # 自动聚合为: [聚合] 重复的日志消息 (重复 20 次)
245
+
246
+ # 流处理
247
+ processor = LogStreamProcessor()
248
+
249
+ def add_timestamp(log_entry):
250
+ log_entry['processed_timestamp'] = time.time()
251
+ return log_entry
252
+
253
+ def add_checksum(log_entry):
254
+ message = log_entry.get('message', '')
255
+ log_entry['checksum'] = hashlib.md5(message.encode()).hexdigest()[:8]
256
+ return log_entry
257
+
258
+ processor.add_processor(add_timestamp)
259
+ processor.add_processor(add_checksum)
260
+
261
+ # 处理日志
262
+ processor.process_log({'level': 'INFO', 'message': '测试消息'})
263
+ processed_log = processor.get_processed_log()
264
+
265
+ # 数据库支持
266
+ db = LogDatabase("logs.db")
267
+ db.insert_log({
268
+ 'timestamp': datetime.now().isoformat(),
269
+ 'level': 'ERROR',
270
+ 'message': '数据库连接失败',
271
+ 'file': 'app.py',
272
+ 'line': 100,
273
+ 'function': 'connect_db'
274
+ })
275
+
276
+ # 查询错误日志
277
+ logs = db.query_logs({'level': 'ERROR'}, limit=10)
278
+
279
+ # 健康检查
280
+ checker = LogHealthChecker()
281
+ health = checker.check_health("logs")
282
+ print(f"状态: {health['status']}") # healthy/warning/critical
283
+ print(f"磁盘使用率: {health['disk_usage_percent']:.1f}%")
284
+
285
+ # 备份管理
286
+ backup_mgr = LogBackupManager("backups")
287
+ backup_path = backup_mgr.create_backup("logs", "daily_backup")
288
+
289
+ # 列出备份
290
+ backups = backup_mgr.list_backups()
291
+ for backup in backups:
292
+ print(f"{backup['name']} - {backup['size_mb']:.2f}MB")
293
+
294
+ # 内存优化
295
+ optimizer = MemoryOptimizer(max_memory_mb=512)
296
+ if optimizer.check_memory():
297
+ optimizer.optimize_memory() # 自动清理内存
298
+
299
+ # 智能路由
300
+ router = LogRouter()
301
+
302
+ def error_handler(log_entry):
303
+ print(f"🚨 错误日志: {log_entry['message']}")
304
+
305
+ def security_handler(log_entry):
306
+ print(f"🔒 安全日志: {log_entry['message']}")
307
+
308
+ router.add_route(lambda entry: entry.get('level') == 'ERROR', error_handler)
309
+ router.add_route(lambda entry: 'password' in entry.get('message', ''), security_handler)
310
+
311
+ router.route_log({'level': 'ERROR', 'message': '系统错误'})
312
+
313
+ # 日志归档
314
+ archiver = LogArchiver("archives")
315
+ archived_files = archiver.archive_logs("logs", days_old=7)
316
+ print(f"归档了 {len(archived_files)} 个文件")
317
+ ```
318
+
319
+ ### 远程日志收集
320
+
321
+ ```python
322
+ logger = XmiLogger(
323
+ file_name="app",
324
+ remote_log_url="https://your-log-server.com/logs",
325
+ max_workers=3
326
+ )
327
+ ```
328
+
329
+ ### 日志统计功能
330
+
331
+ ```python
332
+ # 启用统计功能
333
+ logger = XmiLogger(
334
+ file_name="app",
335
+ enable_stats=True
336
+ )
337
+
338
+ # 获取统计信息
339
+ stats = logger.get_stats()
340
+ print(logger.get_stats_summary())
341
+
342
+ # 获取错误趋势
343
+ error_trend = logger.get_error_trend()
344
+
345
+ # 获取分类分布
346
+ category_dist = logger.get_category_distribution()
347
+ ```
348
+
349
+ ## 高级配置
350
+
351
+ ### 完整配置示例
352
+
353
+ ```python
354
+ logger = XmiLogger(
355
+ file_name="app", # 日志文件名
356
+ log_dir="logs", # 日志目录
357
+ max_size=14, # 单个日志文件最大大小(MB)
358
+ retention="7 days", # 日志保留时间
359
+ remote_log_url=None, # 远程日志服务器URL
360
+ max_workers=3, # 远程日志发送线程数
361
+ work_type=False, # 工作模式(False为测试环境)
362
+ language="zh", # 日志语言(zh/en)
363
+ rotation_time="1 day", # 日志轮转时间
364
+ custom_format=None, # 自定义日志格式
365
+ filter_level="DEBUG", # 日志过滤级别
366
+ compression="zip", # 日志压缩格式
367
+ enable_stats=False, # 是否启用统计
368
+ categories=None, # 日志分类列表
369
+ cache_size=128 # 缓存大小
370
+ )
371
+ ```
372
+
373
+ ### 自定义日志格式
374
+
375
+ ```python
376
+ custom_format = (
377
+ "<green>{time:YYYY-MM-DD HH:mm:ss}</green> | "
378
+ "<level>{level: <8}</level> | "
379
+ "ReqID:{extra[request_id]} | "
380
+ "<cyan>{name}</cyan>:<cyan>{function}</cyan>:<cyan>{line}</cyan> - "
381
+ "<level>{message}</level>"
382
+ )
383
+
384
+ logger = XmiLogger(
385
+ file_name="app",
386
+ custom_format=custom_format
387
+ )
388
+ ```
389
+
390
+ ## 主要功能
391
+
392
+ ### 1. 日志记录
393
+ - 支持所有标准日志级别(DEBUG, INFO, WARNING, ERROR, CRITICAL)
394
+ - 支持自定义日志级别
395
+ - 支持带标签和分类的日志记录
396
+
397
+ ### 2. 日志管理
398
+ - 自动日志轮转
399
+ - 日志压缩
400
+ - 日志保留策略
401
+ - 多文件输出(按级别分文件)
402
+
403
+ ### 3. 统计功能
404
+ - 日志总数统计
405
+ - 错误率统计
406
+ - 按类别统计
407
+ - 按时间统计
408
+ - 错误趋势分析
409
+
410
+ ### 4. 远程日志
411
+ - 异步远程日志发送
412
+ - 自动重试机制
413
+ - 线程池管理
414
+ - 错误处理
415
+
416
+ ### 5. 装饰器支持
417
+ - 函数执行时间记录
418
+ - 异常捕获和记录
419
+ - 支持同步和异步函数
420
+
421
+ ### 6. 增强错误信息
422
+ - 显示错误发生的具体文件、行号和函数名
423
+ - 显示错误发生时的代码行内容
424
+ - 显示调用链信息(最后3层调用)
425
+ - 支持全局异常处理器
426
+ - 提供带位置信息的日志记录方法
427
+
428
+ ### 7. 性能优化
429
+ - 智能缓存机制减少重复计算
430
+ - 连接池优化网络请求性能
431
+ - 内存优化减少对象创建
432
+ - 统计缓存提高查询效率
433
+ - 线程本地缓存提升并发性能
434
+
435
+ ### 8. 高级功能
436
+ - 批量日志处理提高大量日志记录性能
437
+ - 上下文日志自动添加相关上下文信息
438
+ - 自适应级别根据系统状态自动调整日志级别
439
+ - 日志管理压缩、归档、清理功能
440
+ - 日志分析智能分析日志内容和趋势
441
+ - 性能监控实时监控缓存和性能指标
442
+
443
+ ### 9. 智能分析功能
444
+ - 智能日志分析自动识别错误、警告、安全事件
445
+ - 分布式日志支持多节点环境,提供唯一日志ID
446
+ - 日志安全功能敏感信息清理和加密
447
+ - 性能监控实时监控系统资源使用
448
+ - 日志聚合自动聚合重复日志
449
+ - 流处理可扩展的日志处理管道
450
+ - 数据库支持结构化日志存储和查询
451
+ - 健康检查系统状态监控
452
+ - 备份管理自动备份和恢复
453
+ - 内存优化智能垃圾回收
454
+ - 智能路由基于条件的日志分发
455
+ - 日志归档自动压缩和归档
456
+
457
+ ## 错误处理
458
+
459
+ ```python
460
+ try:
461
+ logger = XmiLogger("app", log_dir="/path/to/logs")
462
+ except RuntimeError as e:
463
+ print(f"日志配置失败: {e}")
464
+ ```
465
+
466
+ ## 注意事项
467
+
468
+ 1. 确保日志目录具有写入权限
469
+ 2. 远程日志URL必须是有效的HTTP(S)地址
470
+ 3. 建议在生产环境中启用统计功能
471
+ 4. 异步操作时注意正确处理异常
472
+
473
+ ## 贡献
474
+
475
+ 欢迎提交 Issue 和 Pull Request!
476
+
477
+ ## 许可证
478
+
479
+ MIT License
480
+