amzurlog


Nameamzurlog JSON
Version 1.2.1 PyPI version JSON
download
home_pagehttps://github.com/Iswarya-Amzur/amzurlog
SummaryA powerful, flexible, and easy-to-use logging library with streaming and exception tracking
upload_time2025-10-07 05:26:42
maintainerNone
docs_urlNone
authorAmzurATG
requires_python>=3.7
licenseMIT License Copyright (c) 2024 AmzurATG Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
keywords logging monitoring streaming exceptions elk grafana sentry
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # AmzurLog - Custom Logging Library

A powerful, flexible, and easy-to-use logging library built from scratch for Python applications.

## Features

🚀 **Core Features**
- Multiple log levels (DEBUG, INFO, WARNING, ERROR, CRITICAL)
- Thread-safe logging operations
- Structured logging with JSON support
- Custom formatters and filters
- File rotation and log management
- Performance monitoring decorators
- Context-aware logging
- Async logging support

📡 **Event Streaming**
- Real-time event streaming to monitoring platforms
- ELK Stack integration (Elasticsearch, Logstash, Kibana)
- Grafana Loki integration for log aggregation
- Apache Kafka streaming support
- Redis Streams integration
- HTTP webhook streaming
- Circuit breaker and rate limiting
- Batch processing and buffering

🛡️ **Exception Tracking**
- Comprehensive exception capture and reporting
- Sentry integration for error monitoring
- Rollbar integration for error tracking
- Custom webhook integrations
- Exception fingerprinting and deduplication
- Context enrichment with breadcrumbs
- Rate limiting for exception spam prevention
- Automatic severity classification

🎨 **Handlers**
- Console/stdout output with colors
- File logging with rotation
- Multi-handler support
- Custom handler creation

📊 **Formatters**
- Simple text formatting
- JSON structured logging
- Colored console output
- CSV format support
- Template-based formatting

🔍 **Filters**
- Level-based filtering
- Pattern matching
- Rate limiting
- Duplicate detection
- Thread-based filtering
- Custom field filtering

⚡ **Decorators**
- Performance logging
- Function call tracking
- Error/exception logging
- Async function support

🌐 **Context Management**
- Request/response context
- Thread-local context
- Transaction context
- Global context variables

## Quick Start

### Basic Usage

```python
import amzurlog

# Quick logging
amzurlog.info("Application started")
amzurlog.warning("This is a warning")
amzurlog.error("An error occurred")

# Get a named logger
logger = amzurlog.configure_logger("my_app")
logger.info("Hello from my_app!")
```

### Advanced Configuration

```python
from amzurlog import AmzurLogger, FileHandler, JSONFormatter, LevelFilter

# Create logger
logger = AmzurLogger("advanced_app")

# Add file handler with JSON formatter
handler = FileHandler("app.log")
handler.set_formatter(JSONFormatter(indent=2))
handler.add_filter(LevelFilter(min_level="INFO"))
logger.add_handler(handler)

# Log with structured data
logger.info("User login", user_id="123", ip="192.168.1.1", success=True)
```

### Quick Setup

```python
from amzurlog import quick_setup

# One-liner setup
logger = quick_setup(
    level='DEBUG',
    log_file='myapp.log',
    format_type='json',
    console=True
)

logger.info("Ready to go!")
```

## Event Streaming

### Stream to ELK Stack

```python
from amzurlog import AmzurLogger, ELKStreamingHandler

# Create logger with ELK streaming
logger = AmzurLogger("my_app")
elk_handler = ELKStreamingHandler(
    elasticsearch_hosts=["localhost:9200"],
    index_prefix="myapp-logs"
)
logger.add_handler("elk", elk_handler)

# Logs are automatically streamed to Elasticsearch
logger.info("User action", user_id="123", action="login")
```

### Stream to Grafana Loki

```python
from amzurlog import GrafanaStreamingHandler

# Add Grafana Loki streaming
grafana_handler = GrafanaStreamingHandler(
    loki_url="http://localhost:3100",
    job_name="my-application"
)
logger.add_handler("grafana", grafana_handler)

logger.info("System status", component="database", status="healthy")
```

### Stream to Kafka

```python
from amzurlog import KafkaStreamingHandler

# Stream logs to Kafka
kafka_handler = KafkaStreamingHandler(
    bootstrap_servers=["localhost:9092"],
    topic="application-logs"
)
logger.add_handler("kafka", kafka_handler)

logger.error("Payment failed", transaction_id="tx-456", amount=99.99)
```

### Stream to Redis

```python
from amzurlog import RedisStreamingHandler

# Stream to Redis Streams
redis_handler = RedisStreamingHandler(
    redis_url="redis://localhost:6379",
    stream_name="app:logs"
)
logger.add_handler("redis", redis_handler)

logger.warning("High memory usage", memory_percent=85)
```

### Configuration

### Core Configuration-Based Streaming

```python
from amzurlog import create_streaming_config

# Create streaming configuration
config = create_streaming_config(
    destinations={
        "elasticsearch": {
            "enabled": True,
            "hosts": ["localhost:9200"],
            "index_prefix": "myapp"
        },
        "kafka": {
            "enabled": True,
            "servers": ["localhost:9092"],
            "topic": "logs"
        }
    },
    circuit_breaker={
        "failure_threshold": 5,
        "recovery_timeout": 60
    },
    rate_limiting={
        "max_events_per_second": 100
    }
)

# Apply configuration to logger
logger = config.setup_streaming("my_app")
```

## Exception Tracking

### Basic Exception Tracking

```python
from amzurlog import AmzurLogger, ExceptionTracker, ExceptionHandler

# Create logger with exception tracking
logger = AmzurLogger("my_app")
exception_handler = ExceptionHandler(auto_capture=True)
logger.add_handler("exceptions", exception_handler)

# Exceptions are automatically captured and tracked
try:
    risky_operation()
except Exception:
    logger.error("Operation failed")  # Exception details automatically captured
```

### Sentry Integration

```python
from amzurlog import SentryHandler

# Add Sentry integration
sentry_handler = SentryHandler(
    dsn="https://your-dsn@sentry.io/project-id",
    environment="production"
)
logger.add_handler("sentry", sentry_handler)

# Exceptions automatically sent to Sentry
logger.error("Critical error occurred", exc_info=True)
```

### Exception Decorator

