> ## Documentation Index
> Fetch the complete documentation index at: https://docs.appsignal.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Logging do Elixir

export const VersionRequirements = ({versions = []}) => {
  if (!Array.isArray(versions) || versions.length === 0) {
    return null;
  }
  const boundaries = {
    upper: " or lower",
    exact: "",
    lower: " or higher"
  };
  const containerStyle = {
    marginTop: "0.5rem",
    marginBottom: "1.5rem"
  };
  const lineStyle = {
    display: "block",
    margin: "0 0 0.35rem 0",
    fontSize: "0.875rem",
    lineHeight: "1.4"
  };
  const pillBaseStyle = {
    display: "inline-block",
    padding: "0.1em 0.4em",
    borderRadius: "0.25rem",
    border: "1px solid",
    fontFamily: "ui-monospace, SFMono-Regular, Menlo, monospace",
    fontSize: "0.85em",
    fontWeight: 500
  };
  const pillColors = {
    "AppSignal for Elixir": {
      background: "#f3e8ff",
      borderColor: "#e9d5ff",
      color: "#9333ea"
    },
    "AppSignal for Front-end": {
      background: "#fef9c3",
      borderColor: "#fde68a",
      color: "#ca8a04"
    },
    "AppSignal for Go": {
      background: "#ccfbf1",
      borderColor: "#99f6e4",
      color: "#0d9488"
    },
    "AppSignal for JavaScript": {
      background: "#fef9c3",
      borderColor: "#fde68a",
      color: "#ca8a04"
    },
    "AppSignal for Node.js": {
      background: "#dcfce7",
      borderColor: "#bbf7d0",
      color: "#16a34a"
    },
    "AppSignal for Python": {
      background: "#dbeafe",
      borderColor: "#bfdbfe",
      color: "#2563eb"
    },
    "AppSignal for Ruby": {
      background: "#fee2e2",
      borderColor: "#fecaca",
      color: "#dc2626"
    },
    "AppSignal for Rust": {
      background: "#ffedd5",
      borderColor: "#fed7aa",
      color: "#ea580c"
    }
  };
  const defaultPillColor = {
    background: "#f4f4f5",
    borderColor: "#e4e4e7",
    color: "#52525b"
  };
  const getPillStyle = name => ({
    ...pillBaseStyle,
    ...pillColors[name] || defaultPillColor
  });
  const getBoundText = bound => {
    return boundaries[bound] || boundaries.lower;
  };
  return <div style={containerStyle}>
      {versions.map((v, i) => <p key={`${v.name}-${v.version}-${v.bound || "lower"}-${i}`} style={lineStyle}>
          This feature requires{" "}
          <code style={getPillStyle(v.name)}>{v.name}</code> version {v.version}
          {getBoundText(v.bound)}.
        </p>)}
    </div>;
};

export const Compatibility = ({versions = [], label = "Available in"}) => {
  if (!Array.isArray(versions) || versions.length === 0) {
    return null;
  }
  const defaultPillStyle = {
    borderColor: "#d4d4d8",
    background: "#f4f4f5",
    color: "#3f3f46"
  };
  const pillStyles = {
    "AppSignal for Elixir": {
      background: "#f3e8ff",
      borderColor: "#d8b4fe",
      color: "#6b21a8"
    },
    "AppSignal for Front-end": {
      background: "#fef9c3",
      borderColor: "#fde047",
      color: "#854d0e"
    },
    "AppSignal for Go": {
      background: "#ccfbf1",
      borderColor: "#5eead4",
      color: "#115e59"
    },
    "AppSignal for JavaScript": {
      background: "#fef9c3",
      borderColor: "#fde047",
      color: "#854d0e"
    },
    "AppSignal for Node.js": {
      background: "#dcfce7",
      borderColor: "#86efac",
      color: "#166534"
    },
    "AppSignal for Python": {
      background: "#dbeafe",
      borderColor: "#93c5fd",
      color: "#1e40af"
    },
    "AppSignal for Ruby": {
      background: "#fee2e2",
      borderColor: "#fca5a5",
      color: "#991b1b"
    },
    "AppSignal for Rust": {
      background: "#ffedd5",
      borderColor: "#fdba74",
      color: "#9a3412"
    }
  };
  const getPillStyle = name => ({
    ...defaultPillStyle,
    ...pillStyles[name] || ({})
  });
  return <div className="not-prose my-4 rounded-lg border border-zinc-200 bg-zinc-50 px-4 py-3 text-sm dark:border-white/10 dark:bg-white/5">
      <div className="flex flex-wrap items-center gap-x-2 gap-y-1">
        <span className="font-semibold text-zinc-700 dark:text-zinc-200">
          {label}:
        </span>
        {versions.map((v, i) => <span key={`${v.name}-${v.version}-${i}`} className="inline-flex items-center gap-1 rounded-full border px-2 py-0.5 text-xs font-medium" style={getPillStyle(v.name)}>
            <span>{v.name}</span>
            <span className="opacity-70">
              {v.version}
              {v.exact ? "" : "+"}
            </span>
          </span>)}
      </div>
    </div>;
};

