> ## 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 vanuit 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" }
]}
/>

Deze documentatie beschrijft hoe u logging configureert met uw AppSignal for Ruby-integratie.

## Logging configureren

<Warning>
  🔐 Stuur geen <strong>Persoonlijk Identificeerbare Informatie (PII)</strong> naar AppSignal. Filter PII (bijv. namen, e-mailadressen) uit logs en gebruik in plaats daarvan een ID, hash of gepseudonimiseerde identificator. <br /> <br /> Voor **onder HIPAA vallende entiteiten** vindt u meer informatie over het ondertekenen van een Business Associate Agreement (BAA) in onze [documentatie over Business Add-Ons](/support/business-add-ons).
</Warning>

U hoeft geen logbron aan te maken om logs te versturen vanuit de AppSignal for Ruby-integratie. Er wordt automatisch een "application"-logbron aangemaakt.

### Rails Logger

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

U kunt het Rails-framework configureren om logs naar AppSignal te sturen in een initializer-bestand zoals `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>

#### Meerdere logging-backends gebruiken

Om logs naar zowel de logger van AppSignal als de standaard logger van Rails te sturen, gebruikt u de `.broadcast_to`-helper van onze 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>

Wij raden het gebruik van de ingebouwde broadcast logger-functie van Rails niet aan, vanwege compatibiliteitsproblemen bij gelijktijdig gebruik met tagged logging.

#### Ondersteuning voor tagged logging

Het gebruik van `ActiveSupport::TaggedLogging` in de bovenstaande voorbeelden maakt ondersteuning voor de log-tags van Rails mogelijk. Als u bijvoorbeeld de request ID-tag aan de logberichten wilt toevoegen, voegt u deze toe aan de `config.log_tags`-array in het bestand `config/application.rb`:

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

#### Lograge gebruiken

<Warning>
  Deze Lograge-configuratie is geen vervanging voor de Rails logger-
  configuratie. Als u logs van `Rails.logger` wilt rapporteren, moeten ook de
  [Rails logger-configuratiestappen](#rails-logger) worden gevolgd.
</Warning>

De [Lograge](https://github.com/roidrage/lograge)-bibliotheek is een populaire oplossing voor het opnemen van gestructureerde Rails-*request*-logs.

Nadat u de `lograge`-gem hebt toegevoegd, kunt u deze configureren in `config/initializers/lograge.rb` om logs naar AppSignal te sturen:

<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>
  Lograge ondersteunt geen log-niveaus. Alle logs die via Lograge worden
  uitgegeven, verschijnen met severity-niveau `INFO` in de AppSignal Logging-UI.
</Tip>

### Sinatra Logger

U kunt Sinatra configureren om request-logs naar AppSignal te sturen met behulp van Rack's CommonLogger-middleware. Configureer het zoals hieronder weergegeven.

Overweeg of request-logs nuttige informatie voor u bevatten, lees ons learning center-artikel [welke logs moet ik opslaan](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>

#### Meerdere logging-backends gebruiken

Om logs naar zowel de logger van AppSignal als naar `STDOUT` te sturen, gebruikt u de `.broadcast_to`-helper van onze logger:

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

### Sidekiq Logger

U kunt Sidekiq configureren om zijn logs naar AppSignal te sturen, inclusief de logs die door uw achtergrondtaken worden uitgegeven:

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

#### Meerdere logging-backends gebruiken

Om logs naar zowel de logger van AppSignal als naar `STDOUT` te sturen, gebruikt u de `.broadcast_to`-helper van onze 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

Om logs naar AppSignal te sturen zoals u dat met de `Logger`-klasse van Ruby zou doen, moet u een instantie van `Appsignal::Logger` aanmaken en deze voorzien van een `groupname` die definieert vanwaar u logt. Bijvoorbeeld, als wij zouden loggen vanuit een helper voor het factureren van klanten:

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

#### Meerdere logging-backends gebruiken

Om logs naar zowel de logger van AppSignal als naar `STDOUT` te sturen, gebruikt u de `.broadcast_to`-helper van onze logger:

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

### Semantic Logger

De [Semantic Logger](https://logger.rocketjob.io/)-bibliotheek biedt een uitgebreide logging-oplossing voor Ruby- en Rails-applicaties.

Nadat u de `semantic_logger`-gem hebt toegevoegd, kunt u deze als volgt configureren om logs naar AppSignal te sturen:

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

#### Meerdere logging-backends gebruiken

Om logs naar zowel de logger van AppSignal als naar `STDOUT` te sturen, voegt u nog een appender toe met de methode `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>

## Gebruik

### Logs versturen

Net als de Ruby/Rails `Logger`-klasse kunt u de severity-niveau van uw logs definiëren met `fatal`, `error`, `warn`, `info` en `debug`:

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

U kunt aangepaste attributen definiëren om loginformatie te versturen die kan worden gebruikt bij het filteren en opvragen van 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>

U kunt op berichtinhoud en attribuutwaarden filteren en opvragen met behulp van onze [zoeksyntaxis](/logging/query-syntax).

Eenmaal geconfigureerd, worden de gewenste attributen als log-tags naar AppSignal verstuurd en zijn ze opvraagbaar in de AppSignal logging-interface.

### Standaard logger-attributen

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

Bij het initialiseren van de AppSignal-logger kunt u standaardattributen verstrekken die in alle logberichten worden opgenomen:

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

De attributen die bij het initialiseren van de logger worden verstrekt, worden opgenomen in alle logberichten die vanaf die logger-instantie worden verstuurd. Attributen die met het logbericht worden verstrekt, worden samengevoegd met de standaard logger-attributen.

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

Wanneer zowel de logger als het logbericht hetzelfde attribuut verstrekken, overschrijft het attribuut van het logbericht het standaard logger-attribuut.

## Formaten

### Automatisch gedetecteerd formaat

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

De AppSignal for Ruby-gem detecteert het formaat van de logregel standaard automatisch als JSON, Logfmt of plaintext en parseert er attributen uit.
U hoeft het logformaat niet handmatig in te stellen, tenzij het niet correct wordt gedetecteerd.
[Laat het ons ook weten](mailto:support@appsignal.com?subject=Log%20format%20auto%20detection%20not%20working) als dit niet automatisch werkt.

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

De AppSignal Logger kan expliciet worden geconfigureerd om te verwachten dat de regel in Logfmt-formaat is en hier attributen uit te parsen.
Gebruik deze optie wanneer u een oudere versie van de AppSignal for Ruby-gem gebruikt die geen [automatische formaatdetectie](#auto-detected-format) ondersteunt.

Het logformaat kan worden opgegeven bij het aanmaken van een logger.
Geef bij het initialiseren van de AppSignal-logger de Logfmt-constante door in de format-optie.

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

In het bovenstaande voorbeeld wordt een filterbaar category-attribuut met de waarde "blog" gelogd.

### JSON

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

De AppSignal Logger kan expliciet worden geconfigureerd om te verwachten dat de regel in JSON-formaat is en hier attributen uit te parsen.
Gebruik deze optie wanneer u een oudere versie van de AppSignal for Ruby-gem gebruikt die geen [automatische formaatdetectie](#auto-detected-format) ondersteunt.

Het logformaat kan worden opgegeven bij het aanmaken van een logger.
Geef bij het initialiseren van de AppSignal-logger de JSON-constante door in de format-optie.

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

In het bovenstaande voorbeeld wordt een filterbaar category-attribuut met de waarde "blog" gelogd.

## Logs filteren

U kunt [de configuratieoptie `ignore_logs`](/ruby/configuration/options#option-ignore_logs) gebruiken om logregels te negeren. Zie [onze gids Logs negeren](/guides/filter-data/ignore-logs) voor meer informatie.

## Hulp nodig?

Nadat u uw Ruby-applicatie hebt geconfigureerd om logs te versturen, zouden er logs in AppSignal moeten verschijnen. Als u twijfelt over deze stap of AppSignal geen logs ontvangt, kunt u altijd [contact opnemen](mailto:support@appsignal.com) voor hulp. Wij helpen u graag weer op weg!
