Log4j - Log4j

Apache Log4j
Apache Log4j Logo.png
Desenvolvedor (s) Apache Software Foundation
lançamento inicial 8 de janeiro de 2001 ; 20 anos atras  ( 08/01/2001 )
Versão estável
2.14.1 / 6 de março de 2021 ; 9 dias atrás  ( 2021-03-06 )
Repositório Repositório Log4j
Escrito em Java
Sistema operacional Plataforma cruzada
Modelo Exploração madeireira
Licença Licença Apache 2.0
Local na rede Internet registrar .apache .org / log4j / 2 .x /

Apache Log4j é um utilitário de registro baseado em Java . Foi originalmente escrito por Ceki Gülcü e faz parte do projeto Apache Logging Services da Apache Software Foundation . Log4j é uma das várias estruturas de criação de log Java .

Gülcü, desde então, começaram as slf4j projectos e Logback, com a intenção de oferecer um sucessor para Log4j.

A equipe Apache Log4j criou um sucessor para Log4j 1 com a versão número 2. Log4j 2 foi desenvolvido com foco nos problemas de Log4j 1.2, 1.3, java.util.logging e Logback, e aborda problemas que apareceram nesses frameworks. Além disso, Log4j 2 oferece uma arquitetura de plug-in que o torna mais extensível do que seu antecessor. Log4j 2 não é compatível com as versões 1.x, embora um "adaptador" esteja disponível.

Em 5 de agosto de 2015, o Comitê de gerenciamento de projetos do Apache Logging Services anunciou que o Log4j 1 atingiu o fim da vida útil e que os usuários do Log4j 1 são recomendados para atualizar para o Apache Log4j 2.

Apache Log4j 2

Apache Log4j 2 é o sucessor do Log4j 1, que foi lançado como versão GA em julho de 2014. A estrutura foi reescrita do zero e foi inspirada por soluções de registro existentes, incluindo Log4j 1 e java.util.logging. As principais diferenças do Log4j 1 são:

  • Maior confiabilidade. As mensagens não são perdidas ao reconfigurar a estrutura, como em Log4j 1 ou Logback
  • Extensibilidade: Log4j 2 oferece suporte a um sistema de plug-in para permitir que os usuários definam e configurem componentes personalizados
  • Sintaxe de configuração simplificada
  • Suporte para configurações xml, json, yaml e propriedades
  • Filtros aprimorados
  • Suporte de pesquisa de propriedade para valores definidos no arquivo de configuração, propriedades do sistema, variáveis ​​de ambiente, o mapa ThreadContext e dados presentes no evento
  • Suporte para várias APIs: Log4j 2 pode ser usado com aplicativos que usam as APIs Log4j 2, Log4j 1.2, SLF4J, Commons Logging e java.util.logging (JUL).
  • Níveis de registro personalizados
  • Suporte a lambda no estilo Java 8 para "registro lento"
  • Marcadores
  • Suporte para objetos de mensagem definidos pelo usuário
  • "Livre de lixo ou com baixo teor de lixo" em configurações comuns
  • Velocidade aprimorada

Uma das características mais reconhecidas do Log4j 2 é o desempenho dos "registradores assíncronos". Log4j 2 faz uso do disruptor LMAX . A biblioteca reduz a necessidade de bloqueio do kernel e aumenta o desempenho de registro por um fator de 12. Por exemplo, no mesmo ambiente Log4j 2 pode gravar mais de 18.000.000 mensagens por segundo, enquanto outras estruturas como Logback e Log4j 1 apenas gravam <2.000.000 de mensagens por segundo.

Níveis de registro Log4j

A tabela a seguir define os níveis de log integrados e mensagens no Log4j, em ordem decrescente de gravidade. A coluna da esquerda lista a designação do nível de registro no Log4j e a coluna da direita fornece uma breve descrição de cada nível de registro.