```python
from amzurlog import track_exceptions, ExceptionTracker, ExceptionSeverity

logger = AmzurLogger("my_app")
tracker = ExceptionTracker(logger)

@track_exceptions(tracker, severity=ExceptionSeverity.HIGH, reraise=True)
def critical_function():
    # Any exception here is automatically tracked
    raise ValueError("Something went wrong")

try:
    critical_function()
except ValueError:
    pass  # Exception was tracked automatically
```

### Global Exception Handler

```python
from amzurlog import install_global_exception_handler, ExceptionTracker

logger = AmzurLogger("my_app")
tracker = ExceptionTracker(logger)

# Install global handler for unhandled exceptions
install_global_exception_handler(tracker)

# Any unhandled exception will be automatically tracked
raise RuntimeError("This will be tracked automatically")
```

### Context and Breadcrumbs

```python
from amzurlog import ExceptionTracker

tracker = ExceptionTracker(logger)

# Set user context
tracker.set_user_context("user_123", email="user@example.com")

# Set request context
tracker.set_request_context("req_456", method="POST", url="/api/data")

# Add breadcrumbs for debugging
tracker.add_breadcrumb("Starting data processing", "process")
tracker.add_breadcrumb("Loading configuration", "config")

try:
    process_data()
except Exception:
    # Exception will include user context, request info, and breadcrumbs
    tracker.handle_exception(severity=ExceptionSeverity.HIGH)
```

### Custom Exception Integration

```python
from amzurlog import WebhookExceptionIntegration, ExceptionHandler

# Custom webhook integration
webhook_integration = WebhookExceptionIntegration(
    webhook_url="https://your-monitoring.com/exceptions",
    headers={"Authorization": "Bearer your-token"}
)

exception_handler = ExceptionHandler()
exception_handler.add_integration("webhook", webhook_integration)
logger.add_handler("exceptions", exception_handler)
```

### Exception Configuration

```python
from amzurlog import create_exception_config

# Create exception tracking configuration
config = create_exception_config(
    integrations={
        "sentry": {
            "enabled": True,
            "dsn": "https://your-dsn@sentry.io/project-id",
            "environment": "production"
        },
        "webhook": {
            "enabled": True,
            "url": "https://monitoring.com/webhook",
            "headers": {"Authorization": "Bearer token"}
        }
    },
    rate_limiting={
        "max_exceptions": 10,
        "time_window": 60
    },
    capture_settings={
        "capture_locals": True,
        "capture_globals": False,
        "max_breadcrumbs": 50
    }
)

# Apply configuration
logger = config.setup_exception_tracking("my_app")
```

### From Dictionary

```python
from amzurlog import AmzurLogConfig

config = AmzurLogConfig({
    'level': 'INFO',
    'console': {'enabled': True},
    'file': 'app.log',
    'rotation': {
        'max_size': '10MB',
        'backup_count': 5
    },
    'format': 'json'
})

logger = config.setup_logger('my_app')
```

### From JSON File

```json
{
    "level": "INFO",
    "handlers": [
        {
            "type": "console",
            "formatter": {
                "type": "colored",
                "options": {}
            }
        },
        {
            "type": "rotating",
            "filename": "logs/app.log",
            "max_bytes": "10MB",
            "backup_count": 5,
            "formatter": {
                "type": "json",
                "options": {"indent": 2}
            }
        }
    ],
    "filters": [
        {
            "type": "level",
            "min_level": "INFO"
        }
    ]
}
```

```python
from amzurlog import AmzurLogConfig

config = AmzurLogConfig.from_file('config.json')
logger = config.setup_logger('my_app')
```

### From Environment Variables

```bash
export AMZURLOG_LEVEL=DEBUG
export AMZURLOG_FORMAT=json
export AMZURLOG_DIR=logs
export AMZURLOG_MAX_SIZE=50MB
export AMZURLOG_BACKUP_COUNT=10
export AMZURLOG_CONSOLE=true
```

```python
from amzurlog import AmzurLogConfig

config = AmzurLogConfig.from_env()
logger = config.setup_logger('my_app')
```

## Performance Decorators

### Function Performance Monitoring

```python
from amzurlog.decorators import log_performance

@log_performance(threshold_seconds=0.1, include_memory=True)
def expensive_operation():
    # Your code here
    return "result"

# Automatically logs execution time, memory usage, CPU time
result = expensive_operation()
```

### Function Call Logging

```python
from amzurlog.decorators import log_calls

@log_calls(include_args=True, include_result=True)
def process_data(data, format="json"):
    return {"processed": len(data)}

# Logs function calls with parameters and return values
result = process_data([1, 2, 3], format="xml")
```

### Error Logging

```python
from amzurlog.decorators import log_errors

@log_errors(include_locals=True)
def risky_operation():
    # This will automatically log any exceptions
    raise ValueError("Something went wrong")

risky_operation()  # Exception details logged automatically
```

## Context Management

### Request Context

```python
from amzurlog.context import RequestContext

with RequestContext("req-123", method="POST", path="/api/users", user_id="456"):
    logger.info("Processing request")
    logger.warning("Validation failed")
    # All logs include request context automatically
```

### Custom Context

```python
from amzurlog.context import log_context

with log_context(transaction_id="tx-789", operation="transfer"):
    logger.info("Starting transaction")
    # Process transaction
    logger.info("Transaction completed")
```

### Thread-Local Context

```python
from amzurlog.context import set_global_context

# Set context for the entire thread
set_global_context(service="payment", version="1.2.3")

logger.info("Service started")  # Includes service and version
```

## Filters and Rate Limiting

### Rate Limiting

```python
from amzurlog.filters import RateLimitFilter

# Allow max 10 messages per minute
rate_filter = RateLimitFilter(max_rate=10, time_window=60)
handler.add_filter(rate_filter)
```

### Pattern Filtering

```python
from amzurlog.filters import PatternFilter

# Only log messages containing "ERROR"
error_filter = PatternFilter(r"ERROR", include=True)
handler.add_filter(error_filter)
```

### Duplicate Prevention

```python
from amzurlog.filters import DuplicateFilter

# Prevent duplicate messages within 5 minutes
dup_filter = DuplicateFilter(time_window=300, max_duplicates=1)
handler.add_filter(dup_filter)
```

## Custom Formatters

### Template Formatter

```python
from amzurlog.formatters import TemplateFormatter

formatter = TemplateFormatter(
    template="[{timestamp:%Y-%m-%d %H:%M:%S}] {level} | {logger} | {message}",
    field_formatters={
        'timestamp': lambda dt: dt.strftime('%Y-%m-%d %H:%M:%S'),
        'level': lambda lvl: lvl.name.upper()
    }
)
```

