# `Selecto.LogSanitizer`

Sanitizes SQL queries and parameters for safe logging.

This module ensures that sensitive data from query parameters is never
written to logs, while still providing useful debugging information.

## Security

- Parameters are replaced with placeholders like `$1`, `$2`, etc.
- Parameter values are NEVER logged
- SQL structure is preserved for debugging purposes
- Query previews are truncated to prevent log bloat

## Usage

    iex> LogSanitizer.sanitize_query("SELECT * FROM users WHERE id = $1", [123])
    "SELECT * FROM users WHERE id = $1 [1 param(s) redacted]"

    iex> LogSanitizer.sanitize_params([1, "secret", %{key: "value"}])
    "[3 param(s) redacted]"

# `safe_context`

```elixir
@spec safe_context(keyword()) :: map()
```

Creates a safe log context map with sanitized values.

## Examples

    iex> safe_context(query: "SELECT...", params: [1,2,3], error: %RuntimeError{})
    %{query: "SELECT... [3 param(s) redacted]", error: "RuntimeError: ..."}

# `sanitize_error`

```elixir
@spec sanitize_error(term()) :: String.t()
```

Sanitizes an error for logging, removing any embedded parameter values.

## Examples

    iex> sanitize_error(%RuntimeError{message: "error"})
    "Elixir.RuntimeError: error"

# `sanitize_params`

```elixir
@spec sanitize_params(list()) :: String.t()
```

Returns a safe representation of parameters for logging.

NEVER logs actual parameter values - only the count and types.

## Examples

    iex> sanitize_params([1, "secret", nil])
    "[3 param(s): integer, binary, nil]"

    iex> sanitize_params([])
    "[0 params]"

# `sanitize_query`

```elixir
@spec sanitize_query(String.t() | nil, list(), keyword()) :: String.t()
```

Sanitizes a query string for logging, optionally with parameter count.

Returns the query with a note about redacted parameters.

## Options

- `:max_length` - Maximum length of query to include (default: 500)
- `:show_param_count` - Whether to show parameter count (default: true)

## Examples

    iex> sanitize_query("SELECT * FROM users WHERE id = $1", [123])
    "SELECT * FROM users WHERE id = $1 [1 param(s) redacted]"

    iex> sanitize_query("SELECT * FROM users", [])
    "SELECT * FROM users"

---

*Consult [api-reference.md](api-reference.md) for complete listing*
