Selecto.LogSanitizer (Selecto v0.3.16)

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

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

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

Link to this section 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.

Link to this section Functions

Link to this function

safe_context(context)

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

Creates a safe log context map with sanitized values.

examples

Examples

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

sanitize_error(error)

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

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

examples

Examples

iex> sanitize_error(%Postgrex.Error{message: "error"})
"%Postgrex.Error{message: \"error\"}"
Link to this function

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

Examples

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

iex> sanitize_params([])
"[0 params]"
Link to this function

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

Options

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

examples

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"