# Redactors

Plugins that mask or remove sensitive data.

!!! warning "PII in Message Strings Is Not Redacted"

    Redactors only process **structured fields** in the log envelope.
    PII embedded in the message string will pass through unchanged.

    ```python
    # UNSAFE - email will NOT be redacted
    logger.info(f"User {email} logged in")

    # SAFE - email field will be redacted
    logger.info("User logged in", email=email)
    ```

    See [PII Showing Despite Redaction](../../troubleshooting/pii-showing-despite-redaction.md)
    for more details.

## Contract

Implement `BaseRedactor.redact(entry: dict) -> dict` (async). Return the updated entry; contain errors so the pipeline continues.

## Built-in redactors

- **field-mask**: masks configured field names (from `sensitive_fields_policy`).
- **regex-mask**: masks values matching sensitive patterns (default regex covers common secrets).
- **url-credentials**: strips credentials from URL-like strings.
- **field-blocker**: blocks high-risk field names (e.g., `body`, `payload`) by replacing their values entirely. See [FieldBlockerRedactor](../../plugins/redactors.md#fieldblockerredactor).
- **string-truncate**: truncates string values exceeding a configured length and appends a `[truncated]` marker. Disabled by default. See [StringTruncateRedactor](../../plugins/redactors.md#stringtruncateredactor).

## Configuration

- Enable/disable: `FAPILOG_CORE__ENABLE_REDACTORS`
- Order: `FAPILOG_CORE__REDACTORS_ORDER`
- Guardrails: `FAPILOG_CORE__REDACTION_MAX_DEPTH`, `FAPILOG_CORE__REDACTION_MAX_KEYS_SCANNED`
- Sensitive fields: `FAPILOG_CORE__SENSITIVE_FIELDS_POLICY`

Redactors run after enrichers and before sinks.
