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

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

<VersionRequirements
  versions={[
{ name: "AppSignal Collector", version: "0.7.0" }
]}
/>

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

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

A integração Java utiliza os recursos de logging do OpenTelemetry para enviar logs ao AppSignal.

### Uso autônomo

Para usar o logging com OpenTelemetry em Java, você precisa configurar o logger usando o LoggerProvider do OpenTelemetry.

<CodeGroup>
  ```java Java theme={null}
  import io.opentelemetry.api.GlobalOpenTelemetry;
  import io.opentelemetry.api.logs.Logger;
  import io.opentelemetry.api.logs.LoggerProvider;
  import io.opentelemetry.api.logs.Severity;

  public class MyApplication {
      public void logMessages() {
          // Get the logger from the global logger provider
          LoggerProvider loggerProvider = GlobalOpenTelemetry.getLoggerProvider();
          Logger logger = loggerProvider.get("my-app");

          // Log a message
          logger.logRecordBuilder()
              .setSeverity(Severity.INFO)
              .setBody("Log message line")
              .emit();
      }
  }
  ```
</CodeGroup>

### Uso com Log4j

O Log4j é instrumentado automaticamente pelo agente Java do OpenTelemetry. Logs emitidos usando Log4j2
serão enviados automaticamente ao AppSignal.

Contextos adicionados usando `ThreadContext` ou dentro de logs `StructuredDataMessage` serão exibidos como
tags de log no AppSignal.

<CodeGroup>
  ```java Java theme={null}
  import org.apache.logging.log4j.LogManager;
  import org.apache.logging.log4j.Logger;
  import org.apache.logging.log4j.ThreadContext;
  import org.apache.logging.log4j.message.StructuredDataMessage;

  public class MyService {
      private static final Logger logger = LogManager.getLogger(MyService.class);

      public void processOrder(String orderId) {
          // This will be shown as a tag in AppSignal for all log lines
          ThreadContext.put("order_id", orderId);

          logger.info("Processing order");

          StructuredDataMessage structuredMessage = new StructuredDataMessage(
              "processing_items", // ID (not shown in AppSignal)
              String.format("Processing items in order"), // Message
              "order" // Type (not shown in AppSignal)
          );

          // This will be shown as a tag in AppSignal for this log line
          structuredMessage.put("item_count", 123);
          logger.info(structuredMessage);

          ThreadContext.clearAll();
      }
  }
  ```
</CodeGroup>

### Uso com `java.util.logging`

O framework de logging embutido do Java, `java.util.logging`, é instrumentado automaticamente pelo
agente Java do OpenTelemetry. Logs emitidos usando `java.util.logging` serão enviados automaticamente ao
AppSignal.

<CodeGroup>
  ```java Java theme={null}
  import java.util.logging.Logger;
  import java.util.logging.Level;

  public class MyApplication {
      private static final Logger logger = Logger.getLogger(MyApplication.class.getName());

      public void doSomething() {
          logger.info("Application started");
          logger.log(Level.WARNING, "This is a warning message");
          logger.severe("This is an error message");
      }
  }
  ```
</CodeGroup>

## Uso

### Enviando logs

Usando o logger do OpenTelemetry diretamente, você pode definir o nível de severidade dos seus logs:

<CodeGroup>
  ```java Java theme={null}
  import io.opentelemetry.api.GlobalOpenTelemetry;
  import io.opentelemetry.api.logs.Logger;
  import io.opentelemetry.api.logs.LoggerProvider;
  import io.opentelemetry.api.logs.Severity;

  public class MyApplication {
      public void sendLogs() {
          // Get the logger from the global logger provider
          LoggerProvider loggerProvider = GlobalOpenTelemetry.getLoggerProvider();
          Logger logger = loggerProvider.get("my-app");

          // Different severity levels
          logger.logRecordBuilder()
              .setSeverity(Severity.WARN)
              .setBody("Something went wrong")
              .emit();

          logger.logRecordBuilder()
              .setSeverity(Severity.INFO)
              .setBody("Action completed successfully")
              .emit();

          logger.logRecordBuilder()
              .setSeverity(Severity.ERROR)
              .setBody("Database connection failed")
              .emit();
      }
  }
  ```
</CodeGroup>

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

<CodeGroup>
  ```java Java theme={null}
  import io.opentelemetry.api.GlobalOpenTelemetry;
  import io.opentelemetry.api.common.AttributeKey;
  import io.opentelemetry.api.common.Attributes;
  import io.opentelemetry.api.logs.Logger;
  import io.opentelemetry.api.logs.LoggerProvider;
  import io.opentelemetry.api.logs.Severity;

  public class InvoiceService {
      public void generateInvoice(Customer customer) {
          LoggerProvider loggerProvider = GlobalOpenTelemetry.getLoggerProvider();
          Logger logger = loggerProvider.get("invoice_helper");

          logger.logRecordBuilder()
              .setSeverity(Severity.INFO)
              .setBody("Generating invoice for customer")
              .setAllAttributes(Attributes.of(
                  AttributeKey.stringKey("customer_id"), customer.getId()
              ))
              .emit();
      }
  }
  ```
</CodeGroup>

Você pode consultar e filtrar pelo conteúdo da mensagem e pelos valores dos atributos dentro da ferramenta [Log Management](/logging/log-management).

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.

## Filtrando logs

Você pode usar a [opção de configuração `ignore_logs`](/java/configuration#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 Java 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!