Nível Descrição
DESLIGADO A classificação mais alta possível e destina-se a desligar o registro.
FATAL Erros graves que causam encerramento prematuro. Espere que eles fiquem imediatamente visíveis em um console de status.
ERRO Outros erros de tempo de execução ou condições inesperadas. Espere que eles fiquem imediatamente visíveis em um console de status.
AVISAR Uso de APIs obsoletas, uso inadequado de API, 'quase' erros, outras situações de tempo de execução indesejáveis ​​ou inesperadas, mas não necessariamente "erradas". Espere que eles fiquem imediatamente visíveis em um console de status.
INFO Eventos de tempo de execução interessantes (inicialização / desligamento). Espere que eles fiquem imediatamente visíveis em um console, então seja conservador e mantenha o mínimo.
DEPURAR Informações detalhadas sobre o fluxo no sistema. Espere que sejam gravados apenas em logs. De modo geral, a maioria das linhas registradas por seu aplicativo deve ser escrita como DEBUG.
VESTÍGIO Informações mais detalhadas. Espere que sejam gravados apenas em logs. Desde a versão 1.2.12.

Níveis de registro personalizados

Log4j 2 permite que os usuários definam seus próprios níveis de log. Uma ferramenta geradora de código-fonte é fornecida para criar Loggers que suportam níveis de log personalizados de forma idêntica aos níveis de log integrados. Os níveis de log personalizados podem complementar ou substituir os níveis de log integrados.

Configuração Log4j

O Log4j pode ser configurado por meio de um arquivo de configuração ou código Java. Os arquivos de configuração podem ser gravados em XML , JSON , YAML ou formato de arquivo de propriedades . Em uma configuração, você pode definir três componentes principais: Loggers, Appenders e Layouts. Configurar o registro por meio de um arquivo tem a vantagem de que o registro pode ser ativado ou desativado sem modificar o aplicativo que usa o Log4j. O aplicativo pode ser executado com logoff até que haja um problema, por exemplo, e então o log pode ser reativado simplesmente modificando o arquivo de configuração.

Os registradores são chamados de destinos de mensagens de log. Eles são os nomes conhecidos pelo aplicativo Java. Cada registrador pode ser configurado independentemente quanto ao nível de registro (FATAL, ERROR, etc.) que ele registra atualmente. Nas primeiras versões do Log4j, eles eram chamados de categoria e prioridade, mas agora são chamados de logger e nível, respectivamente. Um Logger pode enviar mensagens de log para vários Anexadores.

As saídas reais são feitas por Appenders . Existem vários Appenders disponíveis, com nomes descritivos, como FileAppender, RollingFileAppender, ConsoleAppender, SocketAppender, SyslogAppender e SMTPAppender. Log4j 2 adicionou Appenders que gravam no Apache Flume , a Java Persistence API , Apache Kafka , bancos de dados NoSQL , arquivos mapeados em memória, arquivos de acesso aleatório e terminais ZeroMQ . Vários Appenders podem ser anexados a qualquer Logger, portanto, é possível registrar as mesmas informações em várias saídas; por exemplo, para um arquivo localmente e para um ouvinte de soquete em outro computador.

Anexadores usam Layouts para formatar entradas de registro. Uma maneira popular para formatar arquivos de log de uma linha-em-um-tempo é PatternLayout, que usa uma cadeia padrão, muito parecido com o C / C ++ função printf . Existem também formatadores HTMLLayout e XMLLayout para uso quando os formatos HTML ou XML são mais convenientes, respectivamente. Log4j 2 adicionou Layouts para CSV , Graylog Extended Log Format (GELF), JSON , YAML e RFC-5424.

No Log4j 2, os filtros podem ser definidos nos elementos de configuração para fornecer um controle mais refinado sobre quais entradas de log devem ser processadas por quais registradores e anexadores. Além de filtrar por nível de log e correspondência de expressão regular na string da mensagem, o Log4j 2 adicionou filtros de burst, filtros de tempo, filtragem por outros atributos de evento de log como marcadores ou Thread Context Map e filtros de script JSR 223 .

Para depurar uma configuração com comportamento incorreto:

  • Nas configurações Log4j 2, defina o status atributo como TRACE para enviar a saída de registro de status interno para a saída padrão . Para ativar o registro de status antes que a configuração seja encontrada, use a propriedade Java VM -Dorg.apache.logging.log4j.simplelog.StatusLogger.level=trace .
  • No Log4j 1, use a propriedade Java VM -Dlog4j.debug .

Para descobrir onde um arquivo de configuração log4j2.xml foi carregado do inspect getClass().getResource("/log4j2.xml") .

