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.5004.tar.gz (59.6 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.5004-py3-none-any.whl (45.1 kB view details)

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for lexigram_audit-0.1.5004.tar.gz
Algorithm Hash digest
SHA256 19f21441beda6094ec62a142a0df6c5db9e38f26d9cf62da3771101bb27f69ff
MD5 df18386897a5ad698b56dd0d17821f1d
BLAKE2b-256 ff42098c5bed9ac722a913c4aa4e666c5869fdb0597c61b9c44201049a8da02f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for lexigram_audit-0.1.5004-py3-none-any.whl
Algorithm Hash digest
SHA256 40d02fe2eed63de2a853d8410f3ff5a9997d28564035d9a2c21bb21ca928d43a
MD5 b0b30e1e25d1f621c385510b6f7f1d00
BLAKE2b-256 2f14a525e46edb5b09e6e34ba959af5a553d1651a5f423412f9809cee3c63f9e

See more details on using hashes here.

Release history Release notifications | RSS feed

0.1.5009

1 file

This release

0.1.5004 This release

2 files

0.1.5001

2 files

0.1.3007

1 file

0.1.3006

1 file

0.1.3005

1 file

0.1.4

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