SLF4J - Log parametrizado

Conforme discutido anteriormente neste tutorial, o SLF4J fornece suporte para mensagens de log parametrizadas.

Você pode usar parâmetros nas mensagens e passar valores para elas posteriormente na mesma instrução.

Sintaxe

Conforme mostrado abaixo, você precisa usar marcadores de posição ({}) na mensagem (String) sempre que precisar e, posteriormente, você pode passar o valor para o marcador de posição em object forma, separando a mensagem e o valor com vírgula.

Integer age;
Logger.info("At the age of {} ramu got his first job", age);

Exemplo

O exemplo a seguir demonstra o registro parametrizado (com parâmetro único) usando SLF4J.

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class PlaceHolders {
   public static void main(String[] args) {
      
      //Creating the Logger object
      Logger logger = LoggerFactory.getLogger(PlaceHolders.class);
      Integer age = 23;
      
      //Logging the information
      logger.info("At the age of {} ramu got his first job", age);
   }
}

Resultado

Após a execução, o programa acima gera a seguinte saída -

Dec 10, 2018 3:25:45 PM PlaceHolders main
INFO: At the age of 23 Ramu got his first job

Vantagem de registro parametrizado

Em Java, se precisarmos imprimir valores em uma instrução, usaremos o operador de concatenação como -

System.out.println("At the age of "+23+" ramu got his first job");

Isso envolve a conversão do valor inteiro 23 em string e a concatenação desse valor para as strings ao seu redor.

E se for uma declaração de registro, e se esse nível de registro específico de sua declaração estiver desabilitado, todo esse cálculo será inútil.

Nessas circunstâncias, você pode usar o registro parametrizado. Nesse formato, inicialmente SLF4J confirma se o log para um determinado nível está habilitado. Nesse caso, ele substitui os marcadores de posição nas mensagens pelos respectivos valores.

Por exemplo, se tivermos uma declaração como

Integer age;
Logger.debug("At the age of {} ramu got his first job", age);

Somente se a depuração estiver habilitada, SLF4J converte a idade em inteiro e a concatena com as strings, caso contrário, não faz nada. Assim, incorrendo no custo de construção de parâmetros quando o nível de registro é desabilitado.

Variante de Dois Argumentos

Você também pode usar dois parâmetros em uma mensagem como -

logger.info("Old weight is {}. new weight is {}.", oldWeight, newWeight);

Exemplo

O exemplo a seguir demonstra o uso de dois marcadores de posição no registro parametrizado.

import java.util.Scanner;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class PlaceHolders {
   public static void main(String[] args) {
      Integer oldWeight;
      Integer newWeight;
      Scanner sc = new Scanner(System.in);
      System.out.println("Enter old weight:");
      oldWeight = sc.nextInt();

      System.out.println("Enter new weight:");
      newWeight = sc.nextInt();

      //Creating the Logger object
      Logger logger = LoggerFactory.getLogger(Sample.class);

      //Logging the information
      logger.info("Old weight is {}. new weight is {}.", oldWeight, newWeight);
 
      //Logging the information
      logger.info("After the program weight reduced is: "+(oldWeight-newWeight));
   }
}

Resultado

Após a execução, o programa acima gera a seguinte saída.

Enter old weight:
85
Enter new weight:
74
Dec 10, 2018 4:12:31 PM PlaceHolders main
INFO: Old weight is 85. new weight is 74.
Dec 10, 2018 4:12:31 PM PlaceHolders main
INFO: After the program weight reduced is: 11

Variante de múltiplos argumentos

Você também pode usar mais de dois marcadores de posição, conforme mostrado no exemplo a seguir -

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class PlaceHolders {
   public static void main(String[] args) {
      Integer age = 24;
      String designation = "Software Engineer";
      String company = "Infosys";

      //Creating the Logger object
      Logger logger = LoggerFactory.getLogger(Sample.class);

      //Logging the information
      logger.info("At the age of {} ramu got his first job as a {} at {}", age, designation, company);
   }
}

Resultado

Após a execução, o programa acima gera a seguinte saída -

Dec 10, 2018 4:23:52 PM PlaceHolders main
INFO: At the age of 24 ramu got his first job as a Software Engineer at Infosys