zlogger-kit


Namezlogger-kit JSON
Version 0.0.5 PyPI version JSON
download
home_pageNone
SummaryZLogger Kit is a simple logging kit that abstracts structlog to provide a more intuitive and flexible logging experience. It provides middleware for logging requests and responses, as well as a logger for logging messages, with priority levels P10, P20, P30, P40 for each log level: [WARNING, INFO, DEBUG, ERROR].
upload_time2025-02-09 07:48:48
maintainerNone
docs_urlNone
authorAbdullah Alqahtani
requires_python<4.0,>=3.11
licenseMIT
keywords
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # ZLogger Kit

<p align="center">
  <img src="https://github.com/anqorithm/zlogger_kit/raw/main/assets/zlogger-logo.svg" alt="ZLoggerKit Logo" width="400"/>
</p>

[![Downloads](https://img.shields.io/pypi/dm/zlogger-kit)](https://pypi.org/project/zlogger-kit/)
[![PyPI version](https://img.shields.io/pypi/v/zlogger-kit)](https://img.shields.io/pypi/v/zlogger-kit)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
![ZLogger Kit](https://img.shields.io/badge/ZLogger_Kit-0.0.5-blue)
![Python](https://img.shields.io/badge/Python->=3.11,<4.0-blue)
![FastAPI](https://img.shields.io/badge/FastAPI->=0.109.0,<0.115.8-blue)
[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)
[![Tests](https://img.shields.io/badge/Tests-Pytest-green)](https://docs.pytest.org/)
[![Coverage](https://img.shields.io/badge/Coverage-100%25-brightgreen)](https://coverage.py/)

ZLogger Kit is a simple logging kit that abstracts structlog to provide a more `intuitive` and `flexible` logging experience. It provides middleware for logging requests and responses, as well as a logger for logging messages, with priority levels `P10`, `P20`, `P30`, `P40` for each log level: [`WARNING`, `INFO`, `DEBUG`, `ERROR`].

## Features

- **Easy to use and setup**
- **Logging requests and responses** for all `requests` and `responses`
- **Support Timezone** with the ability to set the timezone, default is `Asia/Riyadh`
- **Logging messages** with priority levels (`P10`, `P20`, `P30`, `P40`)
- **Logging errors, warnings, info, and debug**
- **Logging to file** with the ability to set the log `file path` and `file name`
- **Logging to console** with the ability to set the log `level`
- **Logging with 2 different log formats**
    - **JSON**
    - **TEXT**
- **Pydantic** support for logging requests and responses to keep the data types and formats consistent
- **Enums** for logging requests and responses to keep the data types and formats consistent


## Priority Levels

| Level   | Description                     | Priority |
|---------|---------------------------------|----------|
| DEBUG   | Debug level logging with lowest priority. | P10      |
| INFO    | Informational level logging with low-medium priority. | P20      |
| WARNING | Warning level logging with medium-high priority. | P30      |
| ERROR   | Error level logging with highest priority. | P40      |

## Installation

### Poetry (Recommended)

```bash
$ poetry add zlogger-kit
```

### Pip

```bash
$ pip install zlogger-kit
```

## Quick Start

#### Example 1

In this example, we will use the `ZLog` class to log messages to the console and file, with the JSON & TEXT formats and the `AUTH` module.


```python
from zlogger_kit import ZLog, ZLogConfig
from examples.modules import Module

config = ZLogConfig(
    module=Module.AUTH.value,
    json_format=False,
    log_path="logs/auth",
)
logger = ZLog.init(config)

logger.info("Starting authentication process", client_ip="192.168.1.100")
logger.info("Login successful", user_id="user_123")
logger.error(
    "Login failed",
    username="suspicious_user",
    ip="10.0.0.5",
    reason="Invalid credentials",
)
logger.warn(
    "Failed login attempt",
    username="suspicious_user",
    ip="10.0.0.5",
    reason="Invalid credentials",
)
logger.debug("Debug message", user_id="user_123")
logger.warn(
    "Failed login attempt",
    username="suspicious_user",
    ip="10.0.0.5",
    reason="Invalid credentials",
)
```

#### JSON Format

```json
{"timestamp": "2025-02-09T00:25:39.953773+03:00", "module": "AUTH", "priority": "P20", "message": "Starting authentication process", "level": "INFO", "client_ip": "192.168.1.100"}
{"timestamp": "2025-02-09T00:25:39.954158+03:00", "module": "AUTH", "priority": "P20", "message": "Login successful", "level": "INFO", "user_id": "user_123"}
{"timestamp": "2025-02-09T00:25:39.954199+03:00", "module": "AUTH", "priority": "P40", "message": "Login failed", "level": "ERROR", "username": "suspicious_user", "ip": "10.0.0.5", "reason": "Invalid credentials"}
{"timestamp": "2025-02-09T00:25:39.954224+03:00", "module": "AUTH", "priority": "P30", "message": "Failed login attempt", "level": "WARNING", "username": "suspicious_user", "ip": "10.0.0.5", "reason": "Invalid credentials"}
{"timestamp": "2025-02-09T00:25:39.954260+03:00", "module": "AUTH", "priority": "P10", "message": "Debug message", "level": "DEBUG", "user_id": "user_123"}
```

```python
config = ZLogConfig(
    module=Module.AUTH.value,
    json_format=False,
    log_path="logs/auth",
)
```

#### TEXT Format

```json
[INFO]:[P20] [2025-02-09T00:27:14.375037+03:00] Starting authentication process {"level": "INFO", "client_ip": "192.168.1.100"}
[INFO]:[P20] [2025-02-09T00:27:14.375318+03:00] Login successful {"level": "INFO", "user_id": "user_123"}
[ERROR]:[P40] [2025-02-09T00:27:14.375380+03:00] Login failed {"level": "ERROR", "username": "suspicious_user", "ip": "10.0.0.5", "reason": "Invalid credentials"}
[WARNING]:[P30] [2025-02-09T00:27:14.375410+03:00] Failed login attempt {"level": "WARNING", "username": "suspicious_user", "ip": "10.0.0.5", "reason": "Invalid credentials"}
[DEBUG]:[P10] [2025-02-09T00:27:14.375453+03:00] Debug message {"level": "DEBUG", "user_id": "user_123"}
```


#### Example 2

In this example, we will use the `ZLogMiddleware` class to log requests and responses, with both JSON and TEXT formats for the `PAYMENT` module.

#### example2.py
```python
from fastapi import FastAPI
from examples.modules import Module
from zlogger_kit import ZLogMiddleware, ZLog, ZLogConfig
from examples.routers.payment_router import router as payment_router

app = FastAPI(title="Payment Service", description="API for payment processing")

zlogger = ZLog.init(
    ZLogConfig(
        module=Module.PAYMENT.value,
        log_path="logs",
        time_zone="Asia/Riyadh",
        json_format=True,
    )
)

app.add_middleware(ZLogMiddleware, logger=zlogger)

app.include_router(payment_router)


@app.get("/health")
async def health():
    """Health check endpoint"""
    return {"status": "healthy"}


@app.get("/")
async def root():
    return {"message": "Welcome to the Payment Service API 💸"}
```

#### routers/payment_router.py
```python
from fastapi import APIRouter, HTTPException
from examples.modules import Module
from zlogger_kit import ZLogConfig, ZLog

router = APIRouter(
    prefix="/payments",
    tags=["payments"],
    responses={404: {"description": "Not found"}},
)

logger = ZLog.init(
    ZLogConfig(
        module=Module.PAYMENT.value,
        log_path="logs",
        time_zone="Asia/Riyadh",
        json_format=True,
    )
)


@router.post("")
async def create_payment():
    """Create a new payment"""
    try:
        return {"payment_id": "pay_123", "status": "succeeded", "amount": 1000}
    except Exception as e:
        logger.error(f"Payment failed: {str(e)}")
        raise HTTPException(status_code=400, detail="Payment failed")


@router.get("/{payment_id}")
async def get_payment(payment_id: str):
    """Get payment details by ID"""
    return {
        "payment_id": payment_id,
        "status": "succeeded",
        "amount": 1000,
        "created_at": "2024-03-20T10:00:00Z",
    }


@router.post("/{payment_id}/refund")
async def refund_payment(payment_id: str):
    """Refund a payment"""
    try:
        return {
            "refund_id": "ref_123",
            "payment_id": payment_id,
            "status": "succeeded",
            "amount": 1000,
        }
    except Exception as e:
        logger.error(f"Refund failed: {str(e)}")
        raise HTTPException(status_code=400, detail="Refund failed")
```


#### Run the example

```bash
$ poetry run uvicorn examples.example2:app --reload
```

#### TEXT Format (logs/payment-2025-02-08.log)
```text
[INFO]:[P20] [2025-02-08T21:01:35.591221+00:00] POST http://127.0.0.1:8000/payments {"level": "INFO", "operation": "request", "method": "POST", "url": "http://127.0.0.1:8000/payments", "ip": "127.0.0.1"}
[INFO]:[P20] [2025-02-08T21:01:35.592402+00:00] 200 {"level": "INFO", "operation": "response", "status_code": 200, "ip": "127.0.0.1"}
[INFO]:[P20] [2025-02-08T21:01:40.856986+00:00] GET http://127.0.0.1:8000/payments/xx {"level": "INFO", "operation": "request", "method": "GET", "url": "http://127.0.0.1:8000/payments/xx", "ip": "127.0.0.1"}
[INFO]:[P20] [2025-02-08T21:01:40.857824+00:00] 200 {"level": "INFO", "operation": "response", "status_code": 200, "ip": "127.0.0.1"}
[INFO]:[P20] [2025-02-08T21:01:41.037139+00:00] GET http://127.0.0.1:8000/health {"level": "INFO", "operation": "request", "method": "GET", "url": "http://127.0.0.1:8000/health", "ip": "127.0.0.1"}
```

#### JSON Format (logs/payment-2025-02-08.json)
```json
{"timestamp": "2025-02-09T01:26:43.047064+03:00", "module": "PAYMENT", "priority": "P20", "message": "POST http://127.0.0.1:8000/payments", "level": "INFO", "operation": "request", "method": "POST", "url": "http://127.0.0.1:8000/payments", "ip": "127.0.0.1"}
{"timestamp": "2025-02-09T01:26:43.048061+03:00", "module": "PAYMENT", "priority": "P20", "message": "200", "level": "INFO", "operation": "response", "status_code": 200, "ip": "127.0.0.1"}
{"timestamp": "2025-02-09T01:26:48.822486+03:00", "module": "PAYMENT", "priority": "P20", "message": "GET http://127.0.0.1:8000/payments/xx", "level": "INFO", "operation": "request", "method": "GET", "url": "http://127.0.0.1:8000/payments/xx", "ip": "127.0.0.1"}
{"timestamp": "2025-02-09T01:26:48.826271+03:00", "module": "PAYMENT", "priority": "P20", "message": "200", "level": "INFO", "operation": "response", "status_code": 200, "ip": "127.0.0.1"}
{"timestamp": "2025-02-09T01:26:48.971760+03:00", "module": "PAYMENT", "priority": "P20", "message": "GET http://127.0.0.1:8000/health", "level": "INFO", "operation": "request", "method": "GET", "url": "http://127.0.0.1:8000/health", "ip": "127.0.0.1"}
```

## Unit Tests

```bash
$ poetry run pytest
```

![Unit Tests](https://github.com/anqorithm/zlogger_kit/raw/main/assets/1.png)


## Contributing

Contributions are welcome! Please feel free to submit a PR.


## Contributors

- [Abdullah Alqahtani](https://github.com/anqorithm)

## License

This project is licensed under the MIT License. See the [LICENSE](LICENSE) file for details.
            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "zlogger-kit",
    "maintainer": null,
    "docs_url": null,
    "requires_python": "<4.0,>=3.11",
    "maintainer_email": null,
    "keywords": null,
    "author": "Abdullah Alqahtani",
    "author_email": "anqorithm@protonmail.com",
    "download_url": "https://files.pythonhosted.org/packages/c6/23/337c3e1d29004fc3caf64edf3229fe151aef9459a1ad2f68ac03276e11ef/zlogger_kit-0.0.5.tar.gz",
    "platform": null,
    "description": "# ZLogger Kit\n\n<p align=\"center\">\n  <img src=\"https://github.com/anqorithm/zlogger_kit/raw/main/assets/zlogger-logo.svg\" alt=\"ZLoggerKit Logo\" width=\"400\"/>\n</p>\n\n[![Downloads](https://img.shields.io/pypi/dm/zlogger-kit)](https://pypi.org/project/zlogger-kit/)\n[![PyPI version](https://img.shields.io/pypi/v/zlogger-kit)](https://img.shields.io/pypi/v/zlogger-kit)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n![ZLogger Kit](https://img.shields.io/badge/ZLogger_Kit-0.0.5-blue)\n![Python](https://img.shields.io/badge/Python->=3.11,<4.0-blue)\n![FastAPI](https://img.shields.io/badge/FastAPI->=0.109.0,<0.115.8-blue)\n[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)\n[![Tests](https://img.shields.io/badge/Tests-Pytest-green)](https://docs.pytest.org/)\n[![Coverage](https://img.shields.io/badge/Coverage-100%25-brightgreen)](https://coverage.py/)\n\nZLogger Kit is a simple logging kit that abstracts structlog to provide a more `intuitive` and `flexible` logging experience. It provides middleware for logging requests and responses, as well as a logger for logging messages, with priority levels `P10`, `P20`, `P30`, `P40` for each log level: [`WARNING`, `INFO`, `DEBUG`, `ERROR`].\n\n## Features\n\n- **Easy to use and setup**\n- **Logging requests and responses** for all `requests` and `responses`\n- **Support Timezone** with the ability to set the timezone, default is `Asia/Riyadh`\n- **Logging messages** with priority levels (`P10`, `P20`, `P30`, `P40`)\n- **Logging errors, warnings, info, and debug**\n- **Logging to file** with the ability to set the log `file path` and `file name`\n- **Logging to console** with the ability to set the log `level`\n- **Logging with 2 different log formats**\n    - **JSON**\n    - **TEXT**\n- **Pydantic** support for logging requests and responses to keep the data types and formats consistent\n- **Enums** for logging requests and responses to keep the data types and formats consistent\n\n\n## Priority Levels\n\n| Level   | Description                     | Priority |\n|---------|---------------------------------|----------|\n| DEBUG   | Debug level logging with lowest priority. | P10      |\n| INFO    | Informational level logging with low-medium priority. | P20      |\n| WARNING | Warning level logging with medium-high priority. | P30      |\n| ERROR   | Error level logging with highest priority. | P40      |\n\n## Installation\n\n### Poetry (Recommended)\n\n```bash\n$ poetry add zlogger-kit\n```\n\n### Pip\n\n```bash\n$ pip install zlogger-kit\n```\n\n## Quick Start\n\n#### Example 1\n\nIn this example, we will use the `ZLog` class to log messages to the console and file, with the JSON & TEXT formats and the `AUTH` module.\n\n\n```python\nfrom zlogger_kit import ZLog, ZLogConfig\nfrom examples.modules import Module\n\nconfig = ZLogConfig(\n    module=Module.AUTH.value,\n    json_format=False,\n    log_path=\"logs/auth\",\n)\nlogger = ZLog.init(config)\n\nlogger.info(\"Starting authentication process\", client_ip=\"192.168.1.100\")\nlogger.info(\"Login successful\", user_id=\"user_123\")\nlogger.error(\n    \"Login failed\",\n    username=\"suspicious_user\",\n    ip=\"10.0.0.5\",\n    reason=\"Invalid credentials\",\n)\nlogger.warn(\n    \"Failed login attempt\",\n    username=\"suspicious_user\",\n    ip=\"10.0.0.5\",\n    reason=\"Invalid credentials\",\n)\nlogger.debug(\"Debug message\", user_id=\"user_123\")\nlogger.warn(\n    \"Failed login attempt\",\n    username=\"suspicious_user\",\n    ip=\"10.0.0.5\",\n    reason=\"Invalid credentials\",\n)\n```\n\n#### JSON Format\n\n```json\n{\"timestamp\": \"2025-02-09T00:25:39.953773+03:00\", \"module\": \"AUTH\", \"priority\": \"P20\", \"message\": \"Starting authentication process\", \"level\": \"INFO\", \"client_ip\": \"192.168.1.100\"}\n{\"timestamp\": \"2025-02-09T00:25:39.954158+03:00\", \"module\": \"AUTH\", \"priority\": \"P20\", \"message\": \"Login successful\", \"level\": \"INFO\", \"user_id\": \"user_123\"}\n{\"timestamp\": \"2025-02-09T00:25:39.954199+03:00\", \"module\": \"AUTH\", \"priority\": \"P40\", \"message\": \"Login failed\", \"level\": \"ERROR\", \"username\": \"suspicious_user\", \"ip\": \"10.0.0.5\", \"reason\": \"Invalid credentials\"}\n{\"timestamp\": \"2025-02-09T00:25:39.954224+03:00\", \"module\": \"AUTH\", \"priority\": \"P30\", \"message\": \"Failed login attempt\", \"level\": \"WARNING\", \"username\": \"suspicious_user\", \"ip\": \"10.0.0.5\", \"reason\": \"Invalid credentials\"}\n{\"timestamp\": \"2025-02-09T00:25:39.954260+03:00\", \"module\": \"AUTH\", \"priority\": \"P10\", \"message\": \"Debug message\", \"level\": \"DEBUG\", \"user_id\": \"user_123\"}\n```\n\n```python\nconfig = ZLogConfig(\n    module=Module.AUTH.value,\n    json_format=False,\n    log_path=\"logs/auth\",\n)\n```\n\n#### TEXT Format\n\n```json\n[INFO]:[P20] [2025-02-09T00:27:14.375037+03:00] Starting authentication process {\"level\": \"INFO\", \"client_ip\": \"192.168.1.100\"}\n[INFO]:[P20] [2025-02-09T00:27:14.375318+03:00] Login successful {\"level\": \"INFO\", \"user_id\": \"user_123\"}\n[ERROR]:[P40] [2025-02-09T00:27:14.375380+03:00] Login failed {\"level\": \"ERROR\", \"username\": \"suspicious_user\", \"ip\": \"10.0.0.5\", \"reason\": \"Invalid credentials\"}\n[WARNING]:[P30] [2025-02-09T00:27:14.375410+03:00] Failed login attempt {\"level\": \"WARNING\", \"username\": \"suspicious_user\", \"ip\": \"10.0.0.5\", \"reason\": \"Invalid credentials\"}\n[DEBUG]:[P10] [2025-02-09T00:27:14.375453+03:00] Debug message {\"level\": \"DEBUG\", \"user_id\": \"user_123\"}\n```\n\n\n#### Example 2\n\nIn this example, we will use the `ZLogMiddleware` class to log requests and responses, with both JSON and TEXT formats for the `PAYMENT` module.\n\n#### example2.py\n```python\nfrom fastapi import FastAPI\nfrom examples.modules import Module\nfrom zlogger_kit import ZLogMiddleware, ZLog, ZLogConfig\nfrom examples.routers.payment_router import router as payment_router\n\napp = FastAPI(title=\"Payment Service\", description=\"API for payment processing\")\n\nzlogger = ZLog.init(\n    ZLogConfig(\n        module=Module.PAYMENT.value,\n        log_path=\"logs\",\n        time_zone=\"Asia/Riyadh\",\n        json_format=True,\n    )\n)\n\napp.add_middleware(ZLogMiddleware, logger=zlogger)\n\napp.include_router(payment_router)\n\n\n@app.get(\"/health\")\nasync def health():\n    \"\"\"Health check endpoint\"\"\"\n    return {\"status\": \"healthy\"}\n\n\n@app.get(\"/\")\nasync def root():\n    return {\"message\": \"Welcome to the Payment Service API \ud83d\udcb8\"}\n```\n\n#### routers/payment_router.py\n```python\nfrom fastapi import APIRouter, HTTPException\nfrom examples.modules import Module\nfrom zlogger_kit import ZLogConfig, ZLog\n\nrouter = APIRouter(\n    prefix=\"/payments\",\n    tags=[\"payments\"],\n    responses={404: {\"description\": \"Not found\"}},\n)\n\nlogger = ZLog.init(\n    ZLogConfig(\n        module=Module.PAYMENT.value,\n        log_path=\"logs\",\n        time_zone=\"Asia/Riyadh\",\n        json_format=True,\n    )\n)\n\n\n@router.post(\"\")\nasync def create_payment():\n    \"\"\"Create a new payment\"\"\"\n    try:\n        return {\"payment_id\": \"pay_123\", \"status\": \"succeeded\", \"amount\": 1000}\n    except Exception as e:\n        logger.error(f\"Payment failed: {str(e)}\")\n        raise HTTPException(status_code=400, detail=\"Payment failed\")\n\n\n@router.get(\"/{payment_id}\")\nasync def get_payment(payment_id: str):\n    \"\"\"Get payment details by ID\"\"\"\n    return {\n        \"payment_id\": payment_id,\n        \"status\": \"succeeded\",\n        \"amount\": 1000,\n        \"created_at\": \"2024-03-20T10:00:00Z\",\n    }\n\n\n@router.post(\"/{payment_id}/refund\")\nasync def refund_payment(payment_id: str):\n    \"\"\"Refund a payment\"\"\"\n    try:\n        return {\n            \"refund_id\": \"ref_123\",\n            \"payment_id\": payment_id,\n            \"status\": \"succeeded\",\n            \"amount\": 1000,\n        }\n    except Exception as e:\n        logger.error(f\"Refund failed: {str(e)}\")\n        raise HTTPException(status_code=400, detail=\"Refund failed\")\n```\n\n\n#### Run the example\n\n```bash\n$ poetry run uvicorn examples.example2:app --reload\n```\n\n#### TEXT Format (logs/payment-2025-02-08.log)\n```text\n[INFO]:[P20] [2025-02-08T21:01:35.591221+00:00] POST http://127.0.0.1:8000/payments {\"level\": \"INFO\", \"operation\": \"request\", \"method\": \"POST\", \"url\": \"http://127.0.0.1:8000/payments\", \"ip\": \"127.0.0.1\"}\n[INFO]:[P20] [2025-02-08T21:01:35.592402+00:00] 200 {\"level\": \"INFO\", \"operation\": \"response\", \"status_code\": 200, \"ip\": \"127.0.0.1\"}\n[INFO]:[P20] [2025-02-08T21:01:40.856986+00:00] GET http://127.0.0.1:8000/payments/xx {\"level\": \"INFO\", \"operation\": \"request\", \"method\": \"GET\", \"url\": \"http://127.0.0.1:8000/payments/xx\", \"ip\": \"127.0.0.1\"}\n[INFO]:[P20] [2025-02-08T21:01:40.857824+00:00] 200 {\"level\": \"INFO\", \"operation\": \"response\", \"status_code\": 200, \"ip\": \"127.0.0.1\"}\n[INFO]:[P20] [2025-02-08T21:01:41.037139+00:00] GET http://127.0.0.1:8000/health {\"level\": \"INFO\", \"operation\": \"request\", \"method\": \"GET\", \"url\": \"http://127.0.0.1:8000/health\", \"ip\": \"127.0.0.1\"}\n```\n\n#### JSON Format (logs/payment-2025-02-08.json)\n```json\n{\"timestamp\": \"2025-02-09T01:26:43.047064+03:00\", \"module\": \"PAYMENT\", \"priority\": \"P20\", \"message\": \"POST http://127.0.0.1:8000/payments\", \"level\": \"INFO\", \"operation\": \"request\", \"method\": \"POST\", \"url\": \"http://127.0.0.1:8000/payments\", \"ip\": \"127.0.0.1\"}\n{\"timestamp\": \"2025-02-09T01:26:43.048061+03:00\", \"module\": \"PAYMENT\", \"priority\": \"P20\", \"message\": \"200\", \"level\": \"INFO\", \"operation\": \"response\", \"status_code\": 200, \"ip\": \"127.0.0.1\"}\n{\"timestamp\": \"2025-02-09T01:26:48.822486+03:00\", \"module\": \"PAYMENT\", \"priority\": \"P20\", \"message\": \"GET http://127.0.0.1:8000/payments/xx\", \"level\": \"INFO\", \"operation\": \"request\", \"method\": \"GET\", \"url\": \"http://127.0.0.1:8000/payments/xx\", \"ip\": \"127.0.0.1\"}\n{\"timestamp\": \"2025-02-09T01:26:48.826271+03:00\", \"module\": \"PAYMENT\", \"priority\": \"P20\", \"message\": \"200\", \"level\": \"INFO\", \"operation\": \"response\", \"status_code\": 200, \"ip\": \"127.0.0.1\"}\n{\"timestamp\": \"2025-02-09T01:26:48.971760+03:00\", \"module\": \"PAYMENT\", \"priority\": \"P20\", \"message\": \"GET http://127.0.0.1:8000/health\", \"level\": \"INFO\", \"operation\": \"request\", \"method\": \"GET\", \"url\": \"http://127.0.0.1:8000/health\", \"ip\": \"127.0.0.1\"}\n```\n\n## Unit Tests\n\n```bash\n$ poetry run pytest\n```\n\n![Unit Tests](https://github.com/anqorithm/zlogger_kit/raw/main/assets/1.png)\n\n\n## Contributing\n\nContributions are welcome! Please feel free to submit a PR.\n\n\n## Contributors\n\n- [Abdullah Alqahtani](https://github.com/anqorithm)\n\n## License\n\nThis project is licensed under the MIT License. See the [LICENSE](LICENSE) file for details.",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "ZLogger Kit is a simple logging kit that abstracts structlog to provide a more intuitive and flexible logging experience. It provides middleware for logging requests and responses, as well as a logger for logging messages, with priority levels P10, P20, P30, P40 for each log level: [WARNING, INFO, DEBUG, ERROR].",
    "version": "0.0.5",
    "project_urls": null,
    "split_keywords": [],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "12dd968e216b09a1a6452bcb80a8d9b152b5ca5b99561fd2f104e3732da99117",
                "md5": "e902ca017f09fc2eb2f132ef277adb65",
                "sha256": "fa47189d50bdac41e6b1d9b4ef4505f9ea2259f86de6cb95fa91c07740f6ff2f"
            },
            "downloads": -1,
            "filename": "zlogger_kit-0.0.5-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "e902ca017f09fc2eb2f132ef277adb65",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": "<4.0,>=3.11",
            "size": 9508,
            "upload_time": "2025-02-09T07:48:46",
            "upload_time_iso_8601": "2025-02-09T07:48:46.382233Z",
            "url": "https://files.pythonhosted.org/packages/12/dd/968e216b09a1a6452bcb80a8d9b152b5ca5b99561fd2f104e3732da99117/zlogger_kit-0.0.5-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "c623337c3e1d29004fc3caf64edf3229fe151aef9459a1ad2f68ac03276e11ef",
                "md5": "8f5fe11b3a5bd91478b928a287a1883b",
                "sha256": "02cf304a638cb5162ba1b0ab37deefad7b38f9e5a9d06d20f77a0bcfb3138710"
            },
            "downloads": -1,
            "filename": "zlogger_kit-0.0.5.tar.gz",
            "has_sig": false,
            "md5_digest": "8f5fe11b3a5bd91478b928a287a1883b",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": "<4.0,>=3.11",
            "size": 10442,
            "upload_time": "2025-02-09T07:48:48",
            "upload_time_iso_8601": "2025-02-09T07:48:48.622110Z",
            "url": "https://files.pythonhosted.org/packages/c6/23/337c3e1d29004fc3caf64edf3229fe151aef9459a1ad2f68ac03276e11ef/zlogger_kit-0.0.5.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-02-09 07:48:48",
    "github": false,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "lcname": "zlogger-kit"
}
        
Elapsed time: 0.40371s