pythonLogs 5.0.2__cp313-cp313-macosx_15_0_arm64.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.
@@ -0,0 +1,578 @@
1
+ Metadata-Version: 2.4
2
+ Name: pythonLogs
3
+ Version: 5.0.2
4
+ Summary: High-performance Python logging library with file rotation and optimized caching for better performance
5
+ License: MIT
6
+ License-File: LICENSE
7
+ Keywords: python3,python-3,python,log,logging,logger,logutils,log-utils,pythonLogs
8
+ Author: Daniel Costa
9
+ Author-email: danieldcsta@gmail.com
10
+ Maintainer: Daniel Costa
11
+ Requires-Python: >=3.12,<4.0
12
+ Classifier: Development Status :: 5 - Production/Stable
13
+ Classifier: Environment :: Other Environment
14
+ Classifier: Intended Audience :: Developers
15
+ Classifier: License :: OSI Approved :: MIT License
16
+ Classifier: Natural Language :: English
17
+ Classifier: Operating System :: OS Independent
18
+ Classifier: Programming Language :: Python :: 3
19
+ Classifier: Programming Language :: Python :: 3.12
20
+ Classifier: Programming Language :: Python :: 3.13
21
+ Classifier: Programming Language :: Python :: 3.14
22
+ Classifier: Programming Language :: Python :: 3 :: Only
23
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
24
+ Requires-Dist: pydantic-settings (==2.11.0)
25
+ Requires-Dist: python-dotenv (>=1.1.1,<2.0.0)
26
+ Project-URL: Homepage, https://pypi.org/project/pythonLogs
27
+ Project-URL: Repository, https://github.com/ddc/pythonLogs
28
+ Description-Content-Type: text/markdown
29
+
30
+ # High-performance Python logging library
31
+
32
+ [![Donate](https://img.shields.io/badge/Donate-PayPal-brightgreen.svg?style=plastic)](https://www.paypal.com/ncp/payment/6G9Z78QHUD4RJ)
33
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
34
+ [![PyPi](https://img.shields.io/pypi/v/pythonLogs.svg)](https://pypi.python.org/pypi/pythonLogs)
35
+ [![PyPI Downloads](https://static.pepy.tech/badge/pythonLogs)](https://pepy.tech/projects/pythonLogs)
36
+ [![codecov](https://codecov.io/gh/ddc/pythonLogs/graph/badge.svg?token=QsjwsmYzgD)](https://codecov.io/gh/ddc/pythonLogs)
37
+ [![CI/CD Pipeline](https://github.com/ddc/pythonLogs/actions/workflows/workflow.yml/badge.svg)](https://github.com/ddc/pythonLogs/actions/workflows/workflow.yml)
38
+ [![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=ddc_pythonLogs&metric=alert_status)](https://sonarcloud.io/dashboard?id=ddc_pythonLogs)
39
+ [![Build Status](https://img.shields.io/endpoint.svg?url=https%3A//actions-badge.atrox.dev/ddc/pythonLogs/badge?ref=main&label=build&logo=none)](https://actions-badge.atrox.dev/ddc/pythonLogs/goto?ref=main)
40
+ [![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)
41
+ [![Python](https://img.shields.io/pypi/pyversions/pythonLogs.svg)](https://www.python.org/downloads)
42
+
43
+ [![Support me on GitHub](https://img.shields.io/badge/Support_me_on_GitHub-154c79?style=for-the-badge&logo=github)](https://github.com/sponsors/ddc)
44
+
45
+ High-performance Python logging library with file rotation and optimized caching for better performance
46
+
47
+
48
+ ## Table of Contents
49
+
50
+ - [Features](#features)
51
+ - [Installation](#installation)
52
+ - [Logger Types](#logger-types)
53
+ - [Basic Logger](#basic-logger)
54
+ - [Size Rotating Logger](#size-rotating-logger)
55
+ - [Timed Rotating Logger](#timed-rotating-logger)
56
+ - [Context Manager Support](#context-manager-support)
57
+ - [Advanced Factory Features](#advanced-factory-features)
58
+ - [Environment Variables](#env-variables-optional--production)
59
+ - [Memory Management](#memory-management)
60
+ - [Flexible Configuration Options](#flexible-configuration-options)
61
+ - [Migration Guide](#migration-guide)
62
+ - [Development](#development)
63
+ - [Development](#development)
64
+ - [Building from Source](#building-from-source)
65
+ - [Running Tests](#running-tests)
66
+ - [License](#license)
67
+ - [Support](#support)
68
+
69
+
70
+
71
+ # Features
72
+
73
+ โœจ **Factory Pattern** - Easy logger creation with centralized configuration
74
+ ๐Ÿš€ **High Performance** - Optimized caching for 90%+ performance improvements
75
+ ๐Ÿ”„ **File Rotation** - Automatic rotation by size or time with compression
76
+ ๐ŸŽฏ **Type Safety** - Enum-based configuration with IDE support
77
+ โš™๏ธ **Flexible Configuration** - Environment variables, direct parameters, or defaults
78
+ ๐Ÿ“ **Location Tracking** - Optional filename and line number in logs
79
+ ๐ŸŒ **Timezone Support** - Full timezone handling including `localtime` and `UTC`
80
+ ๐Ÿ’พ **Memory Efficient** - Logger registry and settings caching
81
+ ๐Ÿ”’ **Context Manager Support** - Automatic resource cleanup and exception safety
82
+ ๐Ÿงต **Thread Safe** - Concurrent access protection for all operations
83
+ ๐Ÿ”ง **Resource Management** - Automatic handler cleanup and memory leak prevention
84
+
85
+
86
+ # Installation
87
+ ```shell
88
+ pip install pythonLogs
89
+ ```
90
+
91
+
92
+ # Logger Types
93
+
94
+ ## Basic Logger
95
+ Console-only logging without file output. Perfect for development and simple applications.
96
+
97
+ ### Using Factory Pattern (Recommended)
98
+ ```python
99
+ from pythonLogs import basic_logger, LogLevel
100
+
101
+ # Option 1: Using string (simple) (case-insensitive)
102
+ logger = basic_logger(
103
+ name="my_app",
104
+ level="debug", # "debug", "info", "warning", "error", "critical"
105
+ timezone="America/Sao_Paulo",
106
+ showlocation=False
107
+ )
108
+ logger.warning("This is a warning example")
109
+
110
+ # Option 2: Using enum (type-safe)
111
+ logger = basic_logger(
112
+ name="my_app",
113
+ level=LogLevel.DEBUG,
114
+ timezone="America/Sao_Paulo",
115
+ showlocation=False
116
+ )
117
+ logger.warning("This is a warning example")
118
+ ```
119
+
120
+ ### Legacy Method (Still Supported)
121
+ ```python
122
+ from pythonLogs import BasicLog
123
+
124
+ logger = BasicLog(
125
+ level="debug",
126
+ name="app",
127
+ timezone="America/Sao_Paulo",
128
+ showlocation=False,
129
+ ).init()
130
+ logger.warning("This is a warning example")
131
+ ```
132
+
133
+ #### Example Output
134
+ `[2024-10-08T19:08:56.918-0300]:[WARNING]:[my_app]:This is a warning example`
135
+
136
+
137
+
138
+
139
+
140
+ ## Size Rotating Logger
141
+ File-based logging with automatic rotation when files reach a specified size. Rotated files are compressed as `.gz`.
142
+
143
+ + **Rotation**: Based on file size (`maxmbytes` parameter)
144
+ + **Naming**: Rotated logs have sequence numbers: `app.log_1.gz`, `app.log_2.gz`
145
+ + **Cleanup**: Old logs deleted based on `daystokeep` (default: 30 days)
146
+
147
+ ### Using Factory Pattern (Recommended)
148
+ ```python
149
+ from pythonLogs import size_rotating_logger, LogLevel
150
+
151
+ # Option 1: Using string (simple) (case-insensitive)
152
+ logger = size_rotating_logger(
153
+ name="my_app",
154
+ level="debug", # "debug", "info", "warning", "error", "critical"
155
+ directory="/app/logs",
156
+ filenames=["main.log", "app1.log"],
157
+ maxmbytes=5,
158
+ daystokeep=7,
159
+ timezone="America/Chicago",
160
+ streamhandler=True,
161
+ showlocation=False
162
+ )
163
+ logger.warning("This is a warning example")
164
+
165
+ # Option 2: Using enum (type-safe)
166
+ logger = size_rotating_logger(
167
+ name="my_app",
168
+ level=LogLevel.DEBUG,
169
+ directory="/app/logs",
170
+ filenames=["main.log", "app1.log"],
171
+ maxmbytes=5,
172
+ daystokeep=7,
173
+ timezone="America/Chicago",
174
+ streamhandler=True,
175
+ showlocation=False
176
+ )
177
+ logger.warning("This is a warning example")
178
+ ```
179
+
180
+ ### Legacy Method (Still Supported)
181
+ ```python
182
+ from pythonLogs import SizeRotatingLog
183
+
184
+ logger = SizeRotatingLog(
185
+ level="debug",
186
+ name="app",
187
+ directory="/app/logs",
188
+ filenames=["main.log", "app1.log"],
189
+ maxmbytes=5,
190
+ daystokeep=7,
191
+ timezone="America/Chicago",
192
+ streamhandler=True,
193
+ showlocation=False
194
+ ).init()
195
+ logger.warning("This is a warning example")
196
+ ```
197
+
198
+ #### Example Output
199
+ `[2024-10-08T19:08:56.918-0500]:[WARNING]:[my_app]:This is a warning example`
200
+
201
+
202
+
203
+
204
+
205
+ ## Timed Rotating Logger
206
+ File-based logging with automatic rotation based on time intervals. Rotated files are compressed as `.gz`.
207
+
208
+ + **Rotation**: Based on time (`when` parameter, defaults to `midnight`)
209
+ + **Naming**: Rotated logs have date suffix: `app_20240816.log.gz`
210
+ + **Cleanup**: Old logs deleted based on `daystokeep` (default: 30 days)
211
+ + **Supported Intervals**: `midnight`, `hourly`, `daily`, `W0-W6` (weekdays, 0=Monday)
212
+
213
+ ### Using Factory Pattern (Recommended)
214
+ ```python
215
+ from pythonLogs import timed_rotating_logger, LogLevel, RotateWhen
216
+
217
+ # Option 1: Using string (simple) (case-insensitive)
218
+ logger = timed_rotating_logger(
219
+ name="my_app",
220
+ level="debug", # "debug", "info", "warning", "error", "critical"
221
+ directory="/app/logs",
222
+ filenames=["main.log", "app2.log"],
223
+ when="midnight", # String when value
224
+ daystokeep=7,
225
+ timezone="UTC",
226
+ streamhandler=True,
227
+ showlocation=False
228
+ )
229
+ logger.warning("This is a warning example")
230
+
231
+ # Option 2: Using enum (type-safe)
232
+ logger = timed_rotating_logger(
233
+ name="my_app",
234
+ level=LogLevel.DEBUG, # Type-safe enum
235
+ directory="/app/logs",
236
+ filenames=["main.log", "app2.log"],
237
+ when=RotateWhen.MIDNIGHT, # Type-safe enum
238
+ daystokeep=7,
239
+ timezone="UTC",
240
+ streamhandler=True,
241
+ showlocation=False
242
+ )
243
+ logger.warning("This is a warning example")
244
+ ```
245
+
246
+ ### Legacy Method (Still Supported)
247
+ ```python
248
+ from pythonLogs import TimedRotatingLog
249
+
250
+ logger = TimedRotatingLog(
251
+ level="debug",
252
+ name="app",
253
+ directory="/app/logs",
254
+ filenames=["main.log", "app2.log"],
255
+ when="midnight",
256
+ daystokeep=7,
257
+ timezone="UTC",
258
+ streamhandler=True,
259
+ showlocation=False
260
+ ).init()
261
+ logger.warning("This is a warning example")
262
+ ```
263
+
264
+ #### Example Output
265
+ `[2024-10-08T19:08:56.918-0000]:[WARNING]:[my_app]:This is a warning example`
266
+
267
+
268
+
269
+
270
+
271
+ # Context Manager Support
272
+
273
+ Slow, but if you want immediate, deterministic cleanup for a specific scope.\
274
+ All logger types support context managers for automatic resource cleanup and exception safety:
275
+
276
+ ## Basic Usage
277
+ ```python
278
+ from pythonLogs import BasicLog, SizeRotatingLog, TimedRotatingLog, LogLevel
279
+
280
+ # Automatic cleanup with context managers
281
+ with BasicLog(name="app", level=LogLevel.INFO) as logger:
282
+ logger.info("This is automatically cleaned up")
283
+ # Handlers are automatically closed on exit
284
+
285
+ with SizeRotatingLog(name="app", directory="/logs", filenames=["app.log"]) as logger:
286
+ logger.info("File handlers cleaned up automatically")
287
+ # File handlers closed and resources freed
288
+
289
+ # Exception safety - cleanup happens even if exceptions occur
290
+ try:
291
+ with TimedRotatingLog(name="app", directory="/logs") as logger:
292
+ logger.error("Error occurred")
293
+ raise ValueError("Something went wrong")
294
+ except ValueError:
295
+ pass # Logger was still cleaned up properly
296
+ ```
297
+
298
+ ## Benefits of Context Manager Usage
299
+ - ๐Ÿ”’ **Automatic Cleanup** - Handlers are closed and removed automatically
300
+ - โšก **Exception Safety** - Resources cleaned up even when exceptions occur
301
+ - ๐Ÿ’พ **Memory Management** - Prevents memory leaks from unclosed handlers
302
+ - ๐Ÿงต **Thread Safety** - Cleanup operations are thread-safe
303
+ - ๐Ÿ”ง **No Manual Management** - No need to manually call cleanup methods
304
+
305
+ ## Factory Pattern + Context Managers
306
+ ```python
307
+ from pythonLogs import LoggerFactory, LoggerType
308
+
309
+ # Create logger through factory and use with context manager
310
+ logger_instance = LoggerFactory.get_or_create_logger(
311
+ LoggerType.SIZE_ROTATING,
312
+ name="production_app",
313
+ directory="/var/log"
314
+ )
315
+
316
+ # Use the logger instance directly
317
+ with logger_instance as logger:
318
+ logger.info("Factory created logger with automatic cleanup")
319
+ ```
320
+
321
+
322
+ # Advanced Factory Features
323
+
324
+ ## Logger Registry (Performance Optimization)
325
+ The factory pattern includes a built-in registry that caches loggers for improved performance:
326
+
327
+ ```python
328
+ from pythonLogs import get_or_create_logger, LoggerType, clear_logger_registry
329
+
330
+ # First call creates the logger
331
+ logger1 = get_or_create_logger(LoggerType.BASIC, name="cached_app")
332
+
333
+ # The Second call returns the same logger instance (90% faster)
334
+ logger2 = get_or_create_logger(LoggerType.BASIC, name="cached_app")
335
+
336
+ # Both variables point to the same logger instance
337
+ assert logger1 is logger2
338
+
339
+ # Clear registry when needed (useful for testing)
340
+ clear_logger_registry()
341
+ ```
342
+
343
+ ## Production Setup Example
344
+ ```python
345
+ from pythonLogs import size_rotating_logger, timed_rotating_logger, LogLevel, RotateWhen
346
+
347
+ # Application logger
348
+ app_logger = size_rotating_logger(
349
+ name="production_app",
350
+ directory="/var/log/myapp",
351
+ filenames=["app.log"],
352
+ maxmbytes=50, # 50MB files
353
+ daystokeep=30, # Keep 30 days
354
+ level=LogLevel.INFO,
355
+ streamhandler=True, # Also log to console
356
+ showlocation=True, # Show file:function:line
357
+ timezone="UTC"
358
+ )
359
+
360
+ # Error logger with longer retention
361
+ error_logger = size_rotating_logger(
362
+ name="production_errors",
363
+ directory="/var/log/myapp",
364
+ filenames=["errors.log"],
365
+ maxmbytes=10,
366
+ daystokeep=90, # Keep errors longer
367
+ level=LogLevel.ERROR,
368
+ streamhandler=False
369
+ )
370
+
371
+ # Audit logger with daily rotation
372
+ audit_logger = timed_rotating_logger(
373
+ name="audit_log",
374
+ directory="/var/log/myapp",
375
+ filenames=["audit.log"],
376
+ when=RotateWhen.MIDNIGHT,
377
+ level=LogLevel.INFO
378
+ )
379
+
380
+ # Use the loggers
381
+ app_logger.info("Application started")
382
+ error_logger.error("Database connection failed")
383
+ audit_logger.info("User admin logged in")
384
+ ```
385
+
386
+ ## Env Variables (Optional | Production)
387
+ The .env variables file can be used by leaving all options blank when calling the function.\
388
+ If not specified inside the .env file, it will use the dafault value.\
389
+ This is a good approach for production environments, since options can be changed easily.
390
+ ```python
391
+ from pythonLogs import timed_rotating_logger
392
+ log = timed_rotating_logger()
393
+ ```
394
+
395
+ ```
396
+ LOG_LEVEL=DEBUG
397
+ LOG_TIMEZONE=UTC
398
+ LOG_ENCODING=UTF-8
399
+ LOG_APPNAME=app
400
+ LOG_FILENAME=app.log
401
+ LOG_DIRECTORY=/app/logs
402
+ LOG_DAYS_TO_KEEP=30
403
+ LOG_DATE_FORMAT=%Y-%m-%dT%H:%M:%S
404
+ LOG_STREAM_HANDLER=True
405
+ LOG_SHOW_LOCATION=False
406
+ LOG_MAX_LOGGERS=50
407
+ LOG_LOGGER_TTL_SECONDS=1800
408
+
409
+ # SizeRotatingLog
410
+ LOG_MAX_FILE_SIZE_MB=10
411
+
412
+ # TimedRotatingLog
413
+ LOG_ROTATE_WHEN=midnight
414
+ LOG_ROTATE_AT_UTC=True
415
+ LOG_ROTATE_FILE_SUFIX="%Y%m%d"
416
+ ```
417
+
418
+
419
+ # Memory Management
420
+
421
+ The library includes comprehensive memory management features to prevent memory leaks and optimize resource usage:
422
+
423
+ ## Automatic Resource Cleanup
424
+ ```python
425
+ from pythonLogs import clear_logger_registry, shutdown_logger, LoggerFactory
426
+
427
+ # Clear the entire logger registry with proper cleanup
428
+ clear_logger_registry()
429
+
430
+ # Shutdown specific logger and remove from registry
431
+ shutdown_logger("my_app_logger")
432
+
433
+ # Manual registry management
434
+ LoggerFactory.shutdown_logger("specific_logger")
435
+ LoggerFactory.clear_registry()
436
+ ```
437
+
438
+ ## Memory Optimization Features
439
+ ```python
440
+ from pythonLogs import (
441
+ get_memory_stats,
442
+ clear_formatter_cache,
443
+ clear_directory_cache,
444
+ optimize_lru_cache_sizes,
445
+ force_garbage_collection
446
+ )
447
+
448
+ # Get current memory usage statistics
449
+ stats = get_memory_stats()
450
+ print(f"Registry size: {stats['registry_size']}")
451
+ print(f"Formatter cache: {stats['formatter_cache_size']}")
452
+ print(f"Active loggers: {stats['active_logger_count']}")
453
+
454
+ # Clear various caches to free memory
455
+ clear_formatter_cache() # Clear cached formatters
456
+ clear_directory_cache() # Clear directory permission cache
457
+
458
+ # Optimize LRU cache sizes for memory-constrained environments
459
+ optimize_lru_cache_sizes()
460
+
461
+ # Force garbage collection and get collection statistics
462
+ gc_stats = force_garbage_collection()
463
+ print(f"Objects collected: {gc_stats['objects_collected']}")
464
+ ```
465
+
466
+ ## Registry Configuration
467
+ ```python
468
+ from pythonLogs import LoggerFactory
469
+
470
+ # Configure registry limits for memory management
471
+ LoggerFactory.set_memory_limits(
472
+ max_loggers=50, # Maximum cached loggers
473
+ ttl_seconds=1800 # Logger time-to-live (30 minutes)
474
+ )
475
+
476
+ # Monitor registered loggers
477
+ registered = LoggerFactory.get_registered_loggers()
478
+ print(f"Currently registered: {list(registered.keys())}")
479
+ ```
480
+
481
+ # Flexible Configuration Options
482
+ You can use either enums (for type safety) or strings (for simplicity):
483
+
484
+ ```python
485
+ from pythonLogs import LogLevel, RotateWhen, LoggerType
486
+
487
+ # Option 1: Type-safe enums (recommended)
488
+ LogLevel.DEBUG # "DEBUG"
489
+ LogLevel.INFO # "INFO"
490
+ LogLevel.WARNING # "WARNING"
491
+ LogLevel.ERROR # "ERROR"
492
+ LogLevel.CRITICAL # "CRITICAL"
493
+
494
+ # Option 2: String values (case-insensitive)
495
+ "debug" # Same as LogLevel.DEBUG
496
+ "info" # Same as LogLevel.INFO
497
+ "warning" # Same as LogLevel.WARNING
498
+ "warn" # Same as LogLevel.WARN (alias)
499
+ "error" # Same as LogLevel.ERROR
500
+ "critical" # Same as LogLevel.CRITICAL
501
+ "crit" # Same as LogLevel.CRIT (alias)
502
+ # Also supports: "DEBUG", "Info", "Warning", etc.
503
+
504
+ # RotateWhen values
505
+ RotateWhen.MIDNIGHT # "midnight"
506
+ RotateWhen.HOURLY # "H"
507
+ RotateWhen.DAILY # "D"
508
+ RotateWhen.MONDAY # "W0"
509
+ # ... through SUNDAY # "W6"
510
+ # String equivalents: "midnight", "H", "D", "W0"-"W6"
511
+
512
+ # LoggerType values
513
+ LoggerType.BASIC # "basic"
514
+ LoggerType.SIZE_ROTATING # "size_rotating"
515
+ LoggerType.TIMED_ROTATING # "timed_rotating"
516
+ # String equivalents: "basic", "size_rotating", "timed_rotating"
517
+ ```
518
+
519
+
520
+ # Migration Guide
521
+
522
+ ## Upgrading from Legacy to Factory Pattern
523
+
524
+ The factory pattern is **100% backward compatible**. Your existing code will continue to work unchanged.
525
+
526
+ ### Before (Legacy - Still Works)
527
+ ```python
528
+ from pythonLogs import BasicLog, SizeRotatingLog, TimedRotatingLog
529
+
530
+ # Old way
531
+ basic_logger = BasicLog(level="info", name="app").init()
532
+ size_logger = SizeRotatingLog(level="debug", name="app", directory="/logs").init()
533
+ timed_logger = TimedRotatingLog(level="warning", name="app", directory="/logs").init()
534
+ ```
535
+
536
+ ### After (Factory Pattern - Recommended)
537
+ ```python
538
+ from pythonLogs import basic_logger, size_rotating_logger, timed_rotating_logger, LogLevel
539
+
540
+ # New way - cleaner and faster
541
+ basic_logger = basic_logger(level=LogLevel.INFO, name="app")
542
+ size_logger = size_rotating_logger(level=LogLevel.DEBUG, name="app", directory="/logs")
543
+ timed_logger = timed_rotating_logger(level=LogLevel.WARNING, name="app", directory="/logs")
544
+ ```
545
+
546
+ ### Benefits of Migration
547
+ - ๐Ÿš€ **90% faster logger creation** with registry caching
548
+ - ๐ŸŽฏ **Type safety** with enum-based parameters
549
+ - ๐Ÿ’ก **Better IDE support** with autocomplete and validation
550
+ - ๐Ÿ”ง **Cleaner API** without manual `.init()` calls
551
+ - ๐Ÿ“š **Centralized configuration** through factory pattern
552
+
553
+
554
+ # Development
555
+
556
+ ### Building from Source
557
+ ```shell
558
+ poetry build -f wheel
559
+ ```
560
+
561
+ ### Running Tests
562
+ ```shell
563
+ poetry update --with test
564
+ poe tests
565
+ ```
566
+
567
+ # License
568
+
569
+ Released under the [MIT License](LICENSE)
570
+
571
+ # Support
572
+
573
+ If you find this project helpful, consider supporting development:
574
+
575
+ - [GitHub Sponsor](https://github.com/sponsors/ddc)
576
+ - [ko-fi](https://ko-fi.com/ddcsta)
577
+ - [PayPal](https://www.paypal.com/ncp/payment/6G9Z78QHUD4RJ)
578
+
@@ -0,0 +1,15 @@
1
+ pythonLogs/.env.example,sha256=L4ndSpalHvFB9XIB1h4fvwUHzFs0KJvWNivGFy0_p5c,979
2
+ pythonLogs/__init__.py,sha256=YickWV4VtG7_BFUTp2Qsd-m3m0xoV5prjBfx-drV-Qs,2333
3
+ pythonLogs/basic_log.py,sha256=GK9q-SaYjr_4tWSsJYy1U9DD2sR7ZqTpVDU9P-PIJFw,2635
4
+ pythonLogs/constants.py,sha256=W-8QBuSI7YT82A6kJNbxMH-UtI-4YaQfK1Gdnb54ooc,1235
5
+ pythonLogs/factory.py,sha256=EfjPWjGTNntjeMu6bEUlF92PxfT-PA8ETWizGN9tJfE,16871
6
+ pythonLogs/log_utils.py,sha256=-UuCgtbl5tni8w6GtsD9C8Ljh4v2Tz3ZyP1VJsrnCZQ,12185
7
+ pythonLogs/memory_utils.py,sha256=vfmJekCKMsVghSL9CfrQ2GQMlNmURJoqRxD6uZ13C2Q,5807
8
+ pythonLogs/settings.py,sha256=T1iDJ5b0Ty11C49FIMJ6GTAx8rBfE39bk9TlGT6TG5I,1942
9
+ pythonLogs/size_rotating.py,sha256=rpc3_9vO3KiifMp3tFEDyR5b2wPFRVuH8xniQY8TJmc,5262
10
+ pythonLogs/thread_safety.py,sha256=GABu-QVMdQN4fo3cMUPae9SqSekG-q4vBNYY-QEHLoE,5188
11
+ pythonLogs/timed_rotating.py,sha256=Avsf0qWYAbzNSp3YOxcYsjDpBFPdK_S0HyXqfLtl6eM,4736
12
+ pythonlogs-5.0.2.dist-info/METADATA,sha256=XJT_9eNquZlx1cBysT9pPVmcoJxxAXJuP6cUYjiWB0w,18248
13
+ pythonlogs-5.0.2.dist-info/WHEEL,sha256=zAX1CaLSOcDoJzhLeY1lLG38y_2_26FKYzJHTVdnMgY,106
14
+ pythonlogs-5.0.2.dist-info/licenses/LICENSE,sha256=3fEBeO1ARuqTVV1QJzrGVVmXZz_okGweH0a-MeA0Qpc,1068
15
+ pythonlogs-5.0.2.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: poetry-core 2.2.1
3
+ Root-Is-Purelib: false
4
+ Tag: cp313-cp313-macosx_15_0_arm64
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2024-present ddc
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.