Skip to main content

lexigram-audit

Unified audit trail for the Lexigram Framework — append-only, HMAC-verified, retention-managed.


Overview

lexigram-audit provides a unified, append-only audit trail with HMAC-SHA256 tamper detection, configurable per-severity retention policies, and scheduled integrity verification batches. The AuditLogger is fire-tolerant — audit failures never interrupt business logic.


Full documentation: docs.lexigram.dev

Install

uv add lexigram lexigram-audit

# For the SQL backend (recommended for production)
uv add lexigram-sql

Quick Start

from lexigram import Application
from lexigram.di.module import Module, module
from lexigram.audit import AuditModule
from lexigram.audit.protocols import AuditLoggerProtocol
from lexigram.contracts.audit import AuditEntry, AuditEventSeverity


@module(
    imports=[
        AuditModule.configure(
            store_backend="memory",
            hmac_key=b"your-hmac-secret",
        )
    ]
)
class AppModule(Module):
    pass


async def main() -> None:
    async with Application.boot(modules=[AppModule]) as app:
        audit = await app.container.resolve(AuditLoggerProtocol)

        await audit.log(
            AuditEntry(
                action="user.deleted",
                actor_id="user-123",
                resource_type="user",
                resource_id="user-42",
                severity=AuditEventSeverity.HIGH,
            )
        )


if __name__ == "__main__":
    import asyncio

    asyncio.run(main())

The "sql" backend (default) requires lexigram-sql with a DatabaseModule registered; "memory" is an in-process store for development and tests.

Configuration

Zero-config usage: Call AuditModule.configure() with no arguments to use all defaults.

Option 1 — YAML file

# application.yaml
audit:
  store_backend: "sql"
  hmac_key: null
  retention_policy:
    default_retention_days: 365
  enable_admin: true

Option 2 — Profiles + Environment Variables (recommended)

export LEX_AUDIT__STORE_BACKEND=sql
export LEX_AUDIT__HMAC_KEY=your-hex-encoded-key
export LEX_AUDIT__RETENTION_POLICY__DEFAULT_RETENTION_DAYS=365

Option 3 — Python

from lexigram.audit import AuditModule

AuditModule.configure(
    store_backend="sql",
    hmac_key=b"your-hmac-secret",
    table_name="audit_log",
    retention_days=365,
    enable_admin=True,
)

For full control (e.g. per-severity retention overrides), build an AuditConfig directly and configure retention_policy with a RetentionPolicy from lexigram.contracts.audit:

from lexigram.audit.config import AuditConfig
from lexigram.contracts.audit import RetentionPolicy

AuditConfig(
    store_backend="sql",
    hmac_key=b"your-hmac-secret",
    retention_policy=RetentionPolicy(
        default_retention_days=365,
        severity_overrides={"critical": 2555, "high": 1095},
    ),
    enable_admin=True,
)

Config reference

Field Default Env var Description
store_backend "sql" LEX_AUDIT__STORE_BACKEND Storage backend: "sql" or "memory"
table_name "audit_log" LEX_AUDIT__TABLE_NAME SQL table name (SQL backend only)
hmac_key null LEX_AUDIT__HMAC_KEY HMAC-SHA256 secret key (bytes; strings are used as UTF-8 bytes, not hex-decoded); null disables tamper detection
retention_policy.default_retention_days 365 LEX_AUDIT__RETENTION_POLICY__DEFAULT_RETENTION_DAYS Default retention in days (0 = indefinite)
retention_policy.severity_overrides {"critical": 2555, "high": 1095} Per-severity retention overrides (days)
verification_schedule "0 * * * *" LEX_AUDIT__VERIFICATION_SCHEDULE Cron expression for HMAC verification runs
verification_batch_size 100 LEX_AUDIT__VERIFICATION_BATCH_SIZE Entries verified per scheduled run
enable_admin true LEX_AUDIT__ENABLE_ADMIN Enable admin dashboard integration

Module Factory Methods

