"Ah, aí está você! Você se lembrou que temos outra aula hoje?"

"Não, eu só estava procurando por você. Quase..."

"Excelente, então vamos começar. Hoje quero falar sobre extração de madeira."

"O log é uma lista dos eventos que ocorreram. Quase como um diário de bordo ou um diário. Ou Twitter - talvez você possa se relacionar melhor com isso. Sem surpresa, um logger é um objeto que você usa para registrar."

"Na programação, costuma-se registrar quase tudo. E em Java, registramos tudo e até um pouco mais."

"O fato é que os programas Java geralmente são grandes aplicativos de servidor sem interface do usuário, console, etc. Eles processam milhares de solicitações de usuários ao mesmo tempo e geralmente há vários erros. Especialmente quando diferentes threads começam a interferir uns nos outros."

"Na verdade, a única maneira de procurar bugs e falhas raramente reproduzíveis nessas circunstâncias é registrar tudo o que acontece em cada thread."

"Na maioria das vezes, o log contém informações sobre argumentos de método, quaisquer erros detectados e muitas informações intermediárias."

"Quanto mais completo o log, mais fácil é reproduzir uma sequência de eventos e rastrear as causas de falhas ou bugs."

"Às vezes, os logs atingem vários gigabytes por dia. Isso é normal."

"Alguns gigabytes? O_o"

"Sim. Na maioria das vezes, os arquivos de log são arquivados automaticamente, com uma indicação da data relevante."

"Uau."

"Uh-huh. Inicialmente, Java não tinha seu próprio logger. Como resultado, vários loggers independentes foram escritos. O mais comum deles era o log4j."

"Alguns anos depois, o Java ganhou um logger próprio, mas sua funcionalidade era muito inferior e não era amplamente utilizado."

"É fato que Java tem um logger oficial, mas toda a comunidade de programadores Java prefere usar outros loggers. "

"Posteriormente, vários outros loggers foram escritos com base no log4j."

"Em seguida, o registrador universal especial slf4j, que agora é amplamente usado, foi escrito para todos eles. É muito semelhante ao log4j, então vou usá-lo como exemplo ao explicar o registro."

"Todo o processo de registro consiste em três partes."

" Primeiro , colete informações."

" Em segundo lugar , filtre as informações coletadas."

" Terceiro , registre as informações selecionadas."

"Vamos começar com a coleta. Aqui está um exemplo típico de uma classe que registra:"

Classe com registro
class Manager
{
 private static final Logger logger = LoggerFactory.getLogger(Manager.class);

 public boolean processTask(Task task)
 {
  logger.debug("processTask id = " + task.getId());
  try
  {
   task.start();
   task.progress();
   task.complete();
   return true;
  }
  catch(Exception e)
  {
   logger.error("Unknown error", e);
   return false;
  }
 }
}

"Preste atenção nas palavras destacadas em vermelho."

" Linha 3  – Crie o objeto logger . Tal objeto estático é criado em quase todas as classes! Bem, exceto para classes que não fazem nada além de armazenar dados."

" LoggerFactory é uma classe especial para criar registradores e getLogger é um de seus métodos estáticos. O objeto atual geralmente é passado, mas várias opções são possíveis."

" Linha 7 – As informações sobre a chamada do método são gravadas no logger. Observe que esta é a primeira linha do método. Assim que o método é chamado, imediatamente gravamos as informações no log."

"Chamamos o método debug, o que significa que a importância da informação é o nível DEBUG. Ele é usado para filtragem. Falarei sobre isso em alguns minutos."

" Linha 17 – Pegamos uma exceção e... imediatamente a gravamos no log! Isso é exatamente o que precisa ser feito."

"Dessa vez chamamos o método error, que imediatamente indica que a informação está no nível ERROR"

Registrador - 1

"Tudo parece claro por enquanto. Bem, até onde pode ficar claro no meio da nossa conversa."

"Ótimo, então vamos para a filtragem de mensagens."

"Normalmente, cada mensagem de log tem seu próprio nível de importância, que você pode usar para descartar algumas das mensagens. Aqui estão os níveis de importância que mencionei:"

nível de importância Descrição
TODOS Todas as mensagens
VESTÍGIO Mensagens de depuração refinadas
DEPURAR Mensagens de depuração importantes
INFORMAÇÕES mensagens informativas
AVISAR Avisos
ERRO Erros
FATAL erros fatais
DESLIGADO Sem mensagens

Esses níveis também são usados ​​ao filtrar mensagens.

Suponha que você defina o nível de registro como WARN. Então todas as mensagens menos importantes que WARN serão descartadas: TRACE, DEBUG, INFO.

Se você definir o nível de filtragem como FATAL, até mesmo as mensagens de ERRO serão descartadas.

"Existem mais dois níveis de importância usados ​​na filtragem: OFF, que descarta todas as mensagens; e ALL, que mostra todas as mensagens (nada é descartado)."

"Como e onde configuro a filtragem?"

"Eu vou te dizer sem mais delongas."

"Normalmente, as configurações do registrador log4j são especificadas no arquivo log4j.properties."

Você pode especificar vários objetos anexadores neste arquivo. Os dados são gravados nesses objetos. Existem fontes de dados e anexadores - objetos que têm propósitos opostos. Objetos para os quais os dados fluem como água.