Há também uma configuração "não configurada" ou "padrão" implícita do Log4j, a de um aplicativo Java instrumentado pelo Log4j que não possui qualquer configuração do Log4j. Isso imprime para o stdout um aviso de que o programa está desconfigurado e a URL para o site Log4j onde detalhes sobre o aviso e configuração podem ser encontrados. Além de imprimir este aviso, um aplicativo Log4j não configurado imprimirá apenas entradas de log ERROR ou FATAL para saída padrão.

Exemplo para Log4j 2

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="trace" monitorInterval="60">
  <Properties>
    <Property name="filename">target/test.log</Property>
  </Properties>
 
  <Appenders>
    <Console name="STDOUT">
      <PatternLayout pattern="%d %p %c{1.} [%t] %m%n"/>
    </Console>

    <File name="file" fileName="${filename}">
      <PatternLayout>
        <pattern>%d %p %c{1.} [%t] %m%n</pattern>
      </PatternLayout>
    </File>
  </Appenders>
 
  <Loggers> 
    <!-- 
         loggers whose name starts with 'org.springframework' will only log messages of level "info" or higher;
         if you retrieve Loggers by using the class name (e.g. Logger.getLogger(AClass.class))
         and if AClass is part of the org.springframework package, it will belong to this category
    -->
    <Logger name="org.springframework" level="info" additivity="false" />

    <!--
        Filter example: for loggers whose name starts with 'com.mycompany.myproduct',
        log entries of level "debug" or higher whose ThreadContextMap data contains
        the key-value pair "test=123", also send these log entries to the "STDOUT" appender.
    -->
    <Logger name="com.mycompany.myproduct" level="debug" additivity="true">
      <ThreadContextMapFilter>
        <KeyValuePair key="test" value="123"/>
      </ThreadContextMapFilter>
      <AppenderRef ref="STDOUT"/>
    </Logger>
 
    <!--
        By default, all log messages of level "trace" or higher will be logged.
        Log messages are sent to the "file" appender and 
        log messages of level "error" and higher will be sent to the "STDOUT" appender.
    -->
    <Root level="trace">
      <AppenderRef ref="file"/>
      <AppenderRef ref="STDOUT" level="error"/>
    </Root>
  </Loggers>
 
</Configuration>

Exemplo para Log4j 1.2

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC "-//LOGGER" "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd">
<log4j:configuration>
    <!-- 
         an appender is an output destination, such as the console or a file;
         names of appenders are arbitrarily chosen.
    -->
    <appender name="stdout" class="org.apache.log4j.ConsoleAppender">
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern"
                value="%d{ABSOLUTE} %5p %c{1}:%L - %m%n" />
        </layout>
    </appender>
 
    <!-- 
         loggers of category 'org.springframework' will only log messages of level "info" or higher;
         if you retrieve Loggers by using the class name (e.g. Logger.getLogger(AClass.class))
         and if AClass is part of the org.springframework package, it will belong to this category
    -->
    <logger name="org.springframework">
        <level value="info"/>
    </logger>

    <!-- 
         everything of spring was set to "info" but for class 
         PropertyEditorRegistrySupport we want "debug" logging 
    -->
    <logger name="org.springframework.beans.PropertyEditorRegistrySupport">
        <level value="debug"/>
    </logger>
 
    <logger name="org.acegisecurity">
        <level value="info"/>
    </logger>
    
    
    <root>
        <!-- 
            all log messages of level "debug" or higher will be logged, unless defined otherwise 
            all log messages will be logged to the appender "stdout", unless defined otherwise 
        -->
        <level value="debug" />
        <appender-ref ref="stdout" />
    </root>
</log4j:configuration>

TTCC

TTCC é um formato de mensagem usado pelo log4j. TTCC é um acrônimo para Time Thread Category Component . Ele usa o seguinte padrão:

 %r [%t] %-5p %c %x - %m%n

Onde

Mnemônico Descrição
% r Usado para gerar o número de milissegundos decorridos desde a construção do layout até a criação do evento de registro.
% t Usado para gerar o nome do encadeamento que gerou o evento de registro.
% p Usado para gerar a prioridade do evento de registro.
% c Usado para gerar a categoria do evento de registro.
% x Usado para gerar o NDC (contexto de diagnóstico aninhado) associado ao encadeamento que gerou o evento de registro.
% X {chave} Usado para gerar o MDC (contexto de diagnóstico mapeado) associado ao encadeamento que gerou o evento de registro para a chave especificada.
% m Usado para gerar a mensagem fornecida pelo aplicativo associada ao evento de registro.
% n Usado para gerar o caractere ou caracteres de nova linha específicos da plataforma .