Method Description
AuditModule.configure(*, hmac_key=None, store_backend="sql", table_name="audit_log", retention_days=365, enable_admin=True) Configure the audit module (keyword arguments only)

Key Features

  • Fire-tolerant loggingAuditLogger.log() never blocks calling code; errors are logged at WARNING and swallowed
  • HMAC-SHA256 checksums — per-entry tamper detection verified on schedule or on-demand
  • Per-severity retentionPolicyBasedRetention applies different retention periods per severity level
  • SQL backend — append-only SqlAuditStore backed by lexigram-sql
  • Memory backend — bounded in-process store for development and testing
  • Admin dashboardAuditAdminContributor adds an Audit Log panel
  • Scheduled verification — hourly HMAC batch verification when a task scheduler is present

Testing

import pytest
from lexigram import Application
from lexigram.audit import AuditModule
from lexigram.audit.protocols import AuditLoggerProtocol, AuditStoreProtocol
from lexigram.contracts.audit import AuditEntry, AuditQuery


@pytest.mark.asyncio
async def test_audit_log_records_entry() -> None:
    async with Application.boot(
        modules=[AuditModule.configure(store_backend="memory")]
    ) as app:
        audit = await app.container.resolve(AuditLoggerProtocol)
        store = await app.container.resolve(AuditStoreProtocol)

        await audit.log(
            AuditEntry(
                action="user.created",
                actor_id="actor-1",
                resource_type="user",
                resource_id="user-42",
            )
        )

        entries = await store.query(AuditQuery(action="user.created"))
        assert len(entries) == 1
        assert entries[0].actor_id == "actor-1"

Key Source Files

File What it contains
src/lexigram/audit/module.py AuditModule.configure(), .stub()
src/lexigram/audit/config.py AuditConfig, RetentionPolicyConfig
src/lexigram/audit/di/bundle_provider.py AuditBundleProvider boot and registration
src/lexigram/audit/logging/logger.py AuditLogger (fire-tolerant entry point)
src/lexigram/audit/store/memory.py InMemoryAuditStore
src/lexigram/audit/store/sql.py SqlAuditStore
src/lexigram/audit/verification/checksum.py HMAC-SHA256 checksum logic
src/lexigram/audit/retention/policy.py PolicyBasedRetention
src/lexigram/audit/admin/contributor.py AuditAdminContributor

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

lexigram_audit-0.1.4.tar.gz (58.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

lexigram_audit-0.1.4-py3-none-any.whl (44.3 kB view details)

Uploaded Python 3

File details

Details for the file lexigram_audit-0.1.4.tar.gz.

File metadata

  • Download URL: lexigram_audit-0.1.4.tar.gz
  • Upload date:
  • Size: 58.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.8.14

File hashes

Hashes for lexigram_audit-0.1.4.tar.gz
Algorithm Hash digest
SHA256 77d68ec743bef677d75072472d4767f3c1e59dc8aa170312422749d7f3074fdf
MD5 b1325700fbe4451e004f9449c00de069
BLAKE2b-256 aaee1d413668449e3221645ca535020f573c610e479438bc6f0b4265da4f577c

See more details on using hashes here.

File details

Details for the file lexigram_audit-0.1.4-py3-none-any.whl.

File metadata

File hashes

Hashes for lexigram_audit-0.1.4-py3-none-any.whl
Algorithm Hash digest
SHA256 480f0d349c2786e90fc5a4097506636415aeb6e7280a76b90ef0b99b3e4e1cc3
MD5 a354a79f8243ff18e80a9c968987f4d7
BLAKE2b-256 0a88a1191ef1234d74c4aa1959007bc3ed6930a941501fb6a8c32fbb383aa237

See more details on using hashes here.

Release history Release notifications | RSS feed

0.1.5009

1 file

0.1.5004

2 files

0.1.5001

2 files

0.1.3007

1 file

0.1.3006

1 file

0.1.3005

1 file

This release

0.1.4 This release

2 files

0.1.2

1 file

0.1.1

1 file

0.1.0

1 file

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page