"Aqui estão alguns exemplos:"

Fazendo login no console
# Root logger option
log4j.rootLogger = INFO, stdout

# Direct log messages to stdout
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss}

Linhas 1 e 4 – Estes são comentários

Linha 2 – Indicamos o nível de log que queremos. Todos os níveis menos importantes (DEBUG, TRACE) serão descartados.

No mesmo local, adicionamos uma vírgula e, a seguir, indicamos o nome do objeto (que nós mesmos criamos) no qual o log será gravado. As linhas 5-9 contêm suas configurações.

Linha 5 – Especificamos o tipo de appender ( ConsoleAppender ).

Linha 6 – Indicamos exatamente onde estamos escrevendo ( System.out. ).

Linha 7 – Definimos a classe que irá gerenciar os padrões de conversão (PatternLayout).

Linha 8 – Definimos o padrão de conversão que será utilizado para a escrita. No exemplo acima, é a data e a hora.

"E aqui está a aparência da gravação em um arquivo:"

Registrando em um arquivo
# Root logger option
log4j.rootLogger = INFO, file

# Direct log messages to a log file
log4j.appender.file = org.apache.log4j.RollingFileAppender
log4j.appender.file.File = C:\\loging.log
log4j.appender.file.MaxFileSize = 1MB
log4j.appender.file.MaxBackupIndex = 1
log4j.appender.file.layout = org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern = %-5p %c{1}:%L - %m%n

"A linha 2 define o nível de filtragem de mensagens e o nome do objeto anexador (coletor)."

"Linha 5 – Especificamos o tipo de anexador de arquivo ( RollingFileAppender )."

"Linha 6 – Especificamos o nome do arquivo no qual o log será gravado."

"Linha 7 – Especificamos o tamanho máximo do log. Quando esse limite de tamanho é excedido, um novo arquivo é criado."

"Linha 8 – Especificamos o número de arquivos de log antigos a serem armazenados."

"Linhas 9-10 – Defina o padrão de conversão."

"Não sei o que está acontecendo aqui, mas posso adivinhar. Isso é encorajador."

"Ótimo. Aqui está um exemplo de como gravar um log em um arquivo e no console:"

Registrando no console e em um arquivo
# Root logger option
log4j.rootLogger = INFO, file, stdout

# Direct log messages to a log file
log4j.appender.file = org.apache.log4j.RollingFileAppender
log4j.appender.file.File = C:\\loging.log
log4j.appender.file.MaxFileSize = 1MB
log4j.appender.file.MaxBackupIndex = 1
log4j.appender.file.layout = org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern = %-5p %c{1}:%L - %m%n

# Direct log messages to stdout
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss}

"Ah, então você pode fazer isso? Isso é ótimo!"

"Sim. Você pode declarar quantos appenders quiser e customizar cada um."

Além disso, cada anexador pode ter configurações muito flexíveis para filtragem de mensagens. Não apenas podemos atribuir um nível de filtragem de mensagem individual para cada appender, mas também podemos filtrar mensagens por pacote! É por isso que você precisa especificar uma classe ao criar um logger (estou falando sobre LoggerFactory.getLogger ).

"Por exemplo:"

Registrando no console e em um arquivo
# Root logger option
log4j.rootLogger = INFO, file, stdout

# Direct log messages to a log file
log4j.appender.file = org.apache.log4j.RollingFileAppender
log4j.appender.file.threshold = DEBUG
log4j.appender.file.File = C:\\loging.log
log4j.appender.file.MaxFileSize = 1MB
log4j.appender.file.MaxBackupIndex = 1
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern = %-5p %c{1}:%L - %m%n

# Direct log messages to stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.threshold = ERROR
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss}

log4j.logger.org.springframework = ERROR
log4j.logger.org.hibernate = ERROR
log4j.logger.com.codegym = DEBUG
log4j.logger.org.apache.cxf = ERROR

"Linhas 6 e 15 – Definimos nosso próprio nível de filtragem para cada appender."

"Linhas 20-23 – Especificamos o nome do pacote e o nível de filtragem para suas mensagens. Log4j.logger é um prefixo: o nome do pacote é destacado em laranja."

"Sério? Você pode até fazer isso. Bem, legal!"

"A propósito, nem log4j nem slf4j estão incluídos no JDK. Você precisará baixá-los separadamente. Você pode fazer isso aqui . Mas há outra maneira:"

" Etapa 1 .Adicionar importações à classe:"

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

" Etapa 2. Coloque o cursor nessas linhas e pressione Alt+Enter no IntelliJ IDEA"

" Etapa 3 . Escolha o item de menu 'Arquivo jar na web.'

" Etapa 4 . Escolha 'slf4j-log4j13.jar'"

" Etapa 5. Especifique onde baixar a biblioteca (jar)"

" Passo 6. Use as classes que você precisa."

"Uau! Que dia foi esse. Tanta coisa nova e tanta coisa legal!"

"Aqui está outro bom artigo sobre log: https://docs.oracle.com/javase/10/core/java-logging-overview.htm#JSCOR-GUID-48004124-2C00-49F7-A640-0C0DDA271DBC "

"Tudo bem, já chega. Vá relaxar, programador."