> ## 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 Ruby

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 Ruby", version: "3.2.0" }
]}
/>

Esta documentação descreve como configurar o logging com sua integração AppSignal for Ruby.

## 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 Ruby. Uma fonte de log "application" será criada automaticamente.

### Rails Logger

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

Você pode configurar o framework Rails para enviar logs ao AppSignal em um arquivo de inicializador como `config/initializers/logging.rb`:

<CodeGroup>
  ```ruby Ruby theme={null}
  # config/initializers/logging.rb
  appsignal_logger = Appsignal::Logger.new("rails")
  Rails.logger = ActiveSupport::TaggedLogging.new(appsignal_logger)
  ```
</CodeGroup>

#### Usando múltiplos backends de logging

Para enviar logs tanto para o logger do AppSignal quanto para o logger padrão do Rails, use o helper `.broadcast_to` do nosso logger:

<CodeGroup>
  ```ruby Ruby theme={null}
  # config/initializers/logging.rb
  appsignal_logger = Appsignal::Logger.new("rails")
  appsignal_logger.broadcast_to(Rails.logger)
  Rails.logger = ActiveSupport::TaggedLogging.new(appsignal_logger)
  ```
</CodeGroup>

Não recomendamos usar o recurso broadcast logger embutido do Rails, devido a problemas de compatibilidade quando usado junto com tagged logging.

#### Suporte a tagged logging

O uso de `ActiveSupport::TaggedLogging` nos exemplos acima habilita o suporte às tags de log do Rails. Por exemplo, se você quiser adicionar a tag request ID às mensagens de log, adicione-a ao array `config.log_tags` no arquivo `config/application.rb`:

<CodeGroup>
  ```ruby Ruby theme={null}
  module TestApp
    class Application < Rails::Application
      config.log_tags = [:request_id]
    end
  end
  ```
</CodeGroup>

#### Usando o Lograge