Exemplo de saída
467 [main] INFO org.apache.log4j.examples.Sort - Saindo do método principal.

Portas

  • log4c - Uma porta para C. Log4C é uma biblioteca de registro baseada em C , lançada no SourceForge sob a licença LGPL . Para vários sistemas operacionais Unix , os arquivos autoconf e automake são fornecidos. No Windows, um Makefile é fornecido para uso com o MSVC . Os desenvolvedores também podem escolher usar seu próprio sistema de criação para compilar o código-fonte, dependendo de seus requisitos de engenharia de construção. Uma instância da biblioteca log4c pode ser configurada por meio de três métodos: usando variáveis ​​de ambiente , programaticamente ou via arquivo de configuração XML . log4c tem appenders para arquivos, fluxos e arquivos mapeados na memória. (Sem adaptador de soquete.) A última versão é 1.2.4, lançada em 2013, e o projeto não está mais desenvolvido ativamente.
  • log4js - Uma porta para JavaScript . Log4js está disponível sob a licença da Apache Software Foundation . Um recurso especial do Log4js é a capacidade de registrar os eventos do navegador remotamente no servidor. Usando Ajax é possível enviar os eventos de log em vários formatos ( XML , JSON , ASCII simples , etc.) para o servidor a ser avaliado. Os seguintes appenders são implementados para log4js : AjaxAppender, ConsoleAppender, FileAppender, JSConsoleAppender, MetatagAppender e WindowsEventsAppender. As seguintes classes de layout são fornecidas: BasicLayout, HtmlLayout, JSONLayout e XMLLayout. A última versão é 1.1, lançada em 2008.
  • log4javascript - outra porta para JavaScript. log4javascript é uma estrutura de registro JavaScript baseada no log4j . A versão mais recente é 1.4.9, lançada em maio de 2014.
  • JSNLog - uma porta para JavaScript . Coloca automaticamente mensagens de registradores de JavaScript em logs do lado do servidor usando um componente do lado do servidor .NET que faz interface com Log4Net, NLog, Elmah ou Common.Logging. Isso para fornecer um log integrado para eventos do lado do cliente e do servidor. Os IDs de solicitação correlacionam eventos relacionados a um usuário específico. A configuração é feita por meio de um arquivo web.config do lado do servidor. Suporta registro de exceção, incluindo rastreamentos de pilha. Em julho de 2014, a versão mais recente era 2.7.1 e as atualizações eram feitas regularmente.
  • Apache Log4net - uma porta para o Microsoft .NET Framework . O trabalho inicial foi feito pela Neoworks e doado à Apache Software Foundation em fevereiro de 2004. A estrutura é semelhante ao log4j original, mas aproveita os novos recursos do runtime .NET. Fornece contexto de diagnóstico aninhado (NDC) e contexto de diagnóstico mapeado (MDC). A versão mais recente é 2.0.8, lançada em 2017.
  • log4perl - Uma porta Perl do amplamente popular pacote de registro log4j. A última versão é 1.49, lançada em fevereiro de 2017.
  • Apache log4php - "Uma estrutura de registro versátil para PHP . Originalmente uma porta do Apache log4j para PHP, cresceu para incluir vários recursos específicos do PHP."
  • PL-SQL-Logging-Utility é uma adaptação do log4j no PL / SQL.
  • Log4db2 é um utilitário de registro para DB2 para LUW que usa instruções SQL com código SQL PL.
  • Apache Log4cxx - Uma estrutura de registro para C ++ padronizada após Apache log4j, que usa Apache Portable Runtime para a maioria dos códigos específicos de plataforma e deve ser utilizável em qualquer plataforma suportada por APR. No momento, está em incubação. A versão mais recente é 0.10.0, lançada em 2008.
  • Log4r - Uma biblioteca de registro abrangente e flexível escrita em Ruby para uso em programas Ruby. Ele foi inspirado e fornece muitos dos recursos do projeto Apache Log4j.

Veja também

Referências

Leitura adicional

links externos