Selecto.LogSanitizer (Selecto v0.4.5)

Copy Markdown

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]"

Summary

Functions

Creates a safe log context map with sanitized values.

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

Returns a safe representation of parameters for logging.

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

Functions

safe_context(context)

@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(error)

@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(params)

@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(query, params \\ [], opts \\ [])

@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"