### CSV Formatter

```python
from amzurlog.formatters import CSVFormatter

formatter = CSVFormatter(
    fields=['timestamp', 'level', 'logger', 'message', 'user_id'],
    delimiter=','
)
```

## Async Support

```python
from amzurlog.decorators import log_async_calls
from amzurlog.context import async_log_context

@log_async_calls(include_args=True)
async def fetch_data(url):
    async with async_log_context(operation="fetch", url=url):
        # Your async code
        return await some_async_operation()
```

## File Rotation

### Size-Based Rotation

```python
from amzurlog.handlers import RotatingFileHandler

handler = RotatingFileHandler(
    filename="app.log",
    max_bytes=10 * 1024 * 1024,  # 10MB
    backup_count=5
)
```

### Time-Based Rotation

```python
from amzurlog.handlers import TimedRotatingFileHandler

# Daily rotation at midnight
daily_handler = TimedRotatingFileHandler(
    filename="daily_app.log",
    when='midnight',
    interval=1,
    backup_count=7  # Keep 7 days
)

# Hourly rotation
hourly_handler = TimedRotatingFileHandler(
    filename="hourly_app.log", 
    when='H',
    interval=1,
    backup_count=24  # Keep 24 hours
)

# Weekly rotation (every Monday)
weekly_handler = TimedRotatingFileHandler(
    filename="weekly_app.log",
    when='W0',  # 0=Monday, 1=Tuesday, etc.
    interval=1,
    backup_count=4  # Keep 4 weeks
)

# Custom time rotation (daily at 2:30 AM)
from datetime import time
custom_handler = TimedRotatingFileHandler(
    filename="custom_app.log",
    when='midnight',
    interval=1,
    backup_count=30,
    at_time=time(2, 30)  # 2:30 AM
)
```

#### Rotation Schedule Options

- `'S'` - Second-based rotation
- `'M'` - Minute-based rotation  
- `'H'` - Hourly rotation
- `'D'` or `'midnight'` - Daily rotation
- `'W0'`-`'W6'` - Weekly rotation (0=Monday, 6=Sunday)

#### Advanced Options

```python
# UTC time rotation for global applications
utc_handler = TimedRotatingFileHandler(
    filename="global_app.log",
    when='midnight',
    utc=True,  # Use UTC instead of local time
    backup_count=30
)

# Delayed file opening (for efficiency)
delayed_handler = TimedRotatingFileHandler(
    filename="delayed_app.log", 
    when='H',
    delay=True,  # Don't create file until first log
    backup_count=24
)
```

## Integration Examples

### FastAPI Integration

```python
from fastapi import FastAPI, Request
from amzurlog.context import RequestContext
import amzurlog

app = FastAPI()
logger = amzurlog.configure_logger("fastapi_app")

@app.middleware("http")
async def logging_middleware(request: Request, call_next):
    request_id = str(uuid.uuid4())
    
    with RequestContext(
        request_id=request_id,
        method=request.method,
        path=request.url.path,
        ip_address=request.client.host
    ):
        logger.info("Request started")
        response = await call_next(request)
        logger.info("Request completed", status_code=response.status_code)
        
    return response
```

### Django Integration

```python
# In Django settings.py
LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'amzurlog': {
            'class': 'amzurlog.handlers.FileHandler',
            'filename': 'django.log',
            'formatter': 'json',
        },
    },
    'loggers': {
        'django': {
            'handlers': ['amzurlog'],
            'level': 'INFO',
        },
    },
}
```

### Flask Integration

```python
from flask import Flask, g, request
from amzurlog.context import RequestContext
import amzurlog

app = Flask(__name__)
logger = amzurlog.configure_logger("flask_app")

@app.before_request
def before_request():
    g.request_context = RequestContext(
        request_id=str(uuid.uuid4()),
        method=request.method,
        path=request.path,
        ip_address=request.remote_addr
    )
    g.request_context.__enter__()
    logger.info("Request started")

@app.after_request
def after_request(response):
    logger.info("Request completed", status_code=response.status_code)
    g.request_context.__exit__(None, None, None)
    return response
```

## Testing

Run the complete test suite:

```bash
cd amzurlog

# Run all tests
python test_amzurlog.py        # Core functionality tests
python test_streaming.py       # Event streaming tests  
python test_exception_tracking.py  # Exception tracking tests

# Run complete integration example
python complete_integration_example.py
```

Or run specific test classes:

```bash
python -m unittest test_amzurlog.TestAmzurLogger
python -m unittest test_amzurlog.TestHandlers
python -m unittest test_amzurlog.TestFormatters
python -m unittest test_streaming.TestStreamManager
python -m unittest test_exception_tracking.TestExceptionTracker
```

## Performance

AmzurLog is designed for high performance:

- Thread-safe operations with minimal locking
- Efficient memory usage with lazy formatting
- Optional performance monitoring with psutil
- Rate limiting to prevent log spam
- Configurable log rotation to manage disk space

## Security

- PII sanitization support (integrate with your sanitizer)
- Secure context isolation
- Rate limiting prevents log injection attacks
- Thread-safe operations prevent race conditions

## API Reference

### Core Classes

- `AmzurLogger`: Main logger class
- `LogLevel`: Log level enumeration
- `LogRecord`: Individual log entry representation

### Handlers

- `ConsoleHandler`: Output to stdout/stderr
- `FileHandler`: Output to files
- `RotatingFileHandler`: File output with size-based rotation
- `TimedRotatingFileHandler`: File output with time-based rotation
- `MultiHandler`: Multiple handler support

### Formatters

- `SimpleFormatter`: Basic text formatting
- `JSONFormatter`: Structured JSON output
- `ColoredFormatter`: Colored console output
- `CSVFormatter`: CSV format output
- `TemplateFormatter`: Custom template formatting

### Filters

- `LevelFilter`: Filter by log level
- `PatternFilter`: Filter by message pattern
- `RateLimitFilter`: Rate limiting
- `DuplicateFilter`: Prevent duplicates
- `ThreadFilter`: Filter by thread
- `FieldFilter`: Filter by custom fields

### Context

- `LogContext`: Add context to logs
- `RequestContext`: HTTP request context
- `TransactionContext`: Database transaction context
- `log_context()`: Context manager
- `async_log_context()`: Async context manager

