<div align="center">
<img src="https://github.com/user-attachments/assets/565fc3dc-dd2c-47a6-bab6-2f545c551f26" alt="logly logo" width="400" />
<a href="https://pypi.org/project/logly/"><img src="https://img.shields.io/pypi/v/logly" alt="PyPI"></a>
<a href="https://pypistats.org/packages/logly"><img src="https://img.shields.io/pypi/dm/logly" alt="PyPI - Downloads"></a>
<a href="https://muhammad-fiaz.github.io/logly/"><img src="https://img.shields.io/badge/docs-muhammad--fiaz.github.io-blue" alt="Documentation"></a>
<a href="https://www.python.org/"><img src="https://img.shields.io/badge/python-%3E%3D3.10-brightgreen.svg" alt="Supported Python"></a>
<a href="https://github.com/muhammad-fiaz/logly"><img src="https://img.shields.io/github/stars/muhammad-fiaz/logly" alt="GitHub stars"></a>
<a href="https://github.com/muhammad-fiaz/logly/issues"><img src="https://img.shields.io/github/issues/muhammad-fiaz/logly" alt="GitHub issues"></a>
<a href="https://github.com/muhammad-fiaz/logly/pulls"><img src="https://img.shields.io/github/issues-pr/muhammad-fiaz/logly" alt="GitHub pull requests"></a>
<a href="https://github.com/muhammad-fiaz/logly"><img src="https://img.shields.io/github/last-commit/muhammad-fiaz/logly" alt="GitHub last commit"></a>
<a href="https://github.com/muhammad-fiaz/logly/releases"><img src="https://img.shields.io/github/v/release/muhammad-fiaz/logly" alt="GitHub release"></a>
<a href="https://codecov.io/gh/muhammad-fiaz/logly"><img src="https://codecov.io/gh/muhammad-fiaz/logly/graph/badge.svg?token=1G3MU8SDX1" alt="codecov"></a>
<a href="https://github.com/muhammad-fiaz/logly"><img src="https://img.shields.io/github/license/muhammad-fiaz/logly" alt="License"></a>
<a href="https://github.com/muhammad-fiaz/logly/actions/workflows/docs.yml"><img src="https://github.com/muhammad-fiaz/logly/actions/workflows/docs.yml/badge.svg" alt="Deploy Documentation"></a>
<a href="https://github.com/muhammad-fiaz/logly/actions/workflows/python_publish.yaml"><img src="https://github.com/muhammad-fiaz/logly/actions/workflows/python_publish.yaml/badge.svg" alt="Publish Python distributions"></a>
<a href="https://github.com/muhammad-fiaz/logly/actions/workflows/testing.yml"><img src="https://github.com/muhammad-fiaz/logly/actions/workflows/testing.yml/badge.svg" alt="Testing"></a>
<a href="https://github.com/muhammad-fiaz/logly/actions/workflows/github-code-scanning/codeql"><img src="https://github.com/muhammad-fiaz/logly/actions/workflows/github-code-scanning/codeql/badge.svg" alt="CodeQL"></a>
<a href="https://github.com/muhammad-fiaz/logly/actions/workflows/dependabot/dependabot-updates"><img src="https://github.com/muhammad-fiaz/logly/actions/workflows/dependabot/dependabot-updates/badge.svg" alt="Dependabot Updates"></a>
<a href="https://github.com/muhammad-fiaz/logly/actions/workflows/python-package.yaml"><img src="https://github.com/muhammad-fiaz/logly/actions/workflows/python-package.yaml/badge.svg" alt="Run Tests"></a>
<p><em>Rust-powered, Loguru-like logging for Python.</em></p>
**📚 [Documentation](https://muhammad-fiaz.github.io/logly/) | [API Reference](https://muhammad-fiaz.github.io/logly/api-reference/) | [Quick Start](https://muhammad-fiaz.github.io/logly/quickstart/)**
</div>
---
## Overview
**Logly** is a high-performance logging library for Python, powered by Rust. It combines the familiar Loguru-like API with the performance and safety guarantees of Rust.
Built with a modular Rust backend using PyO3/Maturin, Logly provides fast logging while maintaining memory safety and thread safety through Rust's ownership system.
**If you like Logly, please give it a star ⭐ on GitHub! It really helps!**
> ⚠️ **Active Development**: Logly is a newer project and actively developed. Performance continues to improve with each release. also if you find a bug or a missing feature, please report it on GitHub. and Logly is not Production Ready yet :)
> 📍 NOTE: The Main Branch Contains the latest features and improvements for upcoming releases. For stable production use, consider using the latest tagged release. because you may find an non existing feature or a bug in older releases.
> 📝 **Note on Loguru**: Logly is not the same as Loguru. Logly is only inspired by Loguru's design, but all features and functionality are completely different. Logly is built with Rust for performance and safety, while Loguru is a pure Python library.
### 🎯 Why Logly?
Logly offers a comprehensive set of logging features designed for modern Python applications:
### 🚀 Core Features
- **Rust-Powered Backend**: High-performance logging engine built with Rust, providing exceptional speed and memory efficiency
- **Memory Safety**: Zero-cost abstractions with Rust's ownership system prevent data races and memory corruption
- **Thread Safety**: Lock-free operations with optimized synchronization for concurrent applications
- **Zero-Configuration Setup**: Start logging immediately with sensible defaults - no configuration required
### 📝 Logging Capabilities
- **Multiple Log Levels**: Support for TRACE, DEBUG, INFO, SUCCESS, WARNING, ERROR, FAIL, and CRITICAL levels
- **Structured Logging**: Native JSON output with custom fields and metadata
- **Context Binding**: Attach persistent context to loggers for request tracking and correlation
- **Exception Handling**: Automatic exception logging with stack traces and context
### 🎯 Output Management
- **Multi-Sink Support**: Route logs to multiple destinations (console, files, custom handlers) simultaneously
- **Per-Sink Filtering**: Independent filtering and formatting for each output destination
- **Auto-Sink Levels**: Automatic file creation and management for different log levels
- **Console Control**: Fine-grained control over console output, colors, and timestamps per log level
### 🔧 File Management
- **Smart Rotation**: Time-based (daily/hourly/minutely) and size-based log rotation
- **Compression**: Built-in gzip and zstd compression for rotated log files
- **Retention Policies**: Configurable retention periods and file count limits
- **Async Writing**: Background thread writing for non-blocking file operations
### 🔍 Advanced Filtering
- **Level-Based Filtering**: Filter logs by minimum severity level (threshold-based)
- **Module Filtering**: Include/exclude logs from specific Python modules
- **Function Filtering**: Target logs from specific functions or methods
- **Custom Filters**: Implement custom filtering logic with callback functions
### 📞 Callbacks & Extensions
- **Async Callbacks**: Real-time log processing with background execution
- **Custom Formatting**: Flexible template-based formatting with custom fields
- **Color Styling**: Rich color support for console output and callback processing
- **Extensibility**: Plugin architecture for custom sinks and processors and more...
---
## Installation
### From PyPI (Recommended)
```bash
pip install logly
```
### From Source (Development)
Requires: Python 3.10+, Rust 1.70+, Maturin
```bash
git clone https://github.com/muhammad-fiaz/logly.git
cd logly
pip install maturin
maturin develop # Development build
```
For detailed installation instructions, see the [Installation Guide](https://muhammad-fiaz.github.io/logly/installation/).
---
## Platform Support
Logly supports Python 3.10+ and is available for multiple platforms. The minimum required version is **0.1.4+**.
| Python Version | Windows | macOS | Linux |
|----------------|---------|-------|-------|
| 3.10 | ✅ | ✅ | ✅ |
| 3.11 | ✅ | ✅ | ✅ |
| 3.12 | ✅ | ✅ | ✅ |
| 3.13 | ✅ | ✅ | ✅ |
**Notes:**
- All major Linux distributions are supported
- Both Intel and Apple Silicon macOS are supported
- Windows 10 and later versions are supported
- Pre-built wheels are available for all platforms ([view on PyPI](https://pypi.org/project/logly/#files))
---
## Quick Start
**NEW in v0.1.5:** Start logging immediately - no configuration needed!
```python
from logly import logger
# That's it! Start logging immediately
logger.info("Hello, Logly!") # ✅ Works right away
logger.warning("Super simple!") # ⚠️ No configure() needed
logger.error("Just import and log!") # ❌ Auto-configured on import
# Logs appear automatically because:
# - Auto-configure runs when you import logger
# - Console sink is created automatically (auto_sink=True)
# - Logging is enabled globally (console=True)
```
### Advanced Usage
```python
from logly import logger
# Optional: Customize configuration
logger.configure(
level="DEBUG", # Set minimum log level
color=True, # Enable colored output
console=True, # Enable console output (default: True)
auto_sink=True # Auto-create console sink (default: True)
)
# Add file output with rotation
logger.add(
"logs/app.log",
rotation="daily", # Rotate daily
retention=7, # Keep 7 days
date_enabled=True, # Add date to filename
async_write=True # Async writing for performance
)
# **NEW in v0.1.5:** Auto-Sink Levels - Automatic file management
logger.configure(
level="DEBUG",
color=True,
auto_sink=True, # Console output
auto_sink_levels={
"DEBUG": "logs/debug.log", # All logs (DEBUG and above)
"INFO": "logs/info.log", # INFO and above
"ERROR": "logs/error.log", # ERROR and above
}
)
# ✅ Three files created automatically with level filtering!
# Configure global settings
logger.configure(
level="INFO",
color=True,
show_time=True,
json=False
)
# Basic logging
logger.info("Application started", version="1.0.0")
logger.success("Deployment successful 🚀", region="us-west")
logger.warning("High memory usage", usage_percent=85)
logger.error("Database connection failed", retry_count=3)
# Structured logging with context
request_logger = logger.bind(request_id="r-123", user="alice")
request_logger.info("Processing request")
# Context manager for temporary context
with logger.contextualize(step=1):
logger.debug("Processing step 1")
# Exception logging
@logger.catch(reraise=False)
def may_fail():
return 1 / 0
# Async callbacks for real-time processing
def alert_on_error(record):
if record["level"] == "ERROR":
send_alert(record["message"])
callback_id = logger.add_callback(alert_on_error)
# Ensure all logs are written before exit
logger.complete()
```
---
## Advanced Features
### 1. File Rotation & Retention
```python
# Time-based rotation
logger.add("logs/app.log", rotation="daily", retention=30) # Keep 30 days
logger.add("logs/app.log", rotation="hourly", retention=24) # Keep 24 hours
# Size-based rotation
logger.add("logs/app.log", size_limit="10MB", retention=5) # Keep 5 files
logger.add("logs/app.log", size_limit="100MB", retention=10)
# Combined rotation
logger.add("logs/app.log", rotation="daily", size_limit="50MB", retention=7)
```
### 2. Per-Sink Filtering
```python
# Level-based filtering
logger.add("logs/debug.log", filter_min_level="DEBUG")
logger.add("logs/errors.log", filter_min_level="ERROR")
# Module-based filtering
logger.add("logs/database.log", filter_module="myapp.database")
logger.add("logs/api.log", filter_module="myapp.api")
# Function-based filtering
logger.add("logs/auth.log", filter_function="authenticate")
```
### 3. Structured JSON Logging
```python
# Enable JSON output
logger.configure(json=True)
# Pretty JSON for development
logger.configure(json=True, pretty_json=True)
# Log structured data
logger.info("User login", user_id=123, ip="192.168.1.1", success=True)
# Output: {"timestamp":"2025-10-02T12:00:00Z","level":"INFO","message":"User login","fields":{"user_id":123,"ip":"192.168.1.1","success":true}}
```
### 4. Async Callbacks
```python
# Register callback for real-time processing
def send_to_monitoring(record):
if record["level"] in ["ERROR", "CRITICAL"]:
monitoring_service.send_alert(record)
callback_id = logger.add_callback(send_to_monitoring)
# Callbacks execute in background threads (zero blocking)
logger.error("Critical system failure", service="database")
# Remove callback when done
logger.remove_callback(callback_id)
```
### 5. Per-Level Control
```python
# Control console output per level
logger.configure(
console_levels={"DEBUG": False, "INFO": True, "ERROR": True}
)
# Control timestamps per level
logger.configure(
show_time=False,
time_levels={"ERROR": True} # Only show time for errors
)
# Control colors per level
logger.configure(
color_levels={"INFO": False, "ERROR": True}
)
# Control file storage per level
logger.configure(
storage_levels={"DEBUG": False} # Don't write DEBUG to files
)
```
### 6. Custom Formatting
```python
# Simple format
logger.add("console", format="{time} [{level}] {message}")
# Detailed format
logger.add(
"logs/detailed.log",
format="{time} | {level:8} | {module}:{function} | {message} | {extra}"
)
# JSON-like format
logger.add(
"logs/json-like.log",
format='{{"timestamp": "{time}", "level": "{level}", "msg": "{message}"}}'
)
```
For complete feature documentation, see the [API Reference](https://muhammad-fiaz.github.io/logly/api-reference/).
---
## Testing & Quality
Logly maintains **96%+ code coverage** with comprehensive testing:
```bash
# Run tests
pytest
# With coverage
pytest --cov=logly --cov-report=term-missing
# Code quality (10.00/10 score)
pylint logly/
```
For development guidelines, see the [Development Guide](https://muhammad-fiaz.github.io/logly/guides/development/).
---
## Documentation
Complete documentation is available at [muhammad-fiaz.github.io/logly](https://muhammad-fiaz.github.io/logly/):
- 📖 [Getting Started Guide](https://muhammad-fiaz.github.io/logly/guides/getting-started/)
- 📚 [API Reference](https://muhammad-fiaz.github.io/logly/api-reference/)
- 🔧 [Configuration Guide](https://muhammad-fiaz.github.io/logly/guides/configuration/)
- 🚀 [Production Deployment](https://muhammad-fiaz.github.io/logly/guides/production-deployment/)
- 💡 [Examples](https://muhammad-fiaz.github.io/logly/examples/)
---
## Contributing
Contributions are welcome! Please see our [Contributing Guidelines](CONTRIBUTING.md) and [Code of Conduct](CODE_OF_CONDUCT.md).
### Want to contribute?
1. Fork the repository
2. Create a feature branch (`git checkout -b feature/amazing-feature`)
3. Commit your changes (`git commit -m 'Add amazing feature'`)
4. Push to the branch (`git push origin feature/amazing-feature`)
5. Open a Pull Request
A big thank you to all contributors! 💖
[](https://github.com/muhammad-fiaz/logly/graphs/contributors)
---
## Changelog
See the [GitHub Releases](https://github.com/muhammad-fiaz/logly/releases) page for detailed release notes.
---
## Acknowledgements
Special thanks to:
- **Loguru**: For inspiring the API design
- **tracing**: The Rust logging framework powering the backend
- **PyO3**: For seamless Python-Rust integration
- **Maturin**: For simplifying the build process
- **All contributors**: For valuable feedback and contributions
---
## License
This project is licensed under the MIT License. See the [LICENSE](LICENSE) file for details.
---
<div align="center">
[](https://github.com/muhammad-fiaz/logly/)
**⭐ Star the repository if you find Logly useful!**
</div>
Raw data
{
"_id": null,
"home_page": null,
"name": "logly",
"maintainer": null,
"docs_url": null,
"requires_python": "<3.14,>=3.10",
"maintainer_email": "muhammad-fiaz <contact@muhammadfiaz.com>",
"keywords": "logging, rust, pyo3, tracing, structured-logging, logly, performance",
"author": null,
"author_email": "muhammad-fiaz <contact@muhammadfiaz.com>",
"download_url": "https://files.pythonhosted.org/packages/a3/67/66c7e1a5e6df70f80610656f72a510e053ecad693a12020b2046c4ea3bc4/logly-0.1.5.tar.gz",
"platform": null,
"description": "\ufeff<div align=\"center\">\n<img src=\"https://github.com/user-attachments/assets/565fc3dc-dd2c-47a6-bab6-2f545c551f26\" alt=\"logly logo\" width=\"400\" />\n\n<a href=\"https://pypi.org/project/logly/\"><img src=\"https://img.shields.io/pypi/v/logly\" alt=\"PyPI\"></a>\n<a href=\"https://pypistats.org/packages/logly\"><img src=\"https://img.shields.io/pypi/dm/logly\" alt=\"PyPI - Downloads\"></a>\n<a href=\"https://muhammad-fiaz.github.io/logly/\"><img src=\"https://img.shields.io/badge/docs-muhammad--fiaz.github.io-blue\" alt=\"Documentation\"></a>\n<a href=\"https://www.python.org/\"><img src=\"https://img.shields.io/badge/python-%3E%3D3.10-brightgreen.svg\" alt=\"Supported Python\"></a>\n<a href=\"https://github.com/muhammad-fiaz/logly\"><img src=\"https://img.shields.io/github/stars/muhammad-fiaz/logly\" alt=\"GitHub stars\"></a>\n<a href=\"https://github.com/muhammad-fiaz/logly/issues\"><img src=\"https://img.shields.io/github/issues/muhammad-fiaz/logly\" alt=\"GitHub issues\"></a>\n<a href=\"https://github.com/muhammad-fiaz/logly/pulls\"><img src=\"https://img.shields.io/github/issues-pr/muhammad-fiaz/logly\" alt=\"GitHub pull requests\"></a>\n<a href=\"https://github.com/muhammad-fiaz/logly\"><img src=\"https://img.shields.io/github/last-commit/muhammad-fiaz/logly\" alt=\"GitHub last commit\"></a>\n<a href=\"https://github.com/muhammad-fiaz/logly/releases\"><img src=\"https://img.shields.io/github/v/release/muhammad-fiaz/logly\" alt=\"GitHub release\"></a>\n<a href=\"https://codecov.io/gh/muhammad-fiaz/logly\"><img src=\"https://codecov.io/gh/muhammad-fiaz/logly/graph/badge.svg?token=1G3MU8SDX1\" alt=\"codecov\"></a>\n<a href=\"https://github.com/muhammad-fiaz/logly\"><img src=\"https://img.shields.io/github/license/muhammad-fiaz/logly\" alt=\"License\"></a>\n<a href=\"https://github.com/muhammad-fiaz/logly/actions/workflows/docs.yml\"><img src=\"https://github.com/muhammad-fiaz/logly/actions/workflows/docs.yml/badge.svg\" alt=\"Deploy Documentation\"></a>\n<a href=\"https://github.com/muhammad-fiaz/logly/actions/workflows/python_publish.yaml\"><img src=\"https://github.com/muhammad-fiaz/logly/actions/workflows/python_publish.yaml/badge.svg\" alt=\"Publish Python distributions\"></a>\n<a href=\"https://github.com/muhammad-fiaz/logly/actions/workflows/testing.yml\"><img src=\"https://github.com/muhammad-fiaz/logly/actions/workflows/testing.yml/badge.svg\" alt=\"Testing\"></a>\n<a href=\"https://github.com/muhammad-fiaz/logly/actions/workflows/github-code-scanning/codeql\"><img src=\"https://github.com/muhammad-fiaz/logly/actions/workflows/github-code-scanning/codeql/badge.svg\" alt=\"CodeQL\"></a>\n<a href=\"https://github.com/muhammad-fiaz/logly/actions/workflows/dependabot/dependabot-updates\"><img src=\"https://github.com/muhammad-fiaz/logly/actions/workflows/dependabot/dependabot-updates/badge.svg\" alt=\"Dependabot Updates\"></a>\n<a href=\"https://github.com/muhammad-fiaz/logly/actions/workflows/python-package.yaml\"><img src=\"https://github.com/muhammad-fiaz/logly/actions/workflows/python-package.yaml/badge.svg\" alt=\"Run Tests\"></a>\n\n<p><em>Rust-powered, Loguru-like logging for Python.</em></p>\n\n**\ud83d\udcda [Documentation](https://muhammad-fiaz.github.io/logly/) | [API Reference](https://muhammad-fiaz.github.io/logly/api-reference/) | [Quick Start](https://muhammad-fiaz.github.io/logly/quickstart/)**\n\n</div>\n\n---\n\n## Overview\n\n**Logly** is a high-performance logging library for Python, powered by Rust. It combines the familiar Loguru-like API with the performance and safety guarantees of Rust.\n\nBuilt with a modular Rust backend using PyO3/Maturin, Logly provides fast logging while maintaining memory safety and thread safety through Rust's ownership system.\n\n**If you like Logly, please give it a star \u2b50 on GitHub! It really helps!**\n\n> \u26a0\ufe0f **Active Development**: Logly is a newer project and actively developed. Performance continues to improve with each release. also if you find a bug or a missing feature, please report it on GitHub. and Logly is not Production Ready yet :)\n\n> \ud83d\udccd NOTE: The Main Branch Contains the latest features and improvements for upcoming releases. For stable production use, consider using the latest tagged release. because you may find an non existing feature or a bug in older releases.\n\n> \ud83d\udcdd **Note on Loguru**: Logly is not the same as Loguru. Logly is only inspired by Loguru's design, but all features and functionality are completely different. Logly is built with Rust for performance and safety, while Loguru is a pure Python library.\n\n### \ud83c\udfaf Why Logly?\n\n\nLogly offers a comprehensive set of logging features designed for modern Python applications:\n\n### \ud83d\ude80 Core Features\n\n- **Rust-Powered Backend**: High-performance logging engine built with Rust, providing exceptional speed and memory efficiency\n- **Memory Safety**: Zero-cost abstractions with Rust's ownership system prevent data races and memory corruption\n- **Thread Safety**: Lock-free operations with optimized synchronization for concurrent applications\n- **Zero-Configuration Setup**: Start logging immediately with sensible defaults - no configuration required\n\n### \ud83d\udcdd Logging Capabilities\n\n- **Multiple Log Levels**: Support for TRACE, DEBUG, INFO, SUCCESS, WARNING, ERROR, FAIL, and CRITICAL levels\n- **Structured Logging**: Native JSON output with custom fields and metadata\n- **Context Binding**: Attach persistent context to loggers for request tracking and correlation\n- **Exception Handling**: Automatic exception logging with stack traces and context\n\n### \ud83c\udfaf Output Management\n\n- **Multi-Sink Support**: Route logs to multiple destinations (console, files, custom handlers) simultaneously\n- **Per-Sink Filtering**: Independent filtering and formatting for each output destination\n- **Auto-Sink Levels**: Automatic file creation and management for different log levels\n- **Console Control**: Fine-grained control over console output, colors, and timestamps per log level\n\n### \ud83d\udd27 File Management\n\n- **Smart Rotation**: Time-based (daily/hourly/minutely) and size-based log rotation\n- **Compression**: Built-in gzip and zstd compression for rotated log files\n- **Retention Policies**: Configurable retention periods and file count limits\n- **Async Writing**: Background thread writing for non-blocking file operations\n\n### \ud83d\udd0d Advanced Filtering\n\n- **Level-Based Filtering**: Filter logs by minimum severity level (threshold-based)\n- **Module Filtering**: Include/exclude logs from specific Python modules\n- **Function Filtering**: Target logs from specific functions or methods\n- **Custom Filters**: Implement custom filtering logic with callback functions\n\n### \ud83d\udcde Callbacks & Extensions\n\n- **Async Callbacks**: Real-time log processing with background execution\n- **Custom Formatting**: Flexible template-based formatting with custom fields\n- **Color Styling**: Rich color support for console output and callback processing\n- **Extensibility**: Plugin architecture for custom sinks and processors and more...\n---\n\n## Installation\n\n### From PyPI (Recommended)\n\n```bash\npip install logly\n```\n\n### From Source (Development)\n\nRequires: Python 3.10+, Rust 1.70+, Maturin\n\n```bash\ngit clone https://github.com/muhammad-fiaz/logly.git\ncd logly\npip install maturin\nmaturin develop # Development build\n```\n\nFor detailed installation instructions, see the [Installation Guide](https://muhammad-fiaz.github.io/logly/installation/).\n\n---\n\n## Platform Support\n\nLogly supports Python 3.10+ and is available for multiple platforms. The minimum required version is **0.1.4+**.\n\n| Python Version | Windows | macOS | Linux |\n|----------------|---------|-------|-------|\n| 3.10 | \u2705 | \u2705 | \u2705 |\n| 3.11 | \u2705 | \u2705 | \u2705 |\n| 3.12 | \u2705 | \u2705 | \u2705 |\n| 3.13 | \u2705 | \u2705 | \u2705 |\n\n**Notes:**\n- All major Linux distributions are supported\n- Both Intel and Apple Silicon macOS are supported\n- Windows 10 and later versions are supported\n- Pre-built wheels are available for all platforms ([view on PyPI](https://pypi.org/project/logly/#files))\n\n---\n\n## Quick Start\n\n**NEW in v0.1.5:** Start logging immediately - no configuration needed!\n\n```python\nfrom logly import logger\n\n# That's it! Start logging immediately\nlogger.info(\"Hello, Logly!\") # \u2705 Works right away\nlogger.warning(\"Super simple!\") # \u26a0\ufe0f No configure() needed\nlogger.error(\"Just import and log!\") # \u274c Auto-configured on import\n\n# Logs appear automatically because:\n# - Auto-configure runs when you import logger\n# - Console sink is created automatically (auto_sink=True)\n# - Logging is enabled globally (console=True)\n```\n\n### Advanced Usage\n\n```python\nfrom logly import logger\n\n# Optional: Customize configuration\nlogger.configure(\n level=\"DEBUG\", # Set minimum log level\n color=True, # Enable colored output\n console=True, # Enable console output (default: True)\n auto_sink=True # Auto-create console sink (default: True)\n)\n\n# Add file output with rotation\nlogger.add(\n \"logs/app.log\",\n rotation=\"daily\", # Rotate daily\n retention=7, # Keep 7 days\n date_enabled=True, # Add date to filename\n async_write=True # Async writing for performance\n)\n\n# **NEW in v0.1.5:** Auto-Sink Levels - Automatic file management\nlogger.configure(\n level=\"DEBUG\",\n color=True,\n auto_sink=True, # Console output\n auto_sink_levels={\n \"DEBUG\": \"logs/debug.log\", # All logs (DEBUG and above)\n \"INFO\": \"logs/info.log\", # INFO and above\n \"ERROR\": \"logs/error.log\", # ERROR and above\n }\n)\n# \u2705 Three files created automatically with level filtering!\n\n# Configure global settings\nlogger.configure(\n level=\"INFO\",\n color=True,\n show_time=True,\n json=False\n)\n\n# Basic logging\nlogger.info(\"Application started\", version=\"1.0.0\")\nlogger.success(\"Deployment successful \ud83d\ude80\", region=\"us-west\")\nlogger.warning(\"High memory usage\", usage_percent=85)\nlogger.error(\"Database connection failed\", retry_count=3)\n\n# Structured logging with context\nrequest_logger = logger.bind(request_id=\"r-123\", user=\"alice\")\nrequest_logger.info(\"Processing request\")\n\n# Context manager for temporary context\nwith logger.contextualize(step=1):\n logger.debug(\"Processing step 1\")\n\n# Exception logging\n@logger.catch(reraise=False)\ndef may_fail():\n return 1 / 0\n\n# Async callbacks for real-time processing\ndef alert_on_error(record):\n if record[\"level\"] == \"ERROR\":\n send_alert(record[\"message\"])\n\ncallback_id = logger.add_callback(alert_on_error)\n\n# Ensure all logs are written before exit\nlogger.complete()\n```\n\n\n\n---\n\n## Advanced Features\n\n### 1. File Rotation & Retention\n\n```python\n# Time-based rotation\nlogger.add(\"logs/app.log\", rotation=\"daily\", retention=30) # Keep 30 days\nlogger.add(\"logs/app.log\", rotation=\"hourly\", retention=24) # Keep 24 hours\n\n# Size-based rotation\nlogger.add(\"logs/app.log\", size_limit=\"10MB\", retention=5) # Keep 5 files\nlogger.add(\"logs/app.log\", size_limit=\"100MB\", retention=10)\n\n# Combined rotation\nlogger.add(\"logs/app.log\", rotation=\"daily\", size_limit=\"50MB\", retention=7)\n```\n\n### 2. Per-Sink Filtering\n\n```python\n# Level-based filtering\nlogger.add(\"logs/debug.log\", filter_min_level=\"DEBUG\")\nlogger.add(\"logs/errors.log\", filter_min_level=\"ERROR\")\n\n# Module-based filtering\nlogger.add(\"logs/database.log\", filter_module=\"myapp.database\")\nlogger.add(\"logs/api.log\", filter_module=\"myapp.api\")\n\n# Function-based filtering\nlogger.add(\"logs/auth.log\", filter_function=\"authenticate\")\n```\n\n### 3. Structured JSON Logging\n\n```python\n# Enable JSON output\nlogger.configure(json=True)\n\n# Pretty JSON for development\nlogger.configure(json=True, pretty_json=True)\n\n# Log structured data\nlogger.info(\"User login\", user_id=123, ip=\"192.168.1.1\", success=True)\n# Output: {\"timestamp\":\"2025-10-02T12:00:00Z\",\"level\":\"INFO\",\"message\":\"User login\",\"fields\":{\"user_id\":123,\"ip\":\"192.168.1.1\",\"success\":true}}\n```\n\n### 4. Async Callbacks\n\n```python\n# Register callback for real-time processing\ndef send_to_monitoring(record):\n if record[\"level\"] in [\"ERROR\", \"CRITICAL\"]:\n monitoring_service.send_alert(record)\n\ncallback_id = logger.add_callback(send_to_monitoring)\n\n# Callbacks execute in background threads (zero blocking)\nlogger.error(\"Critical system failure\", service=\"database\")\n\n# Remove callback when done\nlogger.remove_callback(callback_id)\n```\n\n### 5. Per-Level Control\n\n```python\n# Control console output per level\nlogger.configure(\n console_levels={\"DEBUG\": False, \"INFO\": True, \"ERROR\": True}\n)\n\n# Control timestamps per level\nlogger.configure(\n show_time=False,\n time_levels={\"ERROR\": True} # Only show time for errors\n)\n\n# Control colors per level\nlogger.configure(\n color_levels={\"INFO\": False, \"ERROR\": True}\n)\n\n# Control file storage per level\nlogger.configure(\n storage_levels={\"DEBUG\": False} # Don't write DEBUG to files\n)\n```\n\n### 6. Custom Formatting\n\n```python\n# Simple format\nlogger.add(\"console\", format=\"{time} [{level}] {message}\")\n\n# Detailed format\nlogger.add(\n \"logs/detailed.log\",\n format=\"{time} | {level:8} | {module}:{function} | {message} | {extra}\"\n)\n\n# JSON-like format\nlogger.add(\n \"logs/json-like.log\",\n format='{{\"timestamp\": \"{time}\", \"level\": \"{level}\", \"msg\": \"{message}\"}}'\n)\n```\n\nFor complete feature documentation, see the [API Reference](https://muhammad-fiaz.github.io/logly/api-reference/).\n\n---\n\n## Testing & Quality\n\nLogly maintains **96%+ code coverage** with comprehensive testing:\n\n```bash\n# Run tests\npytest\n\n# With coverage\npytest --cov=logly --cov-report=term-missing\n\n# Code quality (10.00/10 score)\npylint logly/\n```\n\nFor development guidelines, see the [Development Guide](https://muhammad-fiaz.github.io/logly/guides/development/).\n\n---\n\n## Documentation\n\nComplete documentation is available at [muhammad-fiaz.github.io/logly](https://muhammad-fiaz.github.io/logly/):\n\n- \ud83d\udcd6 [Getting Started Guide](https://muhammad-fiaz.github.io/logly/guides/getting-started/)\n- \ud83d\udcda [API Reference](https://muhammad-fiaz.github.io/logly/api-reference/)\n- \ud83d\udd27 [Configuration Guide](https://muhammad-fiaz.github.io/logly/guides/configuration/)\n- \ud83d\ude80 [Production Deployment](https://muhammad-fiaz.github.io/logly/guides/production-deployment/)\n- \ud83d\udca1 [Examples](https://muhammad-fiaz.github.io/logly/examples/)\n\n---\n\n## Contributing\n\nContributions are welcome! Please see our [Contributing Guidelines](CONTRIBUTING.md) and [Code of Conduct](CODE_OF_CONDUCT.md).\n\n### Want to contribute?\n\n1. Fork the repository\n2. Create a feature branch (`git checkout -b feature/amazing-feature`)\n3. Commit your changes (`git commit -m 'Add amazing feature'`)\n4. Push to the branch (`git push origin feature/amazing-feature`)\n5. Open a Pull Request\n\nA big thank you to all contributors! \ud83d\udc96\n\n[](https://github.com/muhammad-fiaz/logly/graphs/contributors)\n\n---\n\n## Changelog\n\nSee the [GitHub Releases](https://github.com/muhammad-fiaz/logly/releases) page for detailed release notes.\n\n---\n\n## Acknowledgements\n\nSpecial thanks to:\n\n- **Loguru**: For inspiring the API design\n- **tracing**: The Rust logging framework powering the backend\n- **PyO3**: For seamless Python-Rust integration\n- **Maturin**: For simplifying the build process\n- **All contributors**: For valuable feedback and contributions\n\n---\n\n## License\n\nThis project is licensed under the MIT License. See the [LICENSE](LICENSE) file for details.\n\n---\n\n<div align=\"center\">\n\n[](https://github.com/muhammad-fiaz/logly/)\n\n**\u2b50 Star the repository if you find Logly useful!**\n\n</div>\n\n",
"bugtrack_url": null,
"license": null,
"summary": "A stupidly simple, yet blazingly fast and powerful logging utility for Python \u2014 powered by Rust.",
"version": "0.1.5",
"project_urls": {
"Bug Tracker": "https://github.com/muhammad-fiaz/logly/issues",
"Changelog": "https://github.com/muhammad-fiaz/logly/releases",
"Documentation": "https://github.com/muhammad-fiaz/logly#readme",
"Homepage": "https://github.com/muhammad-fiaz/logly",
"Source": "https://github.com/muhammad-fiaz/logly"
},
"split_keywords": [
"logging",
" rust",
" pyo3",
" tracing",
" structured-logging",
" logly",
" performance"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "6e10d1908c7f760dd5d7b7bba131e0e92956fff0a3b55479502768d9f6221365",
"md5": "e5bd8eaf66894aa345f65ffc69ec7735",
"sha256": "5408050882ad39e10184e107ee96c4963765278170a544ffb15d92b1ebe74872"
},
"downloads": -1,
"filename": "logly-0.1.5-cp310-cp310-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "e5bd8eaf66894aa345f65ffc69ec7735",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": "<3.14,>=3.10",
"size": 1569753,
"upload_time": "2025-10-06T14:37:20",
"upload_time_iso_8601": "2025-10-06T14:37:20.524042Z",
"url": "https://files.pythonhosted.org/packages/6e/10/d1908c7f760dd5d7b7bba131e0e92956fff0a3b55479502768d9f6221365/logly-0.1.5-cp310-cp310-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "5aff61592facf394b78a3a601d0b09c1c0cbe79cd90fc222aa3406215ee83632",
"md5": "7f06eecfbe946f8445a02107735cf086",
"sha256": "71ce17544babaf16f707f786e2370ab848821332e744a59b234b162efc45c6c2"
},
"downloads": -1,
"filename": "logly-0.1.5-cp310-cp310-manylinux_2_34_x86_64.whl",
"has_sig": false,
"md5_digest": "7f06eecfbe946f8445a02107735cf086",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": "<3.14,>=3.10",
"size": 1816791,
"upload_time": "2025-10-06T14:37:22",
"upload_time_iso_8601": "2025-10-06T14:37:22.536555Z",
"url": "https://files.pythonhosted.org/packages/5a/ff/61592facf394b78a3a601d0b09c1c0cbe79cd90fc222aa3406215ee83632/logly-0.1.5-cp310-cp310-manylinux_2_34_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "e8438044e206e78d0cd7b15d7f9394065581a6de0e566acfe63b7f47c9021545",
"md5": "a55733e94bce93b53173c96a6e50f8cc",
"sha256": "4c2f3a505be2f8ed5d3ca3a6895b2862bda2b758f7d91b76938bf8469d9294c3"
},
"downloads": -1,
"filename": "logly-0.1.5-cp310-cp310-win_amd64.whl",
"has_sig": false,
"md5_digest": "a55733e94bce93b53173c96a6e50f8cc",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": "<3.14,>=3.10",
"size": 1655707,
"upload_time": "2025-10-06T14:37:24",
"upload_time_iso_8601": "2025-10-06T14:37:24.247186Z",
"url": "https://files.pythonhosted.org/packages/e8/43/8044e206e78d0cd7b15d7f9394065581a6de0e566acfe63b7f47c9021545/logly-0.1.5-cp310-cp310-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "e133308b24676611516679ae75e86a6ebabca8151b4f467177da883ae09e8e91",
"md5": "0ca2aa90507277013c8c59199197a1e1",
"sha256": "5696e1631ab29b6938306f089650b3698b56ba6b9fb69005d16d76689bb83db9"
},
"downloads": -1,
"filename": "logly-0.1.5-cp311-cp311-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "0ca2aa90507277013c8c59199197a1e1",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": "<3.14,>=3.10",
"size": 1569599,
"upload_time": "2025-10-06T14:37:25",
"upload_time_iso_8601": "2025-10-06T14:37:25.962598Z",
"url": "https://files.pythonhosted.org/packages/e1/33/308b24676611516679ae75e86a6ebabca8151b4f467177da883ae09e8e91/logly-0.1.5-cp311-cp311-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "d071eae9976fd6a6fd4cc4bdd71879fbe02b153b279ca01c0738e2687318eba2",
"md5": "d5d370914f7fbd754cbd06d78ffd9eb4",
"sha256": "b5fc85e91fb1d48657757dd3f1fcba130fe2eb0681d10e07eab41668e4702bff"
},
"downloads": -1,
"filename": "logly-0.1.5-cp311-cp311-manylinux_2_34_x86_64.whl",
"has_sig": false,
"md5_digest": "d5d370914f7fbd754cbd06d78ffd9eb4",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": "<3.14,>=3.10",
"size": 1816355,
"upload_time": "2025-10-06T14:37:27",
"upload_time_iso_8601": "2025-10-06T14:37:27.349293Z",
"url": "https://files.pythonhosted.org/packages/d0/71/eae9976fd6a6fd4cc4bdd71879fbe02b153b279ca01c0738e2687318eba2/logly-0.1.5-cp311-cp311-manylinux_2_34_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "f6e726c53ceba8b4a7cf5cf5d70d3d62baff9e2c4cfbdf23b7f63bdf75401d25",
"md5": "bf14fde8f149da302d7843fc843469ad",
"sha256": "31a3b53e51b8f200d2d7a8735755763e3d68bfc49a3d7366d058cb3925530a3d"
},
"downloads": -1,
"filename": "logly-0.1.5-cp311-cp311-win_amd64.whl",
"has_sig": false,
"md5_digest": "bf14fde8f149da302d7843fc843469ad",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": "<3.14,>=3.10",
"size": 1655326,
"upload_time": "2025-10-06T14:37:28",
"upload_time_iso_8601": "2025-10-06T14:37:28.803139Z",
"url": "https://files.pythonhosted.org/packages/f6/e7/26c53ceba8b4a7cf5cf5d70d3d62baff9e2c4cfbdf23b7f63bdf75401d25/logly-0.1.5-cp311-cp311-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "a2436ba17fde376611f83a7de96905d79be97dca38fbc672cacf79724a311d08",
"md5": "631ad54f00bd9d1a7453844120633fe0",
"sha256": "4cf8f9d76964498ac66474f41bd7a8a0656584b65eaca2016ff1ef40d431cc33"
},
"downloads": -1,
"filename": "logly-0.1.5-cp312-cp312-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "631ad54f00bd9d1a7453844120633fe0",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": "<3.14,>=3.10",
"size": 1568829,
"upload_time": "2025-10-06T14:37:30",
"upload_time_iso_8601": "2025-10-06T14:37:30.143682Z",
"url": "https://files.pythonhosted.org/packages/a2/43/6ba17fde376611f83a7de96905d79be97dca38fbc672cacf79724a311d08/logly-0.1.5-cp312-cp312-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "7fc6bbcfeef94e6c5e308ec7943be9d636fdfb48f0edec4fb74ebf6b6c70dda0",
"md5": "f3c5bfa253914b8f1db34d2942a2096c",
"sha256": "4e826823dfe3260a0d00a6bffd41647e272f715a370815a0162f70fdee9b060a"
},
"downloads": -1,
"filename": "logly-0.1.5-cp312-cp312-manylinux_2_34_x86_64.whl",
"has_sig": false,
"md5_digest": "f3c5bfa253914b8f1db34d2942a2096c",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": "<3.14,>=3.10",
"size": 1815513,
"upload_time": "2025-10-06T14:37:31",
"upload_time_iso_8601": "2025-10-06T14:37:31.936073Z",
"url": "https://files.pythonhosted.org/packages/7f/c6/bbcfeef94e6c5e308ec7943be9d636fdfb48f0edec4fb74ebf6b6c70dda0/logly-0.1.5-cp312-cp312-manylinux_2_34_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "54bca11da8d5fcea663ecf7ccd11b35b0b572ecdeb6a51055984c49e28c5c8ba",
"md5": "ad30a6222f904e89658d826e124131be",
"sha256": "dc44026b969a8c9b0b7bda862c58da614598014d680e2b58ff3824addba6e898"
},
"downloads": -1,
"filename": "logly-0.1.5-cp312-cp312-win_amd64.whl",
"has_sig": false,
"md5_digest": "ad30a6222f904e89658d826e124131be",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": "<3.14,>=3.10",
"size": 1654639,
"upload_time": "2025-10-06T14:37:33",
"upload_time_iso_8601": "2025-10-06T14:37:33.353321Z",
"url": "https://files.pythonhosted.org/packages/54/bc/a11da8d5fcea663ecf7ccd11b35b0b572ecdeb6a51055984c49e28c5c8ba/logly-0.1.5-cp312-cp312-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "453baf5d216e7e9f76f43d5b82c290e5beca2f5393d299dc77821f2fdd1f145e",
"md5": "49612560a2c501a9b8df5fa4a9f08f65",
"sha256": "aa6dbe98f5c1177522adb433d287e4d00c3e14cf32cae2eca0c43666ca4f6b06"
},
"downloads": -1,
"filename": "logly-0.1.5-cp313-cp313-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "49612560a2c501a9b8df5fa4a9f08f65",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": "<3.14,>=3.10",
"size": 1568401,
"upload_time": "2025-10-06T14:37:34",
"upload_time_iso_8601": "2025-10-06T14:37:34.691210Z",
"url": "https://files.pythonhosted.org/packages/45/3b/af5d216e7e9f76f43d5b82c290e5beca2f5393d299dc77821f2fdd1f145e/logly-0.1.5-cp313-cp313-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "ee13b927b1cb6620ada98c0290d8b157787063157ae1a325c8f0e6a9225db513",
"md5": "c318b3dd36103dca303dce0a8908defc",
"sha256": "133f2d86ffa09a6f4f9240bca61b1476b87b04c582f27e2ceeb45a0c5fffff52"
},
"downloads": -1,
"filename": "logly-0.1.5-cp313-cp313-manylinux_2_34_x86_64.whl",
"has_sig": false,
"md5_digest": "c318b3dd36103dca303dce0a8908defc",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": "<3.14,>=3.10",
"size": 1815773,
"upload_time": "2025-10-06T14:37:36",
"upload_time_iso_8601": "2025-10-06T14:37:36.440175Z",
"url": "https://files.pythonhosted.org/packages/ee/13/b927b1cb6620ada98c0290d8b157787063157ae1a325c8f0e6a9225db513/logly-0.1.5-cp313-cp313-manylinux_2_34_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "db5a4ea782ff0bb2bdf6f0a0f80101062112d985f5a12c992e4b2cb24698eb46",
"md5": "7d6848f1a1dfb9f5af6779bc3a6587b3",
"sha256": "58ea75483c296933fac74a49097e3a3a2b38fdfa2743fd33d9ad309ea497cd92"
},
"downloads": -1,
"filename": "logly-0.1.5-cp313-cp313-win_amd64.whl",
"has_sig": false,
"md5_digest": "7d6848f1a1dfb9f5af6779bc3a6587b3",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": "<3.14,>=3.10",
"size": 1654743,
"upload_time": "2025-10-06T14:37:37",
"upload_time_iso_8601": "2025-10-06T14:37:37.875317Z",
"url": "https://files.pythonhosted.org/packages/db/5a/4ea782ff0bb2bdf6f0a0f80101062112d985f5a12c992e4b2cb24698eb46/logly-0.1.5-cp313-cp313-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "a36766c7e1a5e6df70f80610656f72a510e053ecad693a12020b2046c4ea3bc4",
"md5": "010d923c4bea1348034831c0d92e118a",
"sha256": "ea489960f0b2460d581b68a042b2482730d8dba30ee275d9a7c1f75aadb4828d"
},
"downloads": -1,
"filename": "logly-0.1.5.tar.gz",
"has_sig": false,
"md5_digest": "010d923c4bea1348034831c0d92e118a",
"packagetype": "sdist",
"python_version": "source",
"requires_python": "<3.14,>=3.10",
"size": 476625,
"upload_time": "2025-10-06T14:37:39",
"upload_time_iso_8601": "2025-10-06T14:37:39.244930Z",
"url": "https://files.pythonhosted.org/packages/a3/67/66c7e1a5e6df70f80610656f72a510e053ecad693a12020b2046c4ea3bc4/logly-0.1.5.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-10-06 14:37:39",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "muhammad-fiaz",
"github_project": "logly",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"requirements": [
{
"name": "astroid",
"specs": [
[
"==",
"3.3.11"
]
]
},
{
"name": "asttokens",
"specs": [
[
"==",
"3.0.0"
]
]
},
{
"name": "babel",
"specs": [
[
"==",
"2.17.0"
]
]
},
{
"name": "backrefs",
"specs": [
[
"==",
"5.9"
]
]
},
{
"name": "certifi",
"specs": [
[
"==",
"2025.8.3"
]
]
},
{
"name": "cfgv",
"specs": [
[
"==",
"3.4.0"
]
]
},
{
"name": "charset-normalizer",
"specs": [
[
"==",
"3.4.3"
]
]
},
{
"name": "click",
"specs": [
[
"==",
"8.3.0"
]
]
},
{
"name": "colorama",
"specs": [
[
"==",
"0.4.6"
]
]
},
{
"name": "comm",
"specs": [
[
"==",
"0.2.3"
]
]
},
{
"name": "coverage",
"specs": [
[
"==",
"7.10.7"
]
]
},
{
"name": "csscompressor",
"specs": [
[
"==",
"0.9.5"
]
]
},
{
"name": "debugpy",
"specs": [
[
"==",
"1.8.17"
]
]
},
{
"name": "decorator",
"specs": [
[
"==",
"5.2.1"
]
]
},
{
"name": "dill",
"specs": [
[
"==",
"0.4.0"
]
]
},
{
"name": "distlib",
"specs": [
[
"==",
"0.4.0"
]
]
},
{
"name": "docutils",
"specs": [
[
"==",
"0.22.2"
]
]
},
{
"name": "executing",
"specs": [
[
"==",
"2.2.1"
]
]
},
{
"name": "filelock",
"specs": [
[
"==",
"3.19.1"
]
]
},
{
"name": "ghp-import",
"specs": [
[
"==",
"2.1.0"
]
]
},
{
"name": "htmlmin2",
"specs": [
[
"==",
"0.1.13"
]
]
},
{
"name": "id",
"specs": [
[
"==",
"1.5.0"
]
]
},
{
"name": "identify",
"specs": [
[
"==",
"2.6.14"
]
]
},
{
"name": "idna",
"specs": [
[
"==",
"3.10"
]
]
},
{
"name": "iniconfig",
"specs": [
[
"==",
"2.1.0"
]
]
},
{
"name": "ipykernel",
"specs": [
[
"==",
"6.30.1"
]
]
},
{
"name": "ipython",
"specs": [
[
"==",
"9.6.0"
]
]
},
{
"name": "ipython-pygments-lexers",
"specs": [
[
"==",
"1.1.1"
]
]
},
{
"name": "isort",
"specs": [
[
"==",
"6.0.1"
]
]
},
{
"name": "jaraco-classes",
"specs": [
[
"==",
"3.4.0"
]
]
},
{
"name": "jaraco-context",
"specs": [
[
"==",
"6.0.1"
]
]
},
{
"name": "jaraco-functools",
"specs": [
[
"==",
"4.3.0"
]
]
},
{
"name": "jedi",
"specs": [
[
"==",
"0.19.2"
]
]
},
{
"name": "jinja2",
"specs": [
[
"==",
"3.1.6"
]
]
},
{
"name": "jsmin",
"specs": [
[
"==",
"3.0.1"
]
]
},
{
"name": "jupyter-client",
"specs": [
[
"==",
"8.6.3"
]
]
},
{
"name": "jupyter-core",
"specs": [
[
"==",
"5.8.1"
]
]
},
{
"name": "keyring",
"specs": [
[
"==",
"25.6.0"
]
]
},
{
"name": "markdown",
"specs": [
[
"==",
"3.9"
]
]
},
{
"name": "markdown-it-py",
"specs": [
[
"==",
"4.0.0"
]
]
},
{
"name": "markupsafe",
"specs": [
[
"==",
"3.0.3"
]
]
},
{
"name": "matplotlib-inline",
"specs": [
[
"==",
"0.1.7"
]
]
},
{
"name": "maturin",
"specs": [
[
"==",
"1.9.1"
]
]
},
{
"name": "mccabe",
"specs": [
[
"==",
"0.7.0"
]
]
},
{
"name": "mdurl",
"specs": [
[
"==",
"0.1.2"
]
]
},
{
"name": "mergedeep",
"specs": [
[
"==",
"1.3.4"
]
]
},
{
"name": "mkdocs",
"specs": [
[
"==",
"1.6.1"
]
]
},
{
"name": "mkdocs-get-deps",
"specs": [
[
"==",
"0.2.0"
]
]
},
{
"name": "mkdocs-material",
"specs": [
[
"==",
"9.6.21"
]
]
},
{
"name": "mkdocs-material-extensions",
"specs": [
[
"==",
"1.3.1"
]
]
},
{
"name": "mkdocs-minify-plugin",
"specs": [
[
"==",
"0.8.0"
]
]
},
{
"name": "more-itertools",
"specs": [
[
"==",
"10.8.0"
]
]
},
{
"name": "mypy",
"specs": [
[
"==",
"1.16.1"
]
]
},
{
"name": "mypy-extensions",
"specs": [
[
"==",
"1.1.0"
]
]
},
{
"name": "nest-asyncio",
"specs": [
[
"==",
"1.6.0"
]
]
},
{
"name": "nh3",
"specs": [
[
"==",
"0.3.0"
]
]
},
{
"name": "nodeenv",
"specs": [
[
"==",
"1.9.1"
]
]
},
{
"name": "orjson",
"specs": [
[
"==",
"3.11.3"
]
]
},
{
"name": "packaging",
"specs": [
[
"==",
"25.0"
]
]
},
{
"name": "paginate",
"specs": [
[
"==",
"0.5.7"
]
]
},
{
"name": "parso",
"specs": [
[
"==",
"0.8.5"
]
]
},
{
"name": "pathspec",
"specs": [
[
"==",
"0.12.1"
]
]
},
{
"name": "platformdirs",
"specs": [
[
"==",
"4.4.0"
]
]
},
{
"name": "pluggy",
"specs": [
[
"==",
"1.6.0"
]
]
},
{
"name": "pre-commit",
"specs": [
[
"==",
"4.2.0"
]
]
},
{
"name": "prompt-toolkit",
"specs": [
[
"==",
"3.0.52"
]
]
},
{
"name": "psutil",
"specs": [
[
"==",
"7.1.0"
]
]
},
{
"name": "pure-eval",
"specs": [
[
"==",
"0.2.3"
]
]
},
{
"name": "pygments",
"specs": [
[
"==",
"2.19.2"
]
]
},
{
"name": "pylint",
"specs": [
[
"==",
"3.3.8"
]
]
},
{
"name": "pymdown-extensions",
"specs": [
[
"==",
"10.16.1"
]
]
},
{
"name": "pytest",
"specs": [
[
"==",
"8.4.1"
]
]
},
{
"name": "pytest-cov",
"specs": [
[
"==",
"6.2.1"
]
]
},
{
"name": "python-dateutil",
"specs": [
[
"==",
"2.9.0.post0"
]
]
},
{
"name": "pywin32",
"specs": [
[
"==",
"311"
]
]
},
{
"name": "pywin32-ctypes",
"specs": [
[
"==",
"0.2.3"
]
]
},
{
"name": "pyyaml",
"specs": [
[
"==",
"6.0.3"
]
]
},
{
"name": "pyyaml-env-tag",
"specs": [
[
"==",
"1.1"
]
]
},
{
"name": "pyzmq",
"specs": [
[
"==",
"27.1.0"
]
]
},
{
"name": "readme-renderer",
"specs": [
[
"==",
"44.0"
]
]
},
{
"name": "requests",
"specs": [
[
"==",
"2.32.5"
]
]
},
{
"name": "requests-toolbelt",
"specs": [
[
"==",
"1.0.0"
]
]
},
{
"name": "rfc3986",
"specs": [
[
"==",
"2.0.0"
]
]
},
{
"name": "rich",
"specs": [
[
"==",
"14.1.0"
]
]
},
{
"name": "ruff",
"specs": [
[
"==",
"0.12.3"
]
]
},
{
"name": "six",
"specs": [
[
"==",
"1.17.0"
]
]
},
{
"name": "stack-data",
"specs": [
[
"==",
"0.6.3"
]
]
},
{
"name": "tomlkit",
"specs": [
[
"==",
"0.13.3"
]
]
},
{
"name": "tornado",
"specs": [
[
"==",
"6.5.2"
]
]
},
{
"name": "traitlets",
"specs": [
[
"==",
"5.14.3"
]
]
},
{
"name": "twine",
"specs": [
[
"==",
"6.2.0"
]
]
},
{
"name": "typing-extensions",
"specs": [
[
"==",
"4.15.0"
]
]
},
{
"name": "urllib3",
"specs": [
[
"==",
"2.5.0"
]
]
},
{
"name": "virtualenv",
"specs": [
[
"==",
"20.34.0"
]
]
},
{
"name": "watchdog",
"specs": [
[
"==",
"6.0.0"
]
]
},
{
"name": "wcwidth",
"specs": [
[
"==",
"0.2.14"
]
]
}
],
"lcname": "logly"
}