README.md

# PhoenixEcho

Forward browser console logs and errors to your Phoenix server logs via WebSocket.

Send browser logs to your favourite clanker 🤖. 

## Features

- Intercepts `console.log`, `console.warn`, `console.error`, `console.info`, `console.debug`
- Captures `window.onerror` and `unhandledrejection` events
- Serializes complex objects (handles circular references, DOM elements, etc.)
- Auto-reconnects on WebSocket disconnection
- Configurable log levels and prefixes

## Installation

1. Add to your dependencies in `mix.exs`:

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

2. Add to your endpoint (`lib/my_app_web/endpoint.ex`):

```elixir
use PhoenixEcho.Endpoint
```

3. Configure in `config/dev.exs`:

```elixir
config :phoenix_echo,
  enabled: true,
  prefix: "[Browser]",
  log_level: :debug
```

## Configuration Options

| Option | Default | Description |
|--------|---------|-------------|
| `:enabled` | `true` | Enable/disable logging |
| `:prefix` | `"[Browser]"` | Prefix for log messages |
| `:log_level` | `:debug` | Minimum log level to display |
| `:include_stacktrace` | `true` | Include stacktrace for errors |

## How It Works

1. **Client-side**: JavaScript is injected into HTML responses that:
   - Wraps native console methods to intercept calls
   - Listens for global error events
   - Serializes arguments and sends via Phoenix Channel

2. **Server-side**: Phoenix Channel receives messages and:
   - Formats the browser logs
   - Outputs to Phoenix Logger with configured prefix

## Example Output

```
[info] [Browser] User clicked button {"id": "submit", "class": "btn-primary"}
[warning] [Browser] Deprecated API usage detected
[error] [Browser] Uncaught TypeError: Cannot read property 'foo' of undefined
      at handleClick (app.js:42:15)
      at HTMLButtonElement.onclick (index.html:10:1)
```

## License

MIT