### Decorators

- `@log_performance`: Performance monitoring
- `@log_calls`: Function call logging
- `@log_errors`: Error logging
- `@log_async_calls`: Async function logging

## License

MIT License - see LICENSE file for details.

## Contributing

1. Fork the repository
2. Create a feature branch
3. Add tests for your changes
4. Run the test suite
5. Submit a pull request

## Support

For questions and support, please open an issue on the GitHub repository.

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/Iswarya-Amzur/amzurlog",
    "name": "amzurlog",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.7",
    "maintainer_email": null,
    "keywords": "logging, monitoring, streaming, exceptions, elk, grafana, sentry",
    "author": "AmzurATG",
    "author_email": "AmzurATG <support@amzur.com>",
    "download_url": "https://files.pythonhosted.org/packages/f4/dd/fab59a4201a4c910c7e46bb39077eb6b204aba82b827e712d30fae86c552/amzurlog-1.2.1.tar.gz",
    "platform": null,
    "description": "# AmzurLog - Custom Logging Library\r\n\r\nA powerful, flexible, and easy-to-use logging library built from scratch for Python applications.\r\n\r\n## Features\r\n\r\n\ud83d\ude80 **Core Features**\r\n- Multiple log levels (DEBUG, INFO, WARNING, ERROR, CRITICAL)\r\n- Thread-safe logging operations\r\n- Structured logging with JSON support\r\n- Custom formatters and filters\r\n- File rotation and log management\r\n- Performance monitoring decorators\r\n- Context-aware logging\r\n- Async logging support\r\n\r\n\ud83d\udce1 **Event Streaming**\r\n- Real-time event streaming to monitoring platforms\r\n- ELK Stack integration (Elasticsearch, Logstash, Kibana)\r\n- Grafana Loki integration for log aggregation\r\n- Apache Kafka streaming support\r\n- Redis Streams integration\r\n- HTTP webhook streaming\r\n- Circuit breaker and rate limiting\r\n- Batch processing and buffering\r\n\r\n\ud83d\udee1\ufe0f **Exception Tracking**\r\n- Comprehensive exception capture and reporting\r\n- Sentry integration for error monitoring\r\n- Rollbar integration for error tracking\r\n- Custom webhook integrations\r\n- Exception fingerprinting and deduplication\r\n- Context enrichment with breadcrumbs\r\n- Rate limiting for exception spam prevention\r\n- Automatic severity classification\r\n\r\n\ud83c\udfa8 **Handlers**\r\n- Console/stdout output with colors\r\n- File logging with rotation\r\n- Multi-handler support\r\n- Custom handler creation\r\n\r\n\ud83d\udcca **Formatters**\r\n- Simple text formatting\r\n- JSON structured logging\r\n- Colored console output\r\n- CSV format support\r\n- Template-based formatting\r\n\r\n\ud83d\udd0d **Filters**\r\n- Level-based filtering\r\n- Pattern matching\r\n- Rate limiting\r\n- Duplicate detection\r\n- Thread-based filtering\r\n- Custom field filtering\r\n\r\n\u26a1 **Decorators**\r\n- Performance logging\r\n- Function call tracking\r\n- Error/exception logging\r\n- Async function support\r\n\r\n\ud83c\udf10 **Context Management**\r\n- Request/response context\r\n- Thread-local context\r\n- Transaction context\r\n- Global context variables\r\n\r\n## Quick Start\r\n\r\n### Basic Usage\r\n\r\n```python\r\nimport amzurlog\r\n\r\n# Quick logging\r\namzurlog.info(\"Application started\")\r\namzurlog.warning(\"This is a warning\")\r\namzurlog.error(\"An error occurred\")\r\n\r\n# Get a named logger\r\nlogger = amzurlog.configure_logger(\"my_app\")\r\nlogger.info(\"Hello from my_app!\")\r\n```\r\n\r\n### Advanced Configuration\r\n\r\n```python\r\nfrom amzurlog import AmzurLogger, FileHandler, JSONFormatter, LevelFilter\r\n\r\n# Create logger\r\nlogger = AmzurLogger(\"advanced_app\")\r\n\r\n# Add file handler with JSON formatter\r\nhandler = FileHandler(\"app.log\")\r\nhandler.set_formatter(JSONFormatter(indent=2))\r\nhandler.add_filter(LevelFilter(min_level=\"INFO\"))\r\nlogger.add_handler(handler)\r\n\r\n# Log with structured data\r\nlogger.info(\"User login\", user_id=\"123\", ip=\"192.168.1.1\", success=True)\r\n```\r\n\r\n### Quick Setup\r\n\r\n```python\r\nfrom amzurlog import quick_setup\r\n\r\n# One-liner setup\r\nlogger = quick_setup(\r\n    level='DEBUG',\r\n    log_file='myapp.log',\r\n    format_type='json',\r\n    console=True\r\n)\r\n\r\nlogger.info(\"Ready to go!\")\r\n```\r\n\r\n## Event Streaming\r\n\r\n### Stream to ELK Stack\r\n\r\n```python\r\nfrom amzurlog import AmzurLogger, ELKStreamingHandler\r\n\r\n# Create logger with ELK streaming\r\nlogger = AmzurLogger(\"my_app\")\r\nelk_handler = ELKStreamingHandler(\r\n    elasticsearch_hosts=[\"localhost:9200\"],\r\n    index_prefix=\"myapp-logs\"\r\n)\r\nlogger.add_handler(\"elk\", elk_handler)\r\n\r\n# Logs are automatically streamed to Elasticsearch\r\nlogger.info(\"User action\", user_id=\"123\", action=\"login\")\r\n```\r\n\r\n### Stream to Grafana Loki\r\n\r\n```python\r\nfrom amzurlog import GrafanaStreamingHandler\r\n\r\n# Add Grafana Loki streaming\r\ngrafana_handler = GrafanaStreamingHandler(\r\n    loki_url=\"http://localhost:3100\",\r\n    job_name=\"my-application\"\r\n)\r\nlogger.add_handler(\"grafana\", grafana_handler)\r\n\r\nlogger.info(\"System status\", component=\"database\", status=\"healthy\")\r\n```\r\n\r\n### Stream to Kafka\r\n\r\n```python\r\nfrom amzurlog import KafkaStreamingHandler\r\n\r\n# Stream logs to Kafka\r\nkafka_handler = KafkaStreamingHandler(\r\n    bootstrap_servers=[\"localhost:9092\"],\r\n    topic=\"application-logs\"\r\n)\r\nlogger.add_handler(\"kafka\", kafka_handler)\r\n\r\nlogger.error(\"Payment failed\", transaction_id=\"tx-456\", amount=99.99)\r\n```\r\n\r\n### Stream to Redis\r\n\r\n```python\r\nfrom amzurlog import RedisStreamingHandler\r\n\r\n# Stream to Redis Streams\r\nredis_handler = RedisStreamingHandler(\r\n    redis_url=\"redis://localhost:6379\",\r\n    stream_name=\"app:logs\"\r\n)\r\nlogger.add_handler(\"redis\", redis_handler)\r\n\r\nlogger.warning(\"High memory usage\", memory_percent=85)\r\n```\r\n\r\n### Configuration\r\n\r\n### Core Configuration-Based Streaming\r\n\r\n```python\r\nfrom amzurlog import create_streaming_config\r\n\r\n# Create streaming configuration\r\nconfig = create_streaming_config(\r\n    destinations={\r\n        \"elasticsearch\": {\r\n            \"enabled\": True,\r\n            \"hosts\": [\"localhost:9200\"],\r\n            \"index_prefix\": \"myapp\"\r\n        },\r\n        \"kafka\": {\r\n            \"enabled\": True,\r\n            \"servers\": [\"localhost:9092\"],\r\n            \"topic\": \"logs\"\r\n        }\r\n    },\r\n    circuit_breaker={\r\n        \"failure_threshold\": 5,\r\n        \"recovery_timeout\": 60\r\n    },\r\n    rate_limiting={\r\n        \"max_events_per_second\": 100\r\n    }\r\n)\r\n\r\n# Apply configuration to logger\r\nlogger = config.setup_streaming(\"my_app\")\r\n```\r\n\r\n## Exception Tracking\r\n\r\n### Basic Exception Tracking\r\n\r\n```python\r\nfrom amzurlog import AmzurLogger, ExceptionTracker, ExceptionHandler\r\n\r\n# Create logger with exception tracking\r\nlogger = AmzurLogger(\"my_app\")\r\nexception_handler = ExceptionHandler(auto_capture=True)\r\nlogger.add_handler(\"exceptions\", exception_handler)\r\n\r\n# Exceptions are automatically captured and tracked\r\ntry:\r\n    risky_operation()\r\nexcept Exception:\r\n    logger.error(\"Operation failed\")  # Exception details automatically captured\r\n```\r\n\r\n### Sentry Integration\r\n\r\n```python\r\nfrom amzurlog import SentryHandler\r\n\r\n# Add Sentry integration\r\nsentry_handler = SentryHandler(\r\n    dsn=\"https://your-dsn@sentry.io/project-id\",\r\n    environment=\"production\"\r\n)\r\nlogger.add_handler(\"sentry\", sentry_handler)\r\n\r\n# Exceptions automatically sent to Sentry\r\nlogger.error(\"Critical error occurred\", exc_info=True)\r\n```\r\n\r\n### Exception Decorator\r\n\r\n```python\r\nfrom amzurlog import track_exceptions, ExceptionTracker, ExceptionSeverity\r\n\r\nlogger = AmzurLogger(\"my_app\")\r\ntracker = ExceptionTracker(logger)\r\n\r\n@track_exceptions(tracker, severity=ExceptionSeverity.HIGH, reraise=True)\r\ndef critical_function():\r\n    # Any exception here is automatically tracked\r\n    raise ValueError(\"Something went wrong\")\r\n\r\ntry:\r\n    critical_function()\r\nexcept ValueError:\r\n    pass  # Exception was tracked automatically\r\n```\r\n\r\n### Global Exception Handler\r\n\r\n```python\r\nfrom amzurlog import install_global_exception_handler, ExceptionTracker\r\n\r\nlogger = AmzurLogger(\"my_app\")\r\ntracker = ExceptionTracker(logger)\r\n\r\n# Install global handler for unhandled exceptions\r\ninstall_global_exception_handler(tracker)\r\n\r\n# Any unhandled exception will be automatically tracked\r\nraise RuntimeError(\"This will be tracked automatically\")\r\n```\r\n\r\n### Context and Breadcrumbs\r\n\r\n```python\r\nfrom amzurlog import ExceptionTracker\r\n\r\ntracker = ExceptionTracker(logger)\r\n\r\n# Set user context\r\ntracker.set_user_context(\"user_123\", email=\"user@example.com\")\r\n\r\n# Set request context\r\ntracker.set_request_context(\"req_456\", method=\"POST\", url=\"/api/data\")\r\n\r\n# Add breadcrumbs for debugging\r\ntracker.add_breadcrumb(\"Starting data processing\", \"process\")\r\ntracker.add_breadcrumb(\"Loading configuration\", \"config\")\r\n\r\ntry:\r\n    process_data()\r\nexcept Exception:\r\n    # Exception will include user context, request info, and breadcrumbs\r\n    tracker.handle_exception(severity=ExceptionSeverity.HIGH)\r\n```\r\n\r\n### Custom Exception Integration\r\n\r\n```python\r\nfrom amzurlog import WebhookExceptionIntegration, ExceptionHandler\r\n\r\n# Custom webhook integration\r\nwebhook_integration = WebhookExceptionIntegration(\r\n    webhook_url=\"https://your-monitoring.com/exceptions\",\r\n    headers={\"Authorization\": \"Bearer your-token\"}\r\n)\r\n\r\nexception_handler = ExceptionHandler()\r\nexception_handler.add_integration(\"webhook\", webhook_integration)\r\nlogger.add_handler(\"exceptions\", exception_handler)\r\n```\r\n\r\n### Exception Configuration\r\n\r\n```python\r\nfrom amzurlog import create_exception_config\r\n\r\n# Create exception tracking configuration\r\nconfig = create_exception_config(\r\n    integrations={\r\n        \"sentry\": {\r\n            \"enabled\": True,\r\n            \"dsn\": \"https://your-dsn@sentry.io/project-id\",\r\n            \"environment\": \"production\"\r\n        },\r\n        \"webhook\": {\r\n            \"enabled\": True,\r\n            \"url\": \"https://monitoring.com/webhook\",\r\n            \"headers\": {\"Authorization\": \"Bearer token\"}\r\n        }\r\n    },\r\n    rate_limiting={\r\n        \"max_exceptions\": 10,\r\n        \"time_window\": 60\r\n    },\r\n    capture_settings={\r\n        \"capture_locals\": True,\r\n        \"capture_globals\": False,\r\n        \"max_breadcrumbs\": 50\r\n    }\r\n)\r\n\r\n# Apply configuration\r\nlogger = config.setup_exception_tracking(\"my_app\")\r\n```\r\n\r\n### From Dictionary\r\n\r\n```python\r\nfrom amzurlog import AmzurLogConfig\r\n\r\nconfig = AmzurLogConfig({\r\n    'level': 'INFO',\r\n    'console': {'enabled': True},\r\n    'file': 'app.log',\r\n    'rotation': {\r\n        'max_size': '10MB',\r\n        'backup_count': 5\r\n    },\r\n    'format': 'json'\r\n})\r\n\r\nlogger = config.setup_logger('my_app')\r\n```\r\n\r\n### From JSON File\r\n\r\n```json\r\n{\r\n    \"level\": \"INFO\",\r\n    \"handlers\": [\r\n        {\r\n            \"type\": \"console\",\r\n            \"formatter\": {\r\n                \"type\": \"colored\",\r\n                \"options\": {}\r\n            }\r\n        },\r\n        {\r\n            \"type\": \"rotating\",\r\n            \"filename\": \"logs/app.log\",\r\n            \"max_bytes\": \"10MB\",\r\n            \"backup_count\": 5,\r\n            \"formatter\": {\r\n                \"type\": \"json\",\r\n                \"options\": {\"indent\": 2}\r\n            }\r\n        }\r\n    ],\r\n    \"filters\": [\r\n        {\r\n            \"type\": \"level\",\r\n            \"min_level\": \"INFO\"\r\n        }\r\n    ]\r\n}\r\n```\r\n\r\n```python\r\nfrom amzurlog import AmzurLogConfig\r\n\r\nconfig = AmzurLogConfig.from_file('config.json')\r\nlogger = config.setup_logger('my_app')\r\n```\r\n\r\n### From Environment Variables\r\n\r\n```bash\r\nexport AMZURLOG_LEVEL=DEBUG\r\nexport AMZURLOG_FORMAT=json\r\nexport AMZURLOG_DIR=logs\r\nexport AMZURLOG_MAX_SIZE=50MB\r\nexport AMZURLOG_BACKUP_COUNT=10\r\nexport AMZURLOG_CONSOLE=true\r\n```\r\n\r\n```python\r\nfrom amzurlog import AmzurLogConfig\r\n\r\nconfig = AmzurLogConfig.from_env()\r\nlogger = config.setup_logger('my_app')\r\n```\r\n\r\n## Performance Decorators\r\n\r\n### Function Performance Monitoring\r\n\r\n```python\r\nfrom amzurlog.decorators import log_performance\r\n\r\n@log_performance(threshold_seconds=0.1, include_memory=True)\r\ndef expensive_operation():\r\n    # Your code here\r\n    return \"result\"\r\n\r\n# Automatically logs execution time, memory usage, CPU time\r\nresult = expensive_operation()\r\n```\r\n\r\n### Function Call Logging\r\n\r\n```python\r\nfrom amzurlog.decorators import log_calls\r\n\r\n@log_calls(include_args=True, include_result=True)\r\ndef process_data(data, format=\"json\"):\r\n    return {\"processed\": len(data)}\r\n\r\n# Logs function calls with parameters and return values\r\nresult = process_data([1, 2, 3], format=\"xml\")\r\n```\r\n\r\n### Error Logging\r\n\r\n```python\r\nfrom amzurlog.decorators import log_errors\r\n\r\n@log_errors(include_locals=True)\r\ndef risky_operation():\r\n    # This will automatically log any exceptions\r\n    raise ValueError(\"Something went wrong\")\r\n\r\nrisky_operation()  # Exception details logged automatically\r\n```\r\n\r\n## Context Management\r\n\r\n### Request Context\r\n\r\n```python\r\nfrom amzurlog.context import RequestContext\r\n\r\nwith RequestContext(\"req-123\", method=\"POST\", path=\"/api/users\", user_id=\"456\"):\r\n    logger.info(\"Processing request\")\r\n    logger.warning(\"Validation failed\")\r\n    # All logs include request context automatically\r\n```\r\n\r\n### Custom Context\r\n\r\n```python\r\nfrom amzurlog.context import log_context\r\n\r\nwith log_context(transaction_id=\"tx-789\", operation=\"transfer\"):\r\n    logger.info(\"Starting transaction\")\r\n    # Process transaction\r\n    logger.info(\"Transaction completed\")\r\n```\r\n\r\n### Thread-Local Context\r\n\r\n```python\r\nfrom amzurlog.context import set_global_context\r\n\r\n# Set context for the entire thread\r\nset_global_context(service=\"payment\", version=\"1.2.3\")\r\n\r\nlogger.info(\"Service started\")  # Includes service and version\r\n```\r\n\r\n## Filters and Rate Limiting\r\n\r\n### Rate Limiting\r\n\r\n```python\r\nfrom amzurlog.filters import RateLimitFilter\r\n\r\n# Allow max 10 messages per minute\r\nrate_filter = RateLimitFilter(max_rate=10, time_window=60)\r\nhandler.add_filter(rate_filter)\r\n```\r\n\r\n### Pattern Filtering\r\n\r\n```python\r\nfrom amzurlog.filters import PatternFilter\r\n\r\n# Only log messages containing \"ERROR\"\r\nerror_filter = PatternFilter(r\"ERROR\", include=True)\r\nhandler.add_filter(error_filter)\r\n```\r\n\r\n### Duplicate Prevention\r\n\r\n```python\r\nfrom amzurlog.filters import DuplicateFilter\r\n\r\n# Prevent duplicate messages within 5 minutes\r\ndup_filter = DuplicateFilter(time_window=300, max_duplicates=1)\r\nhandler.add_filter(dup_filter)\r\n```\r\n\r\n## Custom Formatters\r\n\r\n### Template Formatter\r\n\r\n```python\r\nfrom amzurlog.formatters import TemplateFormatter\r\n\r\nformatter = TemplateFormatter(\r\n    template=\"[{timestamp:%Y-%m-%d %H:%M:%S}] {level} | {logger} | {message}\",\r\n    field_formatters={\r\n        'timestamp': lambda dt: dt.strftime('%Y-%m-%d %H:%M:%S'),\r\n        'level': lambda lvl: lvl.name.upper()\r\n    }\r\n)\r\n```\r\n\r\n### CSV Formatter\r\n\r\n```python\r\nfrom amzurlog.formatters import CSVFormatter\r\n\r\nformatter = CSVFormatter(\r\n    fields=['timestamp', 'level', 'logger', 'message', 'user_id'],\r\n    delimiter=','\r\n)\r\n```\r\n\r\n## Async Support\r\n\r\n```python\r\nfrom amzurlog.decorators import log_async_calls\r\nfrom amzurlog.context import async_log_context\r\n\r\n@log_async_calls(include_args=True)\r\nasync def fetch_data(url):\r\n    async with async_log_context(operation=\"fetch\", url=url):\r\n        # Your async code\r\n        return await some_async_operation()\r\n```\r\n\r\n## File Rotation\r\n\r\n### Size-Based Rotation\r\n\r\n```python\r\nfrom amzurlog.handlers import RotatingFileHandler\r\n\r\nhandler = RotatingFileHandler(\r\n    filename=\"app.log\",\r\n    max_bytes=10 * 1024 * 1024,  # 10MB\r\n    backup_count=5\r\n)\r\n```\r\n\r\n### Time-Based Rotation\r\n\r\n```python\r\nfrom amzurlog.handlers import TimedRotatingFileHandler\r\n\r\n# Daily rotation at midnight\r\ndaily_handler = TimedRotatingFileHandler(\r\n    filename=\"daily_app.log\",\r\n    when='midnight',\r\n    interval=1,\r\n    backup_count=7  # Keep 7 days\r\n)\r\n\r\n# Hourly rotation\r\nhourly_handler = TimedRotatingFileHandler(\r\n    filename=\"hourly_app.log\", \r\n    when='H',\r\n    interval=1,\r\n    backup_count=24  # Keep 24 hours\r\n)\r\n\r\n# Weekly rotation (every Monday)\r\nweekly_handler = TimedRotatingFileHandler(\r\n    filename=\"weekly_app.log\",\r\n    when='W0',  # 0=Monday, 1=Tuesday, etc.\r\n    interval=1,\r\n    backup_count=4  # Keep 4 weeks\r\n)\r\n\r\n# Custom time rotation (daily at 2:30 AM)\r\nfrom datetime import time\r\ncustom_handler = TimedRotatingFileHandler(\r\n    filename=\"custom_app.log\",\r\n    when='midnight',\r\n    interval=1,\r\n    backup_count=30,\r\n    at_time=time(2, 30)  # 2:30 AM\r\n)\r\n```\r\n\r\n#### Rotation Schedule Options\r\n\r\n- `'S'` - Second-based rotation\r\n- `'M'` - Minute-based rotation  \r\n- `'H'` - Hourly rotation\r\n- `'D'` or `'midnight'` - Daily rotation\r\n- `'W0'`-`'W6'` - Weekly rotation (0=Monday, 6=Sunday)\r\n\r\n#### Advanced Options\r\n\r\n```python\r\n# UTC time rotation for global applications\r\nutc_handler = TimedRotatingFileHandler(\r\n    filename=\"global_app.log\",\r\n    when='midnight',\r\n    utc=True,  # Use UTC instead of local time\r\n    backup_count=30\r\n)\r\n\r\n# Delayed file opening (for efficiency)\r\ndelayed_handler = TimedRotatingFileHandler(\r\n    filename=\"delayed_app.log\", \r\n    when='H',\r\n    delay=True,  # Don't create file until first log\r\n    backup_count=24\r\n)\r\n```\r\n\r\n## Integration Examples\r\n\r\n### FastAPI Integration\r\n\r\n```python\r\nfrom fastapi import FastAPI, Request\r\nfrom amzurlog.context import RequestContext\r\nimport amzurlog\r\n\r\napp = FastAPI()\r\nlogger = amzurlog.configure_logger(\"fastapi_app\")\r\n\r\n@app.middleware(\"http\")\r\nasync def logging_middleware(request: Request, call_next):\r\n    request_id = str(uuid.uuid4())\r\n    \r\n    with RequestContext(\r\n        request_id=request_id,\r\n        method=request.method,\r\n        path=request.url.path,\r\n        ip_address=request.client.host\r\n    ):\r\n        logger.info(\"Request started\")\r\n        response = await call_next(request)\r\n        logger.info(\"Request completed\", status_code=response.status_code)\r\n        \r\n    return response\r\n```\r\n\r\n### Django Integration\r\n\r\n```python\r\n# In Django settings.py\r\nLOGGING = {\r\n    'version': 1,\r\n    'disable_existing_loggers': False,\r\n    'handlers': {\r\n        'amzurlog': {\r\n            'class': 'amzurlog.handlers.FileHandler',\r\n            'filename': 'django.log',\r\n            'formatter': 'json',\r\n        },\r\n    },\r\n    'loggers': {\r\n        'django': {\r\n            'handlers': ['amzurlog'],\r\n            'level': 'INFO',\r\n        },\r\n    },\r\n}\r\n```\r\n\r\n### Flask Integration\r\n\r\n```python\r\nfrom flask import Flask, g, request\r\nfrom amzurlog.context import RequestContext\r\nimport amzurlog\r\n\r\napp = Flask(__name__)\r\nlogger = amzurlog.configure_logger(\"flask_app\")\r\n\r\n@app.before_request\r\ndef before_request():\r\n    g.request_context = RequestContext(\r\n        request_id=str(uuid.uuid4()),\r\n        method=request.method,\r\n        path=request.path,\r\n        ip_address=request.remote_addr\r\n    )\r\n    g.request_context.__enter__()\r\n    logger.info(\"Request started\")\r\n\r\n@app.after_request\r\ndef after_request(response):\r\n    logger.info(\"Request completed\", status_code=response.status_code)\r\n    g.request_context.__exit__(None, None, None)\r\n    return response\r\n```\r\n\r\n## Testing\r\n\r\nRun the complete test suite:\r\n\r\n```bash\r\ncd amzurlog\r\n\r\n# Run all tests\r\npython test_amzurlog.py        # Core functionality tests\r\npython test_streaming.py       # Event streaming tests  \r\npython test_exception_tracking.py  # Exception tracking tests\r\n\r\n# Run complete integration example\r\npython complete_integration_example.py\r\n```\r\n\r\nOr run specific test classes:\r\n\r\n```bash\r\npython -m unittest test_amzurlog.TestAmzurLogger\r\npython -m unittest test_amzurlog.TestHandlers\r\npython -m unittest test_amzurlog.TestFormatters\r\npython -m unittest test_streaming.TestStreamManager\r\npython -m unittest test_exception_tracking.TestExceptionTracker\r\n```\r\n\r\n## Performance\r\n\r\nAmzurLog is designed for high performance:\r\n\r\n- Thread-safe operations with minimal locking\r\n- Efficient memory usage with lazy formatting\r\n- Optional performance monitoring with psutil\r\n- Rate limiting to prevent log spam\r\n- Configurable log rotation to manage disk space\r\n\r\n## Security\r\n\r\n- PII sanitization support (integrate with your sanitizer)\r\n- Secure context isolation\r\n- Rate limiting prevents log injection attacks\r\n- Thread-safe operations prevent race conditions\r\n\r\n## API Reference\r\n\r\n### Core Classes\r\n\r\n- `AmzurLogger`: Main logger class\r\n- `LogLevel`: Log level enumeration\r\n- `LogRecord`: Individual log entry representation\r\n\r\n### Handlers\r\n\r\n- `ConsoleHandler`: Output to stdout/stderr\r\n- `FileHandler`: Output to files\r\n- `RotatingFileHandler`: File output with size-based rotation\r\n- `TimedRotatingFileHandler`: File output with time-based rotation\r\n- `MultiHandler`: Multiple handler support\r\n\r\n### Formatters\r\n\r\n- `SimpleFormatter`: Basic text formatting\r\n- `JSONFormatter`: Structured JSON output\r\n- `ColoredFormatter`: Colored console output\r\n- `CSVFormatter`: CSV format output\r\n- `TemplateFormatter`: Custom template formatting\r\n\r\n### Filters\r\n\r\n- `LevelFilter`: Filter by log level\r\n- `PatternFilter`: Filter by message pattern\r\n- `RateLimitFilter`: Rate limiting\r\n- `DuplicateFilter`: Prevent duplicates\r\n- `ThreadFilter`: Filter by thread\r\n- `FieldFilter`: Filter by custom fields\r\n\r\n### Context\r\n\r\n- `LogContext`: Add context to logs\r\n- `RequestContext`: HTTP request context\r\n- `TransactionContext`: Database transaction context\r\n- `log_context()`: Context manager\r\n- `async_log_context()`: Async context manager\r\n\r\n### Decorators\r\n\r\n- `@log_performance`: Performance monitoring\r\n- `@log_calls`: Function call logging\r\n- `@log_errors`: Error logging\r\n- `@log_async_calls`: Async function logging\r\n\r\n## License\r\n\r\nMIT License - see LICENSE file for details.\r\n\r\n## Contributing\r\n\r\n1. Fork the repository\r\n2. Create a feature branch\r\n3. Add tests for your changes\r\n4. Run the test suite\r\n5. Submit a pull request\r\n\r\n## Support\r\n\r\nFor questions and support, please open an issue on the GitHub repository.\r\n",
    "bugtrack_url": null,
    "license": "MIT License\r\n        \r\n        Copyright (c) 2024 AmzurATG\r\n        \r\n        Permission is hereby granted, free of charge, to any person obtaining a copy\r\n        of this software and associated documentation files (the \"Software\"), to deal\r\n        in the Software without restriction, including without limitation the rights\r\n        to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n        copies of the Software, and to permit persons to whom the Software is\r\n        furnished to do so, subject to the following conditions:\r\n        \r\n        The above copyright notice and this permission notice shall be included in all\r\n        copies or substantial portions of the Software.\r\n        \r\n        THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n        IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n        FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n        AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n        LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n        OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\n        SOFTWARE.",
    "summary": "A powerful, flexible, and easy-to-use logging library with streaming and exception tracking",
    "version": "1.2.1",
    "project_urls": {
        "Bug Reports": "https://github.com/Iswarya-Amzur/amzurlog/issues",
        "Documentation": "https://github.com/Iswarya-Amzur/amzurlog/blob/main/README.md",
        "Homepage": "https://github.com/Iswarya-Amzur/amzurlog",
        "Repository": "https://github.com/Iswarya-Amzur/amzurlog.git"
    },
    "split_keywords": [
        "logging",
        " monitoring",
        " streaming",
        " exceptions",
        " elk",
        " grafana",
        " sentry"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "cd08c167ff4a20a2887b7732ce1c0bb176ea215ccf7676ffb08710afc49d7b86",
                "md5": "63bd6962ef6bd01e7d1d0ff8bdb7024e",
                "sha256": "663aaf3ba899dd60b9a5fe5a933490fd20aab5eab09556d5a1de22150c4f19c5"
            },
            "downloads": -1,
            "filename": "amzurlog-1.2.1-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "63bd6962ef6bd01e7d1d0ff8bdb7024e",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.7",
            "size": 67967,
            "upload_time": "2025-10-07T05:26:40",
            "upload_time_iso_8601": "2025-10-07T05:26:40.970409Z",
            "url": "https://files.pythonhosted.org/packages/cd/08/c167ff4a20a2887b7732ce1c0bb176ea215ccf7676ffb08710afc49d7b86/amzurlog-1.2.1-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "f4ddfab59a4201a4c910c7e46bb39077eb6b204aba82b827e712d30fae86c552",
                "md5": "b2310af6dbe9530dac17abb66e9b4bba",
                "sha256": "bd05f26c25edb334ecb5b60da1b472ea88ecf21185c360dbc7a1abe8ac07bef7"
            },
            "downloads": -1,
            "filename": "amzurlog-1.2.1.tar.gz",
            "has_sig": false,
            "md5_digest": "b2310af6dbe9530dac17abb66e9b4bba",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.7",
            "size": 70837,
            "upload_time": "2025-10-07T05:26:42",
            "upload_time_iso_8601": "2025-10-07T05:26:42.574506Z",
            "url": "https://files.pythonhosted.org/packages/f4/dd/fab59a4201a4c910c7e46bb39077eb6b204aba82b827e712d30fae86c552/amzurlog-1.2.1.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-10-07 05:26:42",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "Iswarya-Amzur",
    "github_project": "amzurlog",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": false,
    "lcname": "amzurlog"
}
        
Elapsed time: 1.88657s