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