log4j é uma estrutura de registro (APIs) confiável, rápida e flexível escrita em Java, que é distribuída sob a licença de software Apache.
log4j foi portado para as linguagens C, C ++, C #, Perl, Python, Ruby e Eiffel.
log4j é altamente configurável por meio de arquivos de configuração externos em tempo de execução. Ele vê o processo de registro em termos de níveis de prioridade e oferece mecanismos para direcionar as informações de registro para uma grande variedade de destinos, como banco de dados, arquivo, console, UNIX Syslog, etc.log4j tem três componentes principais -
madeireiros: Responsáveis por capturar informações de registro.
appenders: Responsáveis por publicar informações de registro em vários destinos preferenciais.
layouts: Responsável por formatar informações de registro em diferentes estilos.
A seguir estão os recursos do log4j -
É thread-safe.
Ele é otimizado para velocidade.
É baseado em uma hierarquia de logger nomeada.
Ele suporta vários appenders de saída por logger.
Suporta internacionalização.
Não se restringe a um conjunto predefinido de instalações.
O comportamento de registro pode ser definido em tempo de execução usando um arquivo de configuração.
Ele é projetado para lidar com exceções Java desde o início.
Ele usa vários níveis, ou seja, ALL, TRACE, DEBUG, INFO, WARN, ERROR e FATAL.
O formato da saída do log pode ser facilmente alterado estendendo a classe Layout.
O destino da saída do log, bem como a estratégia de gravação, podem ser alterados por implementações da interface do Appender.
É uma parada de falha. No entanto, embora certamente se esforce para garantir a entrega, log4j não garante que cada instrução de log será entregue ao seu destino.
A seguir estão os prós e contras do registro -
O registro é um componente importante do desenvolvimento de software. Um código de registro bem escrito oferece depuração rápida, fácil manutenção e armazenamento estruturado das informações de tempo de execução de um aplicativo.
Log também tem suas desvantagens. Isso pode tornar um aplicativo lento. Se muito prolixo, pode causar cegueira de rolagem. Para aliviar essas preocupações, o log4j foi projetado para ser confiável, rápido e extensível.
Como o registro raramente é o foco principal de um aplicativo, a API log4j se esforça para ser simples de entender e usar.
Objeto Logger - A camada de nível superior da arquitetura log4j é o Logger, que fornece o objeto Logger. O objeto Logger é responsável por capturar as informações de log e elas são armazenadas em uma hierarquia de namespace.
Objeto de layout - A camada de layout da arquitetura log4j fornece objetos que são usados para formatar informações de registro em diferentes estilos. Ele fornece suporte para objetos anexadores antes de publicar informações de registro.
Objetos de layout desempenham um papel importante na publicação de informações de registro de uma forma que seja legível e reutilizável.
Objeto Appender - Esta é uma camada de nível inferior da arquitetura log4j que fornece objetos Appender. O objeto Appender é responsável por publicar informações de registro em vários destinos preferenciais, como banco de dados, arquivo, console, UNIX Syslog, etc.
Objeto de nível - O objeto de nível define a granularidade e a prioridade de qualquer informação de registro. Existem sete níveis de registro definidos na API: OFF, DEBUG, INFO, ERROR, WARN, FATAL e ALL.
Objeto de filtro - O objeto de filtro é usado para analisar informações de registro e tomar decisões adicionais sobre se essas informações devem ser registradas ou não. Um objeto Appender pode ter vários objetos Filtro associados a ele. Se as informações de registro forem passadas para um determinado objeto Appender, todos os objetos Filtro associados a esse Appender precisam aprovar as informações de registro antes que possam ser publicadas no destino anexado.
ObjectRenderer - O objeto ObjectRenderer é especializado em fornecer uma representação String de diferentes objetos passados para a estrutura de registro. Este objeto é usado por objetos Layout para preparar as informações finais de registro.
LogManager - O objeto LogManager gerencia a estrutura de registro. Ele é responsável por ler os parâmetros de configuração iniciais de um arquivo de configuração de todo o sistema ou de uma classe de configuração.
O arquivo log4j.properties é um arquivo de configuração log4j que mantém propriedades em pares chave-valor. Por padrão, o LogManager procura um arquivo denominado log4j.properties no CLASSPATH.
layout - o Appender usa os objetos Layout e o padrão de conversão associado a eles para formatar as informações de registro.
target - O destino pode ser um console, um arquivo ou outro item dependendo do anexador.
nível - O nível é necessário para controlar a filtragem das mensagens de log.
limite - o Appender pode ter um nível de limite associado a ele, independentemente do nível do registrador. O Appender ignora quaisquer mensagens de log que tenham um nível inferior ao nível de limite.
filtro - Os objetos Filtro podem analisar informações de registro além da correspondência de nível e decidir se as solicitações de registro devem ser tratadas por um Appender específico ou ignoradas.
A sintaxe a seguir define o logger raiz com o arquivo appender:
# Define the root logger with appender file
log = /usr/home/log4j
log4j.rootLogger = DEBUG, FILE
A seguinte sintaxe define um anexador de arquivo -
# Define the file appender
log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=${log}/log.out
A sintaxe a seguir define o layout do anexador de arquivo -
# Define the layout for file appender
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.conversionPattern=%m%n
Qualquer outra instância do objeto Logger nomeado é obtida por meio do segundo método, passando o nome do logger. O nome do logger pode ser qualquer string que você pode passar, geralmente uma classe ou um nome de pacote como usamos no último capítulo e é mencionado abaixo -
static Logger log = Logger.getLogger(log4jExample.class.getName());
public void debug (Object message) da classe Logger imprime mensagens com o nível Level.DEBUG.
public void error (Object message) da classe Logger imprime mensagens com o nível Level.ERROR.
public void fatal (Object message) da classe Logger imprime mensagens com o nível Level.FATAL.
public void info (Object message) da classe Logger imprime mensagens com o nível Level.INFO.
public void warn (Object message) da classe Logger imprime mensagens com o nível Level.WARN.
public void trace (Object message) da classe Logger imprime mensagens com o nível Level.TRACE.
TODOS - todos os níveis, incluindo níveis personalizados.
DEBUG - Designa eventos informativos detalhados que são mais úteis para depurar um aplicativo.
ERROR - Designa eventos de erro que ainda podem permitir que o aplicativo continue em execução.
FATAL - Designa eventos de erro muito graves que provavelmente levarão o aplicativo ao aborto.
INFO - Designa mensagens informativas que destacam o andamento da aplicação em nível de baixa granularidade.
OFF - A classificação mais alta possível e destina-se a desligar o registro.
TRACE - Designa eventos informativos mais refinados do que DEBUG.
WARN - Designa situações potencialmente prejudiciais.
Uma solicitação de log de nível p em um logger com nível q é habilitada se p> = q. Essa regra está no cerne do log4j. Ele assume que os níveis estão ordenados. Para os níveis padrão, temos ALL <DEBUG <INFO <WARN <ERROR <FATAL <OFF.
A sintaxe a seguir define o logger raiz com o modo WARN desativando o modo DEBUG.
# Define the root logger with appender file
log = /usr/home/log4j
log4j.rootLogger = WARN, FILE
Se você deseja gerar suas informações de registro em um formato específico baseado em um padrão, você pode usar org.apache.log4j.PatternLayout para formatar suas informações de registro.
A classe PatternLayout estende a classe abstrata org.apache.log4j.Layout e substitui o método format () para estruturar as informações de registro de acordo com um padrão fornecido.
c - Usado para gerar a categoria do evento de registro. Por exemplo, para o nome da categoria "abc", o padrão% c {2} produzirá "bc".
C - usado para produzir o nome de classe totalmente qualificado do chamador que está emitindo a solicitação de registro. Por exemplo, para o nome da classe. "org.apache.xyz.SomeClass", o padrão% C {1} produzirá "SomeClass".
d - Usado para gerar a data do evento de registro. Por exemplo,% d {HH: mm: ss, SSS} ou% d {dd MMM aaaa HH: mm: ss, SSS}.
F - usado para produzir o nome do arquivo onde a solicitação de registro foi emitida.
l - Usado para produzir informações de localização do chamador que gerou o evento de registro.
L - usado para produzir o número da linha de onde a solicitação de registro foi emitida.
m - Usado para emitir a mensagem fornecida pelo aplicativo associada ao evento de registro.
M - Usado para enviar o nome do método onde a solicitação de registro foi emitida.
n - Produz o caractere ou caracteres separadores de linha dependentes da plataforma.
p - Usado para emitir a prioridade do evento de registro.
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 produzir o nome do thread que gerou o evento de registro.
x - Usado para gerar o NDC (contexto de diagnóstico aninhado) associado ao thread que gerou o evento de registro.
X - o caractere de conversão X é seguido pela chave do MDC. Por exemplo, X {clientIP} imprimirá as informações armazenadas no MDC em relação à chave clientIP.
% - o sinal de porcentagem literal. %% imprimirá um sinal%.
Por padrão, as informações relevantes são exibidas como saída no estado em que se encontram. No entanto, com o auxílio de modificadores de formato, é possível alterar a largura mínima do campo, a largura máxima do campo e a justificativa.
% 20c - bloco esquerdo com espaços se o nome da categoria tiver menos de 20 caracteres.
% -20c - Teclado direito com espaços se o nome da categoria tiver menos de 20 caracteres.
% .30c - Truncar desde o início se o nome da categoria tiver mais de 30 caracteres.
% 20.30c - Bloco esquerdo com espaços se o nome da categoria tiver menos de 20 caracteres. No entanto, se o nome da categoria tiver mais de 30 caracteres, truncar desde o início.
% -20,30c - Teclado direito com espaços se o nome da categoria tiver menos de 20 caracteres. No entanto, se o nome da categoria tiver mais de 30 caracteres, truncar desde o início.
Se você deseja gerar suas informações de registro em um arquivo formatado em HTML, pode usar org.apache.log4j.HTMLLayout para formatar suas informações de registro.
A classe HTMLLayout estende a classe abstrata org.apache.log4j.Layout e substitui o método format () de sua classe base para fornecer formatação no estilo HTML.
Ele fornece as seguintes informações a serem exibidas -
O tempo decorrido desde o início do aplicativo antes que um determinado evento de registro fosse gerado.
O nome do encadeamento que invocou a solicitação de registro.
O nível associado a esta solicitação de registro.
O nome do registrador e a mensagem de registro.
As informações de localização opcionais para o arquivo de programa e o número da linha a partir da qual esse registro foi chamado.
HTMLLayout.setContentType (String) - define o tipo de conteúdo do conteúdo HTML. O padrão é text / html.
HTMLLayout.setLocationInfo (String) - define as informações de localização para o evento de registro. O padrão é falso.
HTMLLayout.setTitle (String) - define o título do arquivo HTML. O padrão é log4j Mensagens de log.
InstantFlush - Este sinalizador é definido por padrão como verdadeiro, o que significa que o fluxo de saída para o arquivo está sendo liberado com cada operação de acréscimo.
codificação - É possível usar qualquer codificação de caracteres. Por padrão, é o esquema de codificação específico da plataforma.
limite - o nível de limite para este anexador.
Nome do arquivo - o nome do arquivo de log.
fileAppend - Por padrão, é definido como verdadeiro, o que significa que as informações de registro estão sendo anexadas ao final do mesmo arquivo.
bufferedIO - Este sinalizador indica se precisamos habilitar a escrita em buffer. Por padrão, é definido como falso.
bufferSize - Se a E / S em buffer estiver habilitada, indica o tamanho do buffer. Por padrão, é definido como 8kb.
O código a seguir configura o flush imediato para verdadeiro -
# Set the immediate flush to true (default)
log4j.appender.FILE.ImmediateFlush=true
O código a seguir define o limite para o modo de depuração -
# Set the threshold to debug mode
log4j.appender.FILE.Threshold=debug
O código a seguir define o append como false, overwrite -
# Set the append to false, overwrite
log4j.appender.FILE.Append=false
Para gravar suas informações de registro em vários arquivos, você teria que usar a classe org.apache.log4j.RollingFileAppender, que estende a classe FileAppender e herda todas as suas propriedades.
Este é o tamanho crítico do arquivo acima do qual o arquivo será rolado.
O valor padrão é 10 MB.
Esta propriedade denota o número de arquivos de backup a serem criados.
O valor padrão é 1.
O código a seguir configura um RollingFileAppender -
# Define the root logger with appender file
log4j.rootLogger = DEBUG, FILE
# Define the file appender
log4j.appender.FILE=org.apache.log4j.RollingFileAppender
O código a seguir configura o tamanho máximo do arquivo antes do rollover -
# Set the maximum file size before rollover
log4j.appender.FILE.MaxFileSize=5KB
O código a seguir configura o máximo de arquivos a serem usados -
# Set the the backup index
log4j.appender.FILE.MaxBackupIndex=2
Um novo arquivo de log será criado.
Assim que o último arquivo de log atingir o tamanho máximo, o primeiro arquivo de log será apagado e, a partir daí, todas as informações de log serão revertidas para o primeiro arquivo de log.
Para gravar suas informações de registro em arquivos diariamente, você teria que usar a classe org.apache.log4j.DailyRollingFileAppender que estende a classe FileAppender e herda todas as suas propriedades.
Isso indica quando rolar o arquivo e a convenção de nomenclatura a ser seguida. Por padrão, a rolagem é realizada à meia-noite de cada dia.
'.' aaaa-MM - Roll over no final de cada mês e no início do próximo mês.
'.' aaaa-MM-dd - Role à meia-noite de cada dia. Este é o valor padrão.
'.' aaaa-MM-dd-a - Role ao meio-dia e meia-noite de cada dia.
'.' aaaa-MM-dd-HH - Role no início de cada hora.
'.' aaaa-MM-dd-HH-mm - Mova a cada minuto.
'.' yyyy-ww - Role no primeiro dia de cada semana, dependendo do local.
O código a seguir configura um DailyRollingFileAppender -
# Define the root logger with appender file
log4j.rootLogger = DEBUG, FILE
# Define the file appender
log4j.appender.FILE = org.apache.log4j.DailyRollingFileAppender
O código a seguir configura um DatePattern -
# Set the DatePattern
log4j.appender.FILE.DatePattern = '.' yyyy-MM-dd-a
A API log4j fornece o objeto org.apache.log4j.jdbc.JDBCAppender, que pode colocar informações de registro em um banco de dados especificado.
driver - Define a classe do driver para a string especificada. Se nenhuma classe de driver for especificada, o padrão é sun.jdbc.odbc.JdbcOdbcDriver.
senha - Define a senha do banco de dados.
sql - especifica a instrução SQL a ser executada sempre que ocorre um evento de registro. Pode ser INSERT, UPDATE ou DELETE.
URL - define o URL JDBC.
usuário - Define o nome do usuário do banco de dados.