<VersionRequirements
  versions={[
{ name: "AppSignal for Elixir", version: "2.6.0" }
]}
/>

Esta documentação descreve como configurar o logging com a integração AppSignal for Elixir.

## Configurar logging

<Warning>
  🔐 Não envie <strong>Informações Pessoais Identificáveis (PII)</strong> para a AppSignal. Filtre PII (por exemplo, nomes, e-mails) dos logs e use um ID, hash ou identificador pseudonimizado no lugar. <br /> <br /> Para **entidades cobertas pela HIPAA**, mais informações sobre como assinar um Business Associate Agreement (BAA) podem ser encontradas em nossa [documentação de Business Add-Ons](/support/business-add-ons).
</Warning>

Você não precisa criar uma fonte de log para enviar logs da integração AppSignal for Elixir. Uma fonte de log "application" será criada automaticamente.

### Logger Handler

<Compatibility
  versions={[
{ name: "AppSignal for Elixir", version: "2.7.10" },
{ name: "Elixir", version: "1.15" },
]}
/>

Você pode configurar o `:logger` do Erlang para usar o módulo `Appsignal.Logger.Handler` como handler, chamando a função `Appsignal.Logger.Handler.add/2` no callback `Application.start/2`:

<CodeGroup>
  ```elixir Elixir theme={null}
  @impl true
  def start(_type, _args) do
    Appsignal.Logger.Handler.add("phoenix")
  end
  ```
</CodeGroup>

O argumento fornecido é o nome do grupo que descreve de onde você está fazendo o log. Esse nome de grupo pode ser usado no AppSignal para filtrar seus logs.

### Logger Backend