<Warning>
  Esta configuração do Lograge não substitui a configuração do logger do Rails.
  Se você quiser reportar logs do `Rails.logger`, os [passos de configuração do
  Rails logger](#rails-logger) também precisam ser seguidos.
</Warning>

A biblioteca [Lograge](https://github.com/roidrage/lograge) é uma solução popular para ingerir logs estruturados de *requisições* do Rails.

Depois de adicionar a gem `lograge`, você pode configurá-la em `config/initializers/lograge.rb` para enviar logs ao AppSignal:

<CodeGroup>
  ```ruby Ruby theme={null}
  Rails.application.configure do
    config.lograge.enabled = true
    config.lograge.keep_original_rails_log = true
    config.lograge.logger = Appsignal::Logger.new(
      "rails",
      format: Appsignal::Logger::LOGFMT
    )
  end
  ```
</CodeGroup>

<Tip>
  O Lograge não suporta níveis de log. Todos os logs emitidos via Lograge irão
  aparecer com nível de severidade `INFO` na interface de Logging do AppSignal.
</Tip>

### Sinatra Logger

Você pode configurar o Sinatra para enviar logs de requisições ao AppSignal usando o middleware CommonLogger do Rack. Configure-o como mostrado abaixo.

Considere se os logs de requisições contêm informações úteis para você, leia nosso artigo do learning center [what logs should I store](https://www.appsignal.com/learning-center/what-logs-should-i-store).

<CodeGroup>
  ```ruby Ruby theme={null}
  logger = Appsignal::Logger.new("sinatra")
  use Rack::CommonLogger, logger
  ```
</CodeGroup>

#### Usando múltiplos backends de logging

Para enviar logs tanto para o logger do AppSignal quanto para o `STDOUT`, use o helper `.broadcast_to` do nosso logger:

<CodeGroup>
  ```ruby Ruby theme={null}
  logger = Appsignal::Logger.new("sinatra")
  logger.broadcast_to(Logger.new($stdout))
  use Rack::CommonLogger, logger
  ```
</CodeGroup>

### Sidekiq Logger

Você pode configurar o Sidekiq para enviar seus logs ao AppSignal, incluindo os logs emitidos pelos seus jobs em segundo plano:

<CodeGroup>
  ```ruby Ruby theme={null}
  Sidekiq.configure_server do |config|
    config.logger = Appsignal::Logger.new("sidekiq")
    config.logger.formatter = Sidekiq::Logger::Formatters::WithoutTimestamp.new
  end
  ```
</CodeGroup>

#### Usando múltiplos backends de logging

Para enviar logs tanto para o logger do AppSignal quanto para o `STDOUT`, use o helper `.broadcast_to` do nosso logger:

<CodeGroup>
  ```ruby Ruby theme={null}
  Sidekiq.configure_server do |config|
    config.logger = Appsignal::Logger.new("sidekiq")
    config.logger.broadcast_to(Logger.new($stdout))
    config.logger.formatter = Sidekiq::Logger::Formatters::WithoutTimestamp.new
  end
  ```
</CodeGroup>

### Ruby Logger

Para enviar logs ao AppSignal como você faria com a classe `Logger` do Ruby, você precisa criar uma instância de `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>
  ```ruby Ruby theme={null}
  logger = Appsignal::Logger.new("invoice_helper")
  ```
</CodeGroup>

#### Usando múltiplos backends de logging

Para enviar logs tanto para o logger do AppSignal quanto para o `STDOUT`, use o helper `.broadcast_to` do nosso logger:

<CodeGroup>
  ```ruby Ruby theme={null}
  logger = Appsignal::Logger.new("invoice_helper")
  logger.broadcast_to(Logger.new($stdout))
  ```
</CodeGroup>

### Semantic Logger

A biblioteca [Semantic Logger](https://logger.rocketjob.io/) fornece uma solução abrangente de logging para aplicações Ruby e Rails.

Depois de adicionar a gem `semantic_logger`, você pode configurá-la para enviar logs ao AppSignal da seguinte maneira:

<CodeGroup>
  ```ruby Ruby theme={null}
  appsignal_logger = Appsignal::Logger.new("rails", format: Appsignal::Logger::LOGFMT)
  SemanticLogger.add_appender(logger: appsignal_logger, formatter: :logfmt)
  ```
</CodeGroup>

#### Usando múltiplos backends de logging

Para enviar logs tanto para o logger do AppSignal quanto para o `STDOUT`, adicione outro appender usando o método `add_appender`:

<CodeGroup>
  ```ruby Ruby theme={null}
  appsignal_logger = Appsignal::Logger.new("rails", format: Appsignal::Logger::LOGFMT)
  SemanticLogger.add_appender(logger: appsignal_logger, formatter: :logfmt)
  SemanticLogger.add_appender(io: $stdout)
  ```
</CodeGroup>

## Uso

### Enviando logs

Assim como a classe `Logger` do Ruby/Rails, você pode definir o nível de severidade dos seus logs usando `fatal`, `error`, `warn`, `info` e `debug`:

<CodeGroup>
  ```ruby Ruby theme={null}
  logger.warn("Something went wrong")
  ```
</CodeGroup>

Você pode definir atributos personalizados para enviar informações de log que podem ser usadas ao filtrar e consultar logs:

<CodeGroup>
  ```ruby Ruby theme={null}
  logger = Appsignal::Logger.new("invoice_helper")
  logger.info("Generating invoice for customer", { customer_id: @customer.id })
  invoice = generate_invoice(@customer)
  logger.info("Generated invoice for customer", { 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.

### Atributos padrão do logger

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

Ao inicializar o AppSignal logger, você pode fornecer atributos padrão que serão incluídos em todas as mensagens de log:

<CodeGroup>
  ```ruby Ruby theme={null}
  logger = Appsignal::Logger.new("invoice_helper", attributes: { customer_id: @customer.id })
  ```
</CodeGroup>

Os atributos fornecidos na inicialização do logger serão incluídos em todas as mensagens de log enviadas por essa instância do logger. Os atributos fornecidos junto com a mensagem de log serão mesclados com os atributos padrão do logger.

<CodeGroup>
  ```ruby Ruby theme={null}
  logger = Appsignal::Logger.new("invoice_helper", attributes: { customer_id: @customer.id })
  # This log message will contain the `customer_id` attribute:
  logger.info("Generating invoice for customer")

  invoice = generate_invoice(@customer)
  # This log message will contain the `customer_id` and `invoice_id` attributes:
  logger.info("Generated invoice for customer", { invoice_id: invoice.id })
  ```
</CodeGroup>

Quando o logger e a mensagem de log fornecem o mesmo atributo, o atributo da mensagem de log irá sobrescrever o atributo padrão do logger.

## Formatos

### Formato detectado automaticamente

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

A gem AppSignal for Ruby 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>
  ```ruby Ruby theme={null}
  logger = Appsignal::Logger.new("group")
  # Plaintext format
  logger.info("This is about the blog")
  # Logfmt format
  logger.info("category=blog This is about the blog")
  # JSON format
  logger.info('{"category": "blog", "message": "This is about the blog"}')
  ```
</CodeGroup>

### Logfmt

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

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 da gem AppSignal for Ruby, que não suporta a [detecção automática de formato](#auto-detected-format).

O formato de log pode ser especificado ao criar um logger.
Ao inicializar o AppSignal logger, passe a constante Logfmt na opção format.

<CodeGroup>
  ```ruby Ruby theme={null}
  logger = Appsignal::Logger.new("group", format: Appsignal::Logger::LOGFMT)
  logger.info("category=blog This is about the blog")
  ```
</CodeGroup>

No exemplo acima, um atributo filtrável category com o valor "blog" será registrado.

### JSON

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

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 da gem AppSignal for Ruby, que não suporta a [detecção automática de formato](#auto-detected-format).

O formato de log pode ser especificado ao criar um logger.
Ao inicializar o AppSignal logger, passe a constante JSON na opção format.

<CodeGroup>
  ```ruby Ruby theme={null}
  logger = Appsignal::Logger.new("group", format: Appsignal::Logger::JSON)
  logger.info('{"category": "blog", "message": "This is about the blog"}')
  ```
</CodeGroup>

No exemplo acima, um atributo filtrável category com o valor "blog" será registrado.

## Filtrando logs

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

## Precisa de ajuda?

Depois de configurar sua aplicação Ruby 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!
