{"id":41473015,"url":"https://github.com/kirky-x/inklog","last_synced_at":"2026-01-24T17:00:40.463Z","repository":{"id":333237665,"uuid":"1136462742","full_name":"Kirky-X/inklog","owner":"Kirky-X","description":" A high-performance, secure, and feature-rich logging solution built on Tokio. Features multi-target output (console, file, database, S3), AES-256-GCM encryption, Regex-based PII masking, log rotation \u0026 compression, structured logging, health monitoring, and metrics.","archived":false,"fork":false,"pushed_at":"2026-01-18T06:13:03.000Z","size":594,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-01-24T06:23:43.623Z","etag":null,"topics":["encryption","loggin","observability","rust"],"latest_commit_sha":null,"homepage":"https://crates.io/crates/inklog","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Kirky-X.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"docs/CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"docs/SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-01-17T18:26:33.000Z","updated_at":"2026-01-18T06:13:07.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/Kirky-X/inklog","commit_stats":null,"previous_names":["kirky-x/inklog"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/Kirky-X/inklog","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Kirky-X%2Finklog","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Kirky-X%2Finklog/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Kirky-X%2Finklog/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Kirky-X%2Finklog/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Kirky-X","download_url":"https://codeload.github.com/Kirky-X/inklog/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Kirky-X%2Finklog/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28732216,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-24T10:24:43.181Z","status":"ssl_error","status_checked_at":"2026-01-24T10:24:36.112Z","response_time":89,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["encryption","loggin","observability","rust"],"created_at":"2026-01-23T16:51:26.508Z","updated_at":"2026-01-24T17:00:40.447Z","avatar_url":"https://github.com/Kirky-X.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n\u003cimg src=\"resource/inklog.png\" alt=\"Inklog Logo\" width=\"200\" style=\"margin-bottom: 16px;\"\u003e\n\n\u003cp\u003e\n  \u003c!-- CI/CD Status --\u003e\n  \u003ca href=\"https://github.com/Kirky-X/inklog/actions/workflows/ci.yml\"\u003e\n    \u003cimg src=\"https://github.com/Kirky-X/inklog/actions/workflows/ci.yml/badge.svg\" alt=\"CI Status\" style=\"display:inline;margin:0 4px;\"\u003e\n  \u003c/a\u003e\n  \u003c!-- Version --\u003e\n  \u003ca href=\"https://crates.io/crates/inklog\"\u003e\n    \u003cimg src=\"https://img.shields.io/crates/v/inklog.svg\" alt=\"Version\" style=\"display:inline;margin:0 4px;\"\u003e\n  \u003c/a\u003e\n  \u003c!-- Documentation --\u003e\n  \u003ca href=\"https://docs.rs/inklog\"\u003e\n    \u003cimg src=\"https://docs.rs/inklog/badge.svg\" alt=\"Documentation\" style=\"display:inline;margin:0 4px;\"\u003e\n  \u003c/a\u003e\n  \u003c!-- Downloads --\u003e\n  \u003ca href=\"https://crates.io/crates/inklog\"\u003e\n    \u003cimg src=\"https://img.shields.io/crates/d/inklog.svg\" alt=\"Downloads\" style=\"display:inline;margin:0 4px;\"\u003e\n  \u003c/a\u003e\n  \u003c!-- License --\u003e\n  \u003ca href=\"https://github.com/Kirky-X/inklog/blob/main/LICENSE\"\u003e\n    \u003cimg src=\"https://img.shields.io/crates/l/inklog.svg\" alt=\"License\" style=\"display:inline;margin:0 4px;\"\u003e\n  \u003c/a\u003e\n  \u003c!-- Rust Version --\u003e\n  \u003ca href=\"https://www.rust-lang.org/\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/rust-1.75+-orange.svg\" alt=\"Rust 1.75+\" style=\"display:inline;margin:0 4px;\"\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cstrong\u003eEnterprise-grade Rust Logging Infrastructure\u003c/strong\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"#features\" style=\"color:#3B82F6;\"\u003e✨ Features\u003c/a\u003e •\n  \u003ca href=\"#quick-start\" style=\"color:#3B82F6;\"\u003e🚀 Quick Start\u003c/a\u003e •\n  \u003ca href=\"#documentation\" style=\"color:#3B82F6;\"\u003e📚 Documentation\u003c/a\u003e •\n  \u003ca href=\"#examples\" style=\"color:#3B82F6;\"\u003e💻 Examples\u003c/a\u003e •\n  \u003ca href=\"#contributing\" style=\"color:#3B82F6;\"\u003e🤝 Contributing\u003c/a\u003e\n\u003c/p\u003e\n\n\u003c/div\u003e\n\n---\n\n### 🎯 A high-performance, secure, and feature-rich logging infrastructure built on Tokio\n\nInklog provides a **comprehensive** logging solution for enterprise applications:\n\n| ⚡ High Performance | 🔒 Security First | 🌐 Multi-Target | 📊 Observability |\n|:---------:|:----------:|:--------------:|:--------:|\n| Async I/O with Tokio | AES-256-GCM encryption | Console, File, DB, S3 | Health monitoring |\n| Batch writes \u0026 compression | Zeroized secret memory | Automatic rotation | Metrics \u0026 tracing |\n\n```rust\nuse inklog::{InklogConfig, LoggerManager};\nuse std::path::PathBuf;\n\n#[tokio::main]\nasync fn main() -\u003e Result\u003c(), Box\u003cdyn std::error::Error\u003e\u003e {\n    let config = InklogConfig {\n        file_sink: Some(inklog::FileSinkConfig {\n            enabled: true,\n            path: \"logs/app.log\".into(),\n            max_size: \"100MB\".into(),\n            compress: true,\n            ..Default::default()\n        }),\n        ..Default::default()\n    };\n\n    let _logger = LoggerManager::with_config(config).await?;\n\n    log::info!(\"Application started successfully\");\n    log::error!(\"Something went wrong with error details\");\n\n    Ok(())\n}\n```\n\n---\n\n## 📋 Table of Contents\n\n\u003cdetails open style=\"border-radius:8px; padding:16px; border:1px solid #E2E8F0;\"\u003e\n\u003csummary style=\"cursor:pointer; font-weight:600; color:#1E293B;\"\u003e📑 Table of Contents (Click to expand)\u003c/summary\u003e\n\n- [✨ Features](#features)\n- [🚀 Quick Start](#quick-start)\n  - [📦 Installation](#installation)\n  - [💡 Basic Usage](#basic-usage)\n  - [🔧 Advanced Configuration](#advanced-configuration)\n- [🎨 Feature Flags](#feature-flags)\n- [📚 Documentation](#documentation)\n- [💻 Examples](#examples)\n- [🏗️ Architecture](#architecture)\n- [🔒 Security](#security)\n- [🧪 Testing](#testing)\n- [🤝 Contributing](#contributing)\n- [📄 License](#license)\n- [🙏 Acknowledgments](#acknowledgments)\n\n\u003c/details\u003e\n\n---\n\n## \u003cspan id=\"features\"\u003e✨ Features\u003c/span\u003e\n\n\u003cdiv align=\"center\" style=\"margin: 24px 0;\"\u003e\n\n| 🎯 Core Features | ⚡ Enterprise Features |\n|:----------:|:----------:|\n| Always Available | Optional |\n\n\u003c/div\u003e\n\n\u003ctable style=\"width:100%; border-collapse: collapse;\"\u003e\n\u003ctr\u003e\n\u003ctd width=\"50%\" style=\"vertical-align:top; padding: 16px; border-radius:8px; border:1px solid #E2E8F0;\"\u003e\n\n### 🎯 Core Features (Always Available)\n\n| Status | Feature | Description |\n|:----:|------|------|\n| ✅ | **Async I/O** | Tokio-powered non-blocking logging |\n| ✅ | **Multi-Target Output** | Console, file, database, custom sinks |\n| ✅ | **Structured Logging** | tracing ecosystem integration |\n| ✅ | **Custom Formatting** | Template-based log format |\n| ✅ | **File Rotation** | Size-based and time-based rotation |\n| ✅ | **Data Masking** | Regex-based PII redaction |\n| ✅ | **Health Monitoring** | Sink status and metrics tracking |\n| ✅ | **CLI Tools** | decrypt, generate, validate commands |\n\n\u003c/td\u003e\n\u003ctd width=\"50%\" style=\"vertical-align:top; padding: 16px; border-radius:8px; border:1px solid #E2E8F0;\"\u003e\n\n### ⚡ Enterprise Features\n\n| Status | Feature | Description |\n|:----:|------|------|\n| 🔍 | **Compression** | ZSTD, GZIP, Brotli, LZ4 support (`zstd`, `flate2`, etc.) |\n| 🔒 | **Encryption** | AES-256-GCM file encryption (`aes-gcm`) |\n| 🗄️ | **Database Sink** | PostgreSQL, MySQL, SQLite via Sea-ORM |\n| ☁️ | **S3 Archive** | Cloud log archival with AWS SDK S3 (`aws` feature) |\n| 📊 | **Parquet Export** | Analytics-ready log format (`parquet` feature) |\n| 🌐 | **HTTP Endpoint** | Axum-based health check server (`http` feature) |\n| 📅 | **Scheduled Tasks** | Cron-based archive scheduling |\n| 🔧 | **CLI Tools** | Utility commands for log management (`cli` feature) |\n| 📝 | **TOML Config** | External configuration support (`confers` feature) |\n\n\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/table\u003e\n\n### 📦 Feature Presets\n\n| Preset | Features | Use Case |\n|------|------|----------|\n| \u003cspan style=\"color:#166534; padding:4px 8px; border-radius:4px;\"\u003eminimal\u003c/span\u003e | No optional features | Core logging only |\n| \u003cspan style=\"color:#1E40AF; padding:4px 8px; border-radius:4px;\"\u003estandard\u003c/span\u003e | `http`, `cli` | Standard development setup |\n| \u003cspan style=\"color:#991B1B; padding:4px 8px; border-radius:4px;\"\u003efull\u003c/span\u003e | All default features | Production-ready logging |\n\n---\n\n## \u003cspan id=\"quick-start\"\u003e🚀 Quick Start\u003c/span\u003e\n\n### \u003cspan id=\"installation\"\u003e📦 Installation\u003c/span\u003e\n\nAdd this to your `Cargo.toml`:\n\n```toml\n[dependencies]\ninklog = \"0.1\"\n```\n\nFor full feature set:\n\n```toml\n[dependencies]\ninklog = { version = \"0.1\", features = [\"default\"] }\n```\n\n### \u003cspan id=\"basic-usage\"\u003e💡 Basic Usage\u003c/span\u003e\n\n\u003cdiv align=\"center\" style=\"margin: 24px 0;\"\u003e\n\n#### 🎬 5-Minute Quick Start\n\n\u003c/div\u003e\n\n\u003ctable style=\"width:100%; border-collapse: collapse;\"\u003e\n\u003ctr\u003e\n\u003ctd width=\"50%\" style=\"padding: 16px; vertical-align:top;\"\u003e\n\n**Step 1: Initialize Logger**\n\n```rust\nuse inklog::LoggerManager;\n\n#[tokio::main]\nasync fn main() -\u003e Result\u003c(), Box\u003cdyn std::error::Error\u003e\u003e {\n    let _logger = LoggerManager::new().await?;\n\n    log::info!(\"Logger initialized\");\n    Ok(())\n}\n```\n\n\u003c/td\u003e\n\u003ctd width=\"50%\" style=\"padding: 16px; vertical-align:top;\"\u003e\n\n**Step 2: Log Messages**\n\n```rust\nuse inklog::LoggerManager;\n\n#[tokio::main]\nasync fn main() -\u003e Result\u003c(), Box\u003cdyn std::error::Error\u003e\u003e {\n    let _logger = LoggerManager::new().await?;\n\n    log::trace!(\"Trace message\");\n    log::debug!(\"Debug message\");\n    log::info!(\"Info message\");\n    log::warn!(\"Warning message\");\n    log::error!(\"Error message\");\n\n    Ok(())\n}\n```\n\n\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd width=\"50%\" style=\"padding: 16px; vertical-align:top;\"\u003e\n\n**Step 3: File Logging**\n\n```rust\nuse inklog::{FileSinkConfig, InklogConfig, LoggerManager};\n\nlet config = InklogConfig {\n    file_sink: Some(FileSinkConfig {\n        enabled: true,\n        path: \"logs/app.log\".into(),\n        max_size: \"10MB\".into(),\n        rotation_time: \"daily\".into(),\n        keep_files: 7,\n        compress: true,\n        ..Default::default()\n    }),\n    ..Default::default()\n};\n\nlet _logger = LoggerManager::with_config(config).await?;\n```\n\n\u003c/td\u003e\n\u003ctd width=\"50%\" style=\"padding: 16px; vertical-align:top;\"\u003e\n\n**Step 4: Database Logging**\n\n```rust\nuse inklog::{DatabaseSinkConfig, InklogConfig, config::DatabaseDriver};\n\nlet config = InklogConfig {\n    database_sink: Some(DatabaseSinkConfig {\n        enabled: true,\n        driver: DatabaseDriver::SQLite,\n        url: \"sqlite://logs/app.db\".to_string(),\n        pool_size: 5,\n        batch_size: 100,\n        flush_interval_ms: 1000,\n        ..Default::default()\n    }),\n    ..Default::default()\n};\n\nlet _logger = LoggerManager::with_config(config).await?;\n```\n\n\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/table\u003e\n\n### \u003cspan id=\"advanced-configuration\"\u003e🔧 Advanced Configuration\u003c/span\u003e\n\n#### Encrypted File Logging\n\n```rust\nuse inklog::{FileSinkConfig, InklogConfig};\n\n// Set encryption key from environment\nstd::env::set_var(\"INKLOG_ENCRYPTION_KEY\", \"base64-encoded-32-byte-key\");\n\nlet config = InklogConfig {\n    file_sink: Some(FileSinkConfig {\n        enabled: true,\n        path: \"logs/encrypted.log.enc\".into(),\n        max_size: \"10MB\".into(),\n        encrypt: true,\n        encryption_key_env: Some(\"INKLOG_ENCRYPTION_KEY\".into()),\n        compress: false, // Don't compress encrypted logs\n        ..Default::default()\n    }),\n    ..Default::default()\n};\n\nlet _logger = LoggerManager::with_config(config).await?;\n```\n\n#### S3 Cloud Archiving\n\n```rust\nuse inklog::{InklogConfig, S3ArchiveConfig};\n\nlet config = InklogConfig {\n    s3_archive: Some(S3ArchiveConfig {\n        enabled: true,\n        bucket: \"my-log-bucket\".to_string(),\n        region: \"us-west-2\".to_string(),\n        archive_interval_days: 7,\n        local_retention_days: 30,\n        prefix: \"logs/\".to_string(),\n        compression: inklog::archive::CompressionType::Zstd,\n        ..Default::default()\n    }),\n    ..Default::default()\n};\n\nlet manager = LoggerManager::with_config(config).await?;\nmanager.start_archive_service().await?;\n```\n\n#### Custom Log Format\n\n```rust\nuse inklog::{InklogConfig, config::GlobalConfig};\n\nlet format_string = \"[{timestamp}] [{level:\u003e5}] {target} - {message} | {file}:{line}\";\n\nlet config = InklogConfig {\n    global: GlobalConfig {\n        level: \"debug\".into(),\n        format: format_string.to_string(),\n        masking_enabled: true,\n        ..Default::default()\n    },\n    ..Default::default()\n};\n\nlet _logger = LoggerManager::with_config(config).await?;\n```\n\n---\n\n## \u003cspan id=\"feature-flags\"\u003e🎨 Feature Flags\u003c/span\u003e\n\n### Default Features\n\n```toml\ninklog = \"0.1\"  # Includes: aws, http, cli\n```\n\n### Optional Features\n\n```toml\n# Cloud \u0026 Storage\ninklog = { version = \"0.1\", features = [\n    \"aws\",        # AWS S3 archive support\n] }\n\n# HTTP Server\ninklog = { version = \"0.1\", features = [\n    \"http\",       # Axum HTTP health endpoint\n] }\n\n# CLI Tools\ninklog = { version = \"0.1\", features = [\n    \"cli\",        # decrypt, generate, validate commands\n] }\n\n# Configuration\ninklog = { version = \"0.1\", features = [\n    \"confers\",    # TOML configuration support\n] }\n\n# Development\ninklog = { version = \"0.1\", features = [\n    \"test-local\", # Local testing mode\n    \"debug\",     # Additional security audit logging\n] }\n```\n\n### Feature Details\n\n| Feature | Dependencies | Description |\n|---------|-------------|-------------|\n| **aws** | aws-sdk-s3, aws-config, aws-types | AWS S3 cloud archive |\n| **http** | axum | HTTP health check endpoint |\n| **cli** | clap, glob, toml | Command-line utilities |\n| **confers** | confers, toml | External TOML configuration support |\n| **test-local** | - | Local testing mode |\n| **debug** | - | Security audit logging |\n\n---\n\n## \u003cspan id=\"documentation\"\u003e📚 Documentation\u003c/span\u003e\n\n\u003cdiv align=\"center\" style=\"margin: 24px 0;\"\u003e\n\n\u003ctable style=\"width:100%; max-width: 800px;\"\u003e\n\u003ctr\u003e\n\u003ctd align=\"center\" width=\"33%\" style=\"padding: 16px;\"\u003e\n\u003ca href=\"https://docs.rs/inklog\" style=\"text-decoration:none;\"\u003e\n\u003cdiv style=\"padding: 24px; border-radius:12px; transition: transform 0.2s;\"\u003e\n\u003cb style=\"color:#1E293B;\"\u003e📘 API Reference\u003c/b\u003e\n\u003c/div\u003e\n\u003c/a\u003e\n\u003cbr\u003e\u003cspan style=\"color:#64748B;\"\u003eComplete API docs\u003c/span\u003e\n\u003c/td\u003e\n\u003ctd align=\"center\" width=\"33%\" style=\"padding: 16px;\"\u003e\n\u003ca href=\"examples/\" style=\"text-decoration:none;\"\u003e\n\u003cdiv style=\"padding: 24px; border-radius:12px; transition: transform 0.2s;\"\u003e\n\u003cb style=\"color:#1E293B;\"\u003e💻 Examples\u003c/b\u003e\n\u003c/div\u003e\n\u003c/a\u003e\n\u003cbr\u003e\u003cspan style=\"color:#64748B;\"\u003eWorking code examples\u003c/span\u003e\n\u003c/td\u003e\n\u003ctd align=\"center\" width=\"33%\" style=\"padding: 16px;\"\u003e\n\u003ca href=\"docs/\" style=\"text-decoration:none;\"\u003e\n\u003cdiv style=\"padding: 24px; border-radius:12px; transition: transform 0.2s;\"\u003e\n\u003cb style=\"color:#1E293B;\"\u003e📖 Guides\u003c/b\u003e\n\u003c/div\u003e\n\u003c/a\u003e\n\u003cbr\u003e\u003cspan style=\"color:#64748B;\"\u003eIn-depth guides\u003c/span\u003e\n\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/table\u003e\n\n\u003c/div\u003e\n\n### 📖 Additional Resources\n\n| Resource | Description |\n|----------|-------------|\n| 📘 [API Reference](https://docs.rs/inklog) | Complete API documentation on docs.rs |\n| 🏗️ [Architecture](docs/ARCHITECTURE.md) | System architecture and design decisions |\n| 🔒 [Security](docs/SECURITY.md) | Security best practices and features |\n| 📦 [Examples](examples/) | Working code examples for all features |\n\n---\n\n## \u003cspan id=\"examples\"\u003e💻 Examples\u003c/span\u003e\n\n\u003cdiv align=\"center\" style=\"margin: 24px 0;\"\u003e\n\n### 💡 Real-world Examples\n\n\u003c/div\u003e\n\n\u003ctable style=\"width:100%; border-collapse: collapse;\"\u003e\n\u003ctr\u003e\n\u003ctd width=\"50%\" style=\"padding: 16px; border-radius:8px; border:1px solid #E2E8F0; vertical-align:top;\"\u003e\n\n#### 📝 Basic Logging\n\n```rust\nuse inklog::LoggerManager;\n\n#[tokio::main]\nasync fn main() -\u003e Result\u003c(), Box\u003cdyn std::error::Error\u003e\u003e {\n    let _logger = LoggerManager::new().await?;\n\n    log::info!(\"Application started\");\n    log::error!(\"An error occurred: {}\", err);\n\n    Ok(())\n}\n```\n\n\u003c/td\u003e\n\u003ctd width=\"50%\" style=\"padding: 16px; border-radius:8px; border:1px solid #E2E8F0; vertical-align:top;\"\u003e\n\n#### 📁 File Logging with Rotation\n\n```rust\nuse inklog::{FileSinkConfig, InklogConfig, LoggerManager};\n\nlet config = InklogConfig {\n    file_sink: Some(FileSinkConfig {\n        enabled: true,\n        path: \"logs/app.log\".into(),\n        max_size: \"10MB\".into(),\n        rotation_time: \"daily\".into(),\n        keep_files: 7,\n        compress: true,\n        ..Default::default()\n    }),\n    ..Default::default()\n};\n\nlet _logger = LoggerManager::with_config(config).await?;\n```\n\n\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd width=\"50%\" style=\"padding: 16px; border-radius:8px; border:1px solid #E2E8F0; vertical-align:top;\"\u003e\n\n#### 🔒 Encrypted Logging\n\n```rust\nuse inklog::{FileSinkConfig, InklogConfig};\n\nstd::env::set_var(\"INKLOG_ENCRYPTION_KEY\", \"base64-encoded-key\");\n\nlet config = InklogConfig {\n    file_sink: Some(FileSinkConfig {\n        enabled: true,\n        path: \"logs/encrypted.log\".into(),\n        encrypt: true,\n        encryption_key_env: Some(\"INKLOG_ENCRYPTION_KEY\".into()),\n        ..Default::default()\n    }),\n    ..Default::default()\n};\n\nlet _logger = LoggerManager::with_config(config).await?;\n```\n\n\u003c/td\u003e\n\u003ctd width=\"50%\" style=\"padding: 16px; border-radius:8px; border:1px solid #E2E8F0; vertical-align:top;\"\u003e\n\n#### 🗄️ Database Logging\n\n```rust\nuse inklog::{DatabaseSinkConfig, InklogConfig, config::DatabaseDriver};\n\nlet config = InklogConfig {\n    database_sink: Some(DatabaseSinkConfig {\n        enabled: true,\n        driver: DatabaseDriver::PostgreSQL,\n        url: \"postgresql://localhost/logs\".to_string(),\n        pool_size: 10,\n        batch_size: 100,\n        flush_interval_ms: 1000,\n        ..Default::default()\n    }),\n    ..Default::default()\n};\n\nlet _logger = LoggerManager::with_config(config).await?;\n```\n\n\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd width=\"50%\" style=\"padding: 16px; border-radius:8px; border:1px solid #E2E8F0; vertical-align:top;\"\u003e\n\n#### ☁️ S3 Cloud Archive\n\n```rust\nuse inklog::{InklogConfig, S3ArchiveConfig};\n\nlet config = InklogConfig {\n    s3_archive: Some(S3ArchiveConfig {\n        enabled: true,\n        bucket: \"my-log-bucket\".to_string(),\n        region: \"us-west-2\".to_string(),\n        archive_interval_days: 7,\n        local_retention_days: 30,\n        prefix: \"logs/\".to_string(),\n        compression: inklog::archive::CompressionType::Zstd,\n        ..Default::default()\n    }),\n    ..Default::default()\n};\n\nlet manager = LoggerManager::with_config(config).await?;\nmanager.start_archive_service().await?;\n```\n\n\u003c/td\u003e\n\u003ctd width=\"50%\" style=\"padding: 16px; border-radius:8px; border:1px solid #E2E8F0; vertical-align:top;\"\u003e\n\n#### 🏥 HTTP Health Endpoint\n\n```rust\nuse axum::{routing::get, Json, Router};\nuse inklog::LoggerManager;\nuse std::sync::Arc;\n\nlet logger = Arc::new(LoggerManager::new().await?);\n\nlet app = Router::new().route(\n    \"/health\",\n    get({\n        let logger = logger.clone();\n        || async move { Json(logger.get_health_status()) }\n    }),\n);\n\n// Start HTTP server...\n```\n\n\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd width=\"50%\" style=\"padding: 16px; border-radius:8px; border:1px solid #E2E8F0; vertical-align:top;\"\u003e\n\n#### 🎨 Custom Format\n\n```rust\nuse inklog::{InklogConfig, config::GlobalConfig};\n\nlet format_string = \"[{timestamp}] [{level:\u003e5}] {target} - {message}\";\n\nlet config = InklogConfig {\n    global: GlobalConfig {\n        level: \"debug\".into(),\n        format: format_string.to_string(),\n        masking_enabled: true,\n        ..Default::default()\n    },\n    ..Default::default()\n};\n\nlet _logger = LoggerManager::with_config(config).await?;\n```\n\n\u003c/td\u003e\n\u003ctd width=\"50%\" style=\"padding: 16px; border-radius:8px; border:1px solid #E2E8F0; vertical-align:top;\"\u003e\n\n#### 🔍 Data Masking\n\n```rust\nuse inklog::{InklogConfig, config::GlobalConfig};\n\nlet config = InklogConfig {\n    global: GlobalConfig {\n        level: \"info\".into(),\n        format: \"{timestamp} {level} {message}\".to_string(),\n        masking_enabled: true,  // Enable PII masking\n        ..Default::default()\n    },\n    ..Default::default()\n};\n\nlet _logger = LoggerManager::with_config(config).await?;\n\n// Sensitive data will be automatically masked\nlog::info!(\"User email: user@example.com\");\n// Output: User email: ***@***.***\n```\n\n\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/table\u003e\n\n\u003cdiv align=\"center\" style=\"margin: 24px 0;\"\u003e\n\n**[📂 View all examples →](examples/)**\n\n\u003c/div\u003e\n\n---\n\n## \u003cspan id=\"architecture\"\u003e🏗️ Architecture\u003c/span\u003e\n\n\u003cdiv align=\"center\" style=\"margin: 24px 0;\"\u003e\n\n### 🏗️ System Architecture\n\n\u003c/div\u003e\n\n```\n┌─────────────────────────────────────────────────┐\n│           Application Layer                    │\n│  (Your code using log! macros)             │\n└────────────────┬────────────────────────────┘\n                 │\n┌────────────────▼────────────────────────────┐\n│         Inklog API Layer                  │\n│  - LoggerManager, LoggerBuilder          │\n│  - Configuration management               │\n│  - Health monitoring                     │\n└────────────────┬────────────────────────────┘\n                 │\n┌────────────────▼────────────────────────────┐\n│         Sink Abstraction Layer             │\n│  - ConsoleSink                          │\n│  - FileSink (rotation, compression)     │\n│  - DatabaseSink (batch writes)           │\n│  - AsyncFileSink                        │\n│  - RingBufferedFileSink                 │\n└────────────────┬────────────────────────────┘\n                 │\n┌────────────────▼────────────────────────────┐\n│         Core Processing Layer              │\n│  - Log formatting \u0026 templates            │\n│  - Data masking (PII redaction)         │\n│  - Encryption (AES-256-GCM)             │\n│  - Compression (ZSTD, GZIP, Brotli)    │\n└────────────────┬────────────────────────────┘\n                 │\n┌────────────────▼────────────────────────────┐\n│         Concurrency \u0026 I/O                 │\n│  - Tokio async runtime                  │\n│  - Crossbeam channels                  │\n│  - Rayon parallel processing            │\n└────────────────┬────────────────────────────┘\n                 │\n┌────────────────▼────────────────────────────┐\n│         Storage \u0026 External Services        │\n│  - Filesystem                          │\n│  - Database (PostgreSQL, MySQL, SQLite)  │\n│  - AWS S3 (cloud archive)              │\n│  - Parquet (analytics)                 │\n└───────────────────────────────────────────┘\n```\n\n### Layer-by-Layer Explanation\n\n**Application Layer**\n- Application code uses standard `log!` macros from the `log` crate\n- Compatible with existing Rust logging patterns\n\n**Inklog API Layer**\n- `LoggerManager`: Main orchestrator for all logging operations\n- `LoggerBuilder`: Fluent builder pattern for configuration\n- Health status tracking and metrics collection\n\n**Sink Abstraction Layer**\n- Multiple sink implementations for different output targets\n- Console output for development\n- File output with rotation, compression, and encryption\n- Database output with batch writes (PostgreSQL, MySQL, SQLite)\n- Async and buffered file sinks for high-throughput scenarios\n\n**Core Processing Layer**\n- Template-based log formatting\n- Regex-based PII data masking (emails, SSNs, credit cards)\n- AES-256-GCM encryption for sensitive logs\n- Multiple compression algorithms (ZSTD, GZIP, Brotli, LZ4)\n\n**Concurrency \u0026 I/O Layer**\n- Tokio async runtime for non-blocking I/O\n- Crossbeam channels for inter-task communication\n- Rayon for CPU-intensive parallel processing\n\n**Storage \u0026 External Services Layer**\n- Local filesystem access\n- Database connectivity via Sea-ORM\n- AWS S3 integration for cloud archival\n- Parquet format for analytics workflows\n\n---\n\n## \u003cspan id=\"security\"\u003e🔒 Security\u003c/span\u003e\n\n\u003cdiv align=\"center\" style=\"margin: 24px 0;\"\u003e\n\n### 🛡️ Security Features\n\n\u003c/div\u003e\n\nInklog is built with security as a top priority:\n\n#### 🔒 Encryption\n\n- **AES-256-GCM**: Military-grade encryption for log files\n- **Key Management**: Environment variable-based key injection\n- **Zeroized Memory**: Secrets are securely cleared after use via `zeroize` crate\n- **SHA-256 Hashing**: Integrity verification for encrypted logs\n\n#### 🎭 Data Masking\n\n- **Regex-Based Patterns**: Automatic PII detection and redaction\n- **Email Masking**: `user@example.com` → `***@***.***`\n- **SSN Masking**: Credit card and social security number redaction\n- **Custom Patterns**: Configurable regex patterns for sensitive data\n\n#### 🔐 Secure Key Handling\n\n```rust\n// Set encryption key securely from environment\nstd::env::set_var(\"INKLOG_ENCRYPTION_KEY\", \"base64-encoded-32-byte-key\");\n\n// Key is automatically zeroized after use\n// Never hardcode keys in your application\n```\n\n#### 🛡️ Security Best Practices\n\n- **No hardcoded secrets**: Keys loaded from environment variables\n- **Minimal privileged operations**: Only necessary file/database access\n- **Audit logging**: Debug feature for security audit trails\n- **Compliance-ready**: Supports GDPR, HIPAA, PCI-DSS logging requirements\n\n---\n\n## \u003cspan id=\"testing\"\u003e🧪 Testing\u003c/span\u003e\n\n\u003cdiv align=\"center\" style=\"margin: 24px 0;\"\u003e\n\n### 🎯 Run Tests\n\n\u003c/div\u003e\n\n```bash\n# Run all tests with default features\ncargo test --all-features\n\n# Run tests with specific features\ncargo test --features \"aws,http,cli\"\n\n# Run tests in release mode\ncargo test --release\n\n# Run benchmarks\ncargo bench\n```\n\n### Test Coverage\n\nInklog targets **95%+ code coverage**:\n\n```bash\n# Generate coverage report\ncargo tarpaulin --out Html --all-features\n```\n\n### Linting and Formatting\n\n```bash\n# Format code\ncargo fmt --all\n\n# Check formatting without changes\ncargo fmt --all -- --check\n\n# Run Clippy (warnings as errors)\ncargo clippy --all-targets --all-features -- -D warnings\n```\n\n### Security Audit\n\n```bash\n# Run cargo deny for security checks\ncargo deny check\n\n# Check for advisories\ncargo deny check advisories\n\n# Check for banned licenses\ncargo deny check bans\n```\n\n### Integration Tests\n\n```bash\n# Run integration tests\ncargo test --test '*'\n\n# Run with Docker services (PostgreSQL, MySQL)\ndocker-compose up -d\ncargo test --all-features\ndocker-compose down\n```\n\n---\n\n## \u003cspan id=\"contributing\"\u003e🤝 Contributing\u003c/span\u003e\n\n\u003cdiv align=\"center\" style=\"margin: 24px 0;\"\u003e\n\nContributions are welcome! Please see [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.\n\n\u003c/div\u003e\n\n### Development Setup\n\n```bash\n# Clone repository\ngit clone https://github.com/Kirky-X/inklog.git\ncd inklog\n\n# Install pre-commit hooks (if available)\n./scripts/install-pre-commit.sh\n\n# Run tests\ncargo test --all-features\n\n# Run linter\ncargo clippy --all-features\n\n# Format code\ncargo fmt --all\n```\n\n### Pull Request Process\n\n1. Fork the repository\n2. Create a feature branch (`git checkout -b feature/amazing-feature`)\n3. Make your changes\n4. Run tests and ensure all pass (`cargo test --all-features`)\n5. Run clippy and fix warnings (`cargo clippy --all-features`)\n6. Commit your changes (`git commit -m 'Add amazing feature'`)\n7. Push to the branch (`git push origin feature/amazing-feature`)\n8. Open a Pull Request\n\n### Code Style\n\n- Follow Rust naming conventions (snake_case for variables, PascalCase for types)\n- Use `thiserror` for error types\n- Use `anyhow` for error contexts\n- Add doc comments to all public APIs\n- Run `cargo fmt` before committing\n\n---\n\n## \u003cspan id=\"license\"\u003e📄 License\u003c/span\u003e\n\n\u003cdiv align=\"center\" style=\"margin: 24px 0;\"\u003e\n\nThis project is dual-licensed under **MIT / Apache-2.0**:\n\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE-MIT)\n[![License: Apache-2.0](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](LICENSE-APACHE)\n\n\u003c/div\u003e\n\n---\n\n## \u003cspan id=\"acknowledgments\"\u003e🙏 Acknowledgments\u003c/span\u003e\n\n\u003cdiv align=\"center\" style=\"margin: 24px 0;\"\u003e\n\n### 🌟 Built on Excellent Tools\n\n\u003c/div\u003e\n\nInklog wouldn't be possible without these amazing projects:\n\n- [tracing](https://github.com/tokio-rs/tracing) - The foundation of Rust structured logging\n- [tokio](https://tokio.rs/) - Async runtime for Rust\n- [Sea-ORM](https://www.sea-ql.org/SeaORM/) - Async ORM for database operations\n- [AWS SDK for Rust](https://github.com/awslabs/aws-sdk-rust) - AWS S3 integration\n- [axum](https://github.com/tokio-rs/axum) - Web framework for HTTP endpoints\n- [serde](https://serde.rs/) - Serialization framework\n- The entire Rust ecosystem for amazing tools and libraries\n\n---\n\n## 📞 Support\n\n\u003cdiv align=\"center\" style=\"margin: 24px 0;\"\u003e\n\n\u003ctable style=\"width:100%; max-width: 600px;\"\u003e\n\u003ctr\u003e\n\u003ctd align=\"center\" width=\"33%\"\u003e\n\u003ca href=\"https://github.com/Kirky-X/inklog/issues\"\u003e\n\u003cdiv style=\"padding: 16px; border-radius:8px;\"\u003e\n\u003cb style=\"color:#991B1B;\"\u003e📋 Issues\u003c/b\u003e\n\u003c/div\u003e\n\u003c/a\u003e\n\u003cbr\u003e\u003cspan style=\"color:#64748B;\"\u003eReport bugs and issues\u003c/span\u003e\n\u003c/td\u003e\n\u003ctd align=\"center\" width=\"33%\"\u003e\n\u003ca href=\"https://github.com/Kirky-X/inklog/discussions\"\u003e\n\u003cdiv style=\"padding: 16px; border-radius:8px;\"\u003e\n\u003cb style=\"color:#1E40AF;\"\u003e💬 Discussions\u003c/b\u003e\n\u003c/div\u003e\n\u003c/a\u003e\n\u003cbr\u003e\u003cspan style=\"color:#64748B;\"\u003eAsk questions and share ideas\u003c/span\u003e\n\u003c/td\u003e\n\u003ctd align=\"center\" width=\"33%\"\u003e\n\u003ca href=\"https://github.com/Kirky-X/inklog\"\u003e\n\u003cdiv style=\"padding: 16px; border-radius:8px;\"\u003e\n\u003cb style=\"color:#1E293B;\"\u003e🐙 GitHub\u003c/b\u003e\n\u003c/div\u003e\n\u003c/a\u003e\n\u003cbr\u003e\u003cspan style=\"color:#64748B;\"\u003eView source code\u003c/span\u003e\n\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/table\u003e\n\n\u003c/div\u003e\n\n---\n\n## ⭐ Star History\n\n\u003cdiv align=\"center\"\u003e\n\n[![Star History Chart](https://api.star-history.com/svg?repos=Kirky-X/inklog\u0026type=Date)](https://star-history.com/#Kirky-X/inklog\u0026Date)\n\n\u003c/div\u003e\n\n---\n\n\u003cdiv align=\"center\" style=\"margin: 32px 0; padding: 24px; border-radius: 12px;\"\u003e\n\n### 💝 Support This Project\n\nIf you find this project useful, please consider giving it a ⭐️!\n\n**Built with ❤️ by Inklog Team**\n\n---\n\n**[⬆ Back to Top](#inklog)**\n\n---\n\n\u003csub\u003e© 2026 Inklog Project. All rights reserved.\u003c/sub\u003e\n\n\u003c/div\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkirky-x%2Finklog","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkirky-x%2Finklog","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkirky-x%2Finklog/lists"}