<Tip>
  A partir da versão 1.15 do Elixir, os backends de logger do Elixir não são
  mais recomendados. Veja a seção [Logger Handler](#logger-handler) acima para a
  alternativa recomendada.
</Tip>

Em vez de usar um handler de logger do Elixir, você pode configurar o backend do logger do Elixir para usar o módulo `Appsignal.Logger.Backend` como backend, colocando o código abaixo no arquivo `config/runtime.exs`:

<CodeGroup>
  ```elixir Elixir theme={null}
  config :logger, backends: [:console, {Appsignal.Logger.Backend, [group: "phoenix"]}]
  ```
</CodeGroup>

A opção `group` descreve de onde você está fazendo o log. Esse nome de grupo pode ser usado no AppSignal para filtrar seus logs.

Você também pode adicionar o backend usando a função `add_backend/2` no callback `Application.start/2`:

<CodeGroup>
  ```elixir Elixir theme={null}
  @impl true
  def start(_type, _args) do
    Logger.add_backend(Appsignal.Logger.Backend, group: "phoenix")
  end
  ```
</CodeGroup>

### Elixir Logger

Para enviar logs ao AppSignal sem usar o backend do Elixir Logger, você pode usar uma das funções de logging do `Appsignal.Logger` e fornecer um `groupname` que define de onde você está fazendo o log. Por exemplo, se estivéssemos fazendo log a partir de um helper para faturamento de clientes:

<CodeGroup>
  ```elixir Elixir theme={null}
  Appsignal.Logger.info(
    "invoice_helper",
    "Generating invoice for customer 129"
  )
  ```
</CodeGroup>

## Uso

### Enviando logs

Assim como a classe de logger do Elixir/Phoenix, você pode definir o nível de severidade dos seus logs usando `fatal`, `error`, `warning`, `info` e `debug`:

<CodeGroup>
  ```elixir Elixir theme={null}
  Appsignal.Logger.warning(
    "app",
    "Something's gone terribly wrong here"
  )
  ```
</CodeGroup>

Você pode passar atributos personalizados como último argumento para enviar informações de log que podem ser usadas ao filtrar e consultar logs:

<CodeGroup>
  ```elixir Elixir theme={null}
  Appsignal.Logger.info(
    "invoice_helper",
    "Generated invoice for customer #{customer.id}",
    %{ customer_id: customer.id, invoice_id: invoice.id }
  )
  ```
</CodeGroup>

Você pode consultar e filtrar pelo conteúdo da mensagem e pelos valores dos atributos usando nossa [sintaxe de consulta](/logging/query-syntax).

Uma vez configurados, os atributos desejados serão enviados ao AppSignal como tags de log e poderão ser consultados na interface de logging do AppSignal.

## Formatos

### Formato detectado automaticamente

<Compatibility versions={[{ name: "AppSignal for Elixir", version: "2.15.11" }]} />

O pacote AppSignal for Elixir vai detectar automaticamente o formato da linha de log como JSON, Logfmt ou plaintext por padrão, e fará o parsing dos atributos a partir disso.
Você não precisa definir manualmente o formato do log, a não ser que ele não esteja sendo detectado corretamente.
Por favor, também [nos avise](mailto:support@appsignal.com?subject=Log%20format%20auto%20detection%20not%20working) se isso não estiver funcionando automaticamente.

<CodeGroup>
  ```elixir Elixir theme={null}
  # Plaintext format
  Appsignal.Logger.info(
    "invoice_helper",
    "Generated invoice"
  )
  # Logfmt format
  Appsignal.Logger.info(
    "invoice_helper",
    "Generated invoice invoice_id=A145 for customer customer_id=123"
  )
  # JSON format
  Appsignal.Logger.info(
    "invoice_helper",
    ~s({"message": "Generated invoice for customer", "invoice_id": "A145", "customer_id": "123"})
  )
  ```
</CodeGroup>

### Logfmt

O AppSignal Logger pode ser configurado explicitamente para esperar que a linha esteja formatada como Logfmt e fazer o parsing dos atributos a partir dela.
Use essa opção quando estiver usando uma versão mais antiga do pacote AppSignal for Elixir, que não suporta a [detecção automática de formato](#auto-detected-format).

O formato Logfmt pode ser especificado quando o AppSignal logger é chamado, adicionando o valor `:logfmt` como último argumento.

<CodeGroup>
  ```elixir Elixir theme={null}
  Appsignal.Logger.info(
    "invoice_helper",
    "Generated invoice invoice_id=A145 for customer customer_id=123",
    :logfmt
  )
  ```
</CodeGroup>

### JSON

O AppSignal Logger pode ser configurado explicitamente para esperar que a linha esteja formatada como JSON e fazer o parsing dos atributos a partir dela.
Use essa opção quando estiver usando uma versão mais antiga do pacote AppSignal for Elixir, que não suporta a [detecção automática de formato](#auto-detected-format).

O formato JSON pode ser especificado quando o AppSignal logger é chamado, adicionando o valor `:json` como último argumento.

<CodeGroup>
  ```elixir Elixir theme={null}
  Appsignal.Logger.info(
    "invoice_helper",
    ~s({"message": "Generated invoice for customer", "invoice_id": "A145", "customer_id": "123"}),
    :json
  )
  ```
</CodeGroup>

Apenas valores primitivos não aninhados (números, strings, booleanos e `null`) serão exibidos como atributos de log. Todos os outros atributos serão descartados.

## Filtrando logs

Você pode usar a [opção de configuração `ignore_logs`](/elixir/configuration/options#option-ignore_logs) para ignorar linhas de log com base na mensagem. Veja [nosso guia Ignore Logs](/guides/filter-data/ignore-logs) para saber mais.

## Precisa de ajuda?

Depois de configurar sua aplicação Elixir para enviar logs, os logs devem aparecer no AppSignal. Se você tiver dúvidas sobre este passo ou o AppSignal não estiver recebendo logs, você sempre pode [entrar em contato](mailto:support@appsignal.com) para obter ajuda. Vamos te ajudar a voltar ao normal!
