README.md

# AshEventLog

Lightweight, centralized event logging for [Ash](https://ash-hq.org/) resources.

Inspired by [ash_events](https://hexdocs.pm/ash_events) and [ash_paper_trail](https://hexdocs.pm/ash_paper_trail), AshEventLog takes a different set of trade-offs:

- **Simpler than ash_events** — focused on audit logging only, with no event sourcing or replay. Less infrastructure to set up and maintain.
- **Easier to query than ash_paper_trail** — all events live in a single centralized table rather than per-resource version tables, making cross-resource queries straightforward.
- **Non-blocking** — events are written asynchronously after the action completes, so logging never slows down your writes.

## How it works

All create, update, and destroy actions across your tracked resources are automatically logged to a single events table. Each event records the resource, action, changed data, actor, and metadata.

## Usage

### 1. Define your event log resource

```elixir
defmodule MyApp.Events.Event do
  use Ash.Resource,
    domain: MyApp.Events,
    data_layer: AshPostgres.DataLayer,
    extensions: [AshEventLog.EventLog]

  postgres do
    table "events"
    repo MyApp.Repo
  end

  event_log do
    persist_actor_primary_key :user_id, MyApp.Accounts.User
  end
end
```

### 2. Add tracking to your resources

```elixir
defmodule MyApp.Blog.Post do
  use Ash.Resource,
    extensions: [AshEventLog.Resource]

  event_log do
    event_log MyApp.Events.Event
    ignore_actions [:background_recalculate]
  end
end
```

That's it. All non-ignored actions on `Post` will now be logged to the `events` table.

## Installation

```elixir
def deps do
  [
    {:ash_event_log, "~> 0.1.0"}
  ]
end
```