> ## 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 Node.js

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 Node.js", version: "3.0.1" }
]}
/>

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

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

### Uso autônomo

Para usar o logger, você precisa importar o AppSignal e configurar o logger usando a função `.logger()`.

A função `.logger()` aceita dois argumentos: `group` e, opcionalmente, `severityThreshold`. Se `severityThreshold` não for fornecido, o padrão será `info`.

<CodeGroup>
  ```javascript Node.js theme={null}
  const { Appsignal } = require("@appsignal/nodejs");

  const logger = Appsignal.logger("app");

  // with a severity threshold:
  const logger = Appsignal.logger("app", "info");
  ```
</CodeGroup>

Existem seis níveis de severidade disponíveis: `trace`, `debug`, `info`, `log`, `warn` e `error`, cada um deles com sua própria função de mesmo nome. Essas funções aceitam dois argumentos: `message` e `attributes`. Attributes é usado para metadados e é opcional.

As mensagens só serão registradas se o nível de severidade delas estiver acima do limite de severidade.

<CodeGroup>
  ```javascript Node.js theme={null}
  logger.info("Log message line");
  logger.debug("User logged in", { user_id: 123 });
  ```
</CodeGroup>

Observe que, se a severidade da mensagem estiver abaixo do limite de severidade definido na inicialização do logger, ela não será enviada ao AppSignal.

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

#### Usando múltiplos backends de logging

Atualmente não é possível enviar logs para múltiplos backends usando o logger padrão do Node.js. Para configurações mais complexas, recomendamos usar uma biblioteca de logging como Winston ou Pino.

### Uso com Winston

<Compatibility versions={[{ name: "AppSignal for Node.js", version: "3.0.3" }]} />

Se você usa o Winston para registrar mensagens em toda a sua aplicação, pode usar nosso transport do Winston para enviar esses logs ao AppSignal. Depois de importar o transport da integração AppSignal, adicione-o à lista de transports do seu logger Winston:

<CodeGroup>
  ```javascript Node.js theme={null}
  const winston = require("winston");
  const { WinstonTransport } = require("@appsignal/nodejs");

  const logger = winston.createLogger({
    transports: [new WinstonTransport({ group: "app" })],
  });
  ```
</CodeGroup>

#### Child Logger

Você pode usar um child logger para adicionar tags extras às mensagens de log. Você define tags ao criar o child logger ou passa tags como metadados ao escrever uma mensagem de log. Digamos que queremos mais contexto nos logs das ações de um usuário específico dentro de uma sessão específica. No exemplo abaixo, um child logger para o grupo `background` é usado para adicionar `sessionID`, com as tags adicionais `drinkID` e `paymentID` fornecidas como metadados ao criar uma mensagem de log, e se um grupo for passado para o child, ele irá sobrescrever o que foi configurado no transport.

<CodeGroup>
  ```javascript Node.js theme={null}
  const logger = winston.createLogger({...});

  const sessionLogger = logger.child({
    group: "background",
    sessionID: user.id,
  });

  sessionLogger.debug("User logged in");
  sessionLogger.info("User ordered coffee", { drinkID: 30, paymentID: 20082 });
  sessionLogger.debug("User logged out");
  ```
</CodeGroup>

#### Usando múltiplos backends de logging

Para enviar logs tanto para o logger do AppSignal quanto para o `STDOUT`, adicione outro transport:

<CodeGroup>
  ```javascript JavaScript theme={null}
  const winston = require("winston");
  const { WinstonTransport } = require("@appsignal/nodejs");

  const logger = winston.createLogger({
    transports: [
      new WinstonTransport({ group: "app" }),
      new winston.transports.Console(),
    ],
  });
  ```
</CodeGroup>

### Uso com Pino

<Compatibility versions={[{ name: "AppSignal for Node.js", version: "3.5.4" }]} />

Se o Pino é a sua biblioteca de logging preferida, você pode usar o transport Pino do AppSignal para enviar logs ao AppSignal.

O argumento group terá como padrão "app" se não for fornecido.

<CodeGroup>
  ```javascript Node.js theme={null}
  import pino from "pino";

  const logger = pino({
    transport: {
      targets: [
        { target: "@appsignal/nodejs/pino", options: { group: "my-group" } }
      ],
    },
  });
  ```
</CodeGroup>

#### Usando múltiplos backends de logging

Para enviar logs tanto para o logger do AppSignal quanto para o `STDOUT`, adicione outro target:

<CodeGroup>
  ```javascript Node.js theme={null}
  import pino from "pino";

  const logger = pino({
    transport: {
      targets: [
          { target: "@appsignal/nodejs/pino", options: { group: "my-group" } },
          { target: 'pino/file', options: {destination: 1} }
      ],
    },
  });
  ```
</CodeGroup>

## Formatos

### Formato detectado automaticamente

<Compatibility versions={[{ name: "AppSignal for Node.js", version: "3.7.2" }]} />

O pacote AppSignal for Node.js 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>
  ```javascript Node.js theme={null}
  const { Appsignal } = require("@appsignal/nodejs");

  // Plaintext format
  const logger = Appsignal.logger("app", "info");
  logger.info("This is about the blog");

  // Logfmt format
  const logger = Appsignal.logger("app", "info");
  logger.info("category=blog This is about the blog");

  // JSON format
  const logger = Appsignal.logger("app", "info");
  logger.info('{"category": "blog", "message": "This is about the blog"}');
  ```
</CodeGroup>

### Logfmt

<Compatibility versions={[{ name: "AppSignal for Node.js", version: "3.0.11" }]} />

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 Node.js, 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 o valor `"logfmt"` como terceiro argumento.

<CodeGroup>
  ```javascript Node.js theme={null}
  const { Appsignal } = require("@appsignal/nodejs");

  const logger = Appsignal.logger("app", "info", "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 Node.js", version: "3.0.11" }]} />

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 Node.js, 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 o valor `"json"` como terceiro argumento.

<CodeGroup>
  ```javascript Node.js theme={null}
  const { Appsignal } = require("@appsignal/nodejs");

  const logger = Appsignal.logger("app", "info", "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 `ignoreLogs`](/nodejs/3.x/configuration/options#option-ignorelogs) 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 Node.js 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!
