Você está na página 1de 10

Log4J User Guide

1. Introdução
2. Download
3. Instalação
4. Configuração
1. Configurando por programação
2. Através de arquivo .properties
5. Componentes
1. Logger
2. Appender
1. SMTPAppender - logs via e-mail
3. Layout
6. Um arquivo de configuração abrangente

Sobre esse Tutorial
Néki Technologies.

Agradecimentos ao Néki Team!

Introdução
Podemos afirmar que instruções de log, isto é, mensagens indicando o comportamento de um
programa, podem poluir o código e diminuir a legibilidade. Além disso, o log aumenta o tamanho do
código e reduz sua velocidade.

Log4j é um projeto de código aberto (open Source) baseado no trabalho de diversos autores. Ele
permite ao desenvolvedor controlar, de maneira flexível, cada saída de log. Com o ele, podemos ativar
o log em tempo de execução sem modificar os binários da aplicação, esse comportamento pode ser
controlado apenas editando um arquivo de configuração.

Uma das características do Log4j é a herança em loggers. Usando uma hierarquia de loggers é possível
controlar quais instruções de log serão usadas. Isto ajuda a reduzir o volume de saídas e minimizar
seu custo.

A saída poderá ser um arquivo, um OutputStream, um java.io.Writer, um servidor Log4j remoto, um
daemon Unix, ou mesmo um evento de log do Windows.

talvez.jar (onde xxx é a versão).8. esta é.Download A versão atual do Log4J é a 1. } Através de arquivo .log4j. Os loggers podem ser criados e configurados em qualquer ordem. Configurando por programação Basta chamar o método estático configure() da classe org. Esse planejamento é feito na configuração. private SessionFactory sessionFactory.apache. Este arquivo deve ser colocado no classpath da aplicação.BasicConfigurator. A configuração pode ser feita por programação.properties. fica claro que é obtida uma flexibilidade muito maior ao usarmos outras duas formas possíveis de configuração: um arquivo xml ou um arquivo de propriedades (no formato chave=valor). Isto tudo pode ser feito em um arquivo que deve ser chamado de log4j.org/log4j/docs/download.2. é importante que não seja preciso modificá-las manualmente. desta forma a configuração é feita apenas uma vez e é carregada na inicialização da aplicação. .apache.html onde poderá ser obtido o código fonte e as bibliotecas para uso.info("Iniciando a aplicacao").entretanto. em particular um logger irá encontrar e agrupar seus descendentes mesmo que ele seja instanciado depois deles. Configuração Para se usar o Log4j deve-se ter um considerável planejamento e esforço.configure(). a parte mais importante ao utilizar o Log4j. logger.properties Configurar o Log4j é de fato setar os loggers para mostrar as mensagens de log nos appenders escolhidos usando layouts determinados pelo desenvolvedor. seu download pode ser feito em http://logging. pois após colocarmos instruções de log dentro do código de um sistema. Instalação Para começar a usar o Log4J. basta descompactar o arquivo que foi baixado e colocar o log4j-xxx. public static void main(String[] args) { BasicConfigurator.

stdout.appender.category.fileOut.fileOut =org.appender.name=INHERITED #### O primeiro appender escreve no console log4j.appender.fileOut.fileOut.layout.rootCategory=DEBUG.log # Controla o tamanho maximo do arquivo log4j. Similarmente.INFO .%m%n Componentes O Log4j possui três componentes principais: loggers.ConversionPattern=%p %t %c .appender. INFO.RollingFileAppender log4j.MaxFileSize=100KB # Faz backup dos arquivos de log (apenas 1) log4j. assim como "java" é um ancestor de "java. log4j.appender. O nome de um logger deve seguir o mesmo estilo já conhecido dos programadores Java.layout.log4j.) desta forma: "com.appender.out.fileOut.Veja um exemplo: #### Usando 2 appenders.FATAL log4j.println está em sua habilidade de desabilitar certos níveis de log (quando estes não são necessários) enquanto os demais níveis continuam funcionando normalmente. separando por pontos (.appender.stdout=org. outro para um arquivo log4j. stdout.layout=org.ConversionPattern=%5p [%t] (%F:%L) .NAME=WARN # Explicita a herança do nivel de prioridade #log4j. O Log4j oferece cinco níveis de log em sua hierarquia: DEBUG. ERROR e FATAL.category.apache.SEU.%m%n #### O segundo appender escreve em um arquivo log4j.category.log4j. e controle em tempo de execução como estas mensagens são formatadas e onde são reportadas.Bar" e este chamado de child. .File=example.PatternLayout # Pattern que mostra o nome do arquivo e numero da linha.apache.apache. 1 para logar no console.ERROR .stdout. Logger A primeira e principal vantagem de qualquer API de log sobre o System.PatternLayout log4j.foo" é um parent de "com. O nível da hierarquia de log será informado quando da chamada ao método de log. appenders e layouts. WARN.foo.fileOut.Bar".apache. dizemos que "com" é um ancestor de "com.appender.layout=org. fileOut # Imprime somente mensagens com 'priority' WARN ou mais alto para o logger #lembrando a ordem: DEBUG .MaxBackupIndex=1 log4j.log4j.foo. Eles trabalham juntos para que os desenvolvedores façam o log de suas mensagens de acordo com o tipo e o nível delas.appender.ConsoleAppender log4j.your.util.Vector".log4j.WARN .LOGGER.

a maioria das operações de log. a cada semana por exemplo).logs via e-mail Com Log4j é possível enviar os logs facilmente para um destinatário de e-mail. basta setar a propriedade Threshold=<nivel minimo>. o console.meramente existe mas nao manda mensagens para nenhum dispositivo.envia os eventos de log para um servidor de logs remoto através do protocolo TCP. etc.err (mudado com a propriedade Target)  FileAppender .Threshold=WARN Isto significa dizer que somente as mensagens com nível WARN.log4j.com/products/javamail).meuLogger.apache.envia os logs para um daemon (monitor de logs) remoto  JMSAppender . este appender pode fazer um backup de tempos em tempos (definido pelo desenvolvedor.é subclasse de FileAppender. sendo que este pode fazer um backup do arquivo sempre que ele atingir um determinado tamanho. é necessário utilizar o JavaBeans Activation Framework (http://java.html) .SMTPAppender Como o SMTPAppender usa a JavaMail API da Sun (http://java.sun. Por exemplo. por exemplo.possibilita que os logs sejam coletados em um buffer e depois enviados para um ou mais appender anexados a ele  NullAppender .envia para um arquivo  RollingFileAppender . desta forma serão mostradas todas as mensagens que tiverem prioridade igual ou maior do que o nível setado. Appenders: ConsoleAppender . Um logger pode ter mais de um appender.envia para o sistema de log de uma máquina com plataforma Windows. SMTPAppender .  DailyRollingFileAppender .appender para enviar o log para um destinatário de e-mail  SocketAppender . um servidor remoto de sockets.envia os logs como uma mensagem JMS  AsyncAppender .envia as mensagens de log para o System. ERROR e FATAL serão mostradas. podemos mandar as mensagens de log para o console e para um arquivo ao mesmo tempo.  SMTPAppender . Appender Um appender é uma saída onde são mostradas as mensagens. log4j.out (default) ou System.log4j. mandar para o console todas as mensagens enquanto que para o arquivo podemos salvar apenas as mensagens de nível WARN. para setar o tempo.  NTEventLogAppender .  SyslogAppender . ou seja.sun. seguindo a ordem: DEBUG < INFO < WARN < ERROR < FATAL.é subclasse de FileAppender. são feitas através desta classe.appender. exceto configuração.Logger é a classe central do Log4j.apache.com/beans/glasgow/jaf. basta usar o mesmo pattern da classe SimpleDateFormat na propriedade DatePattern. algum arquivo. usando o appender org.A classe org. Além disso podemos mostrar níveis diferentes de mensagens nos appenders diferentes. Para filtrar os tipos de logs.net.

layout=org.jar.rootCategory=DEBUG.BufferSize=2 log4j.appender.appender.emailOut.htmlOut=org.log4j.ConversionPattern=%d{ISO8601} %5p [%t](%F:%L).appender.appender.htmlOut.log4j.log4j.emailOut. Estes dois arquivos devem ser colocados no CLASSPATH da aplicação. qual linha.htmlOut.apache.appender.HTMLLayout log4j. etc.appender. seguindo o pattern escolhido pelo desenvolvedor.layout.Enviando por e-mail -------------------! log4j. Daí então.emailOut=org.appender.TTCCLayout Para usar um destes layouts é muito simples.appender.Threshold=DEBUG log4j.appender.log4j.log4j.From=<seu e-mail> log4j.net.apache.Subject=<assunto> log4j.%m%n O e-mail enviado conterá exatamente as mensagens de log como aparecem no console por exemplo.appender.SimpleLayout -org.apache.apache.appender.htmlOut.html.apache.apache. o nível .html log4j. e neste arquivo terá uma tabela com o tempo decorrido em milisegundos desde quando o programa foi iniciado. emailOut !-------------------.File=logging/HTMLLayout. qual o método que contém o log. Este formato pode incluir a data da mensagem.emailOut.emailOut. Log4j fornece as seguintes classes de Layout: org.Layout (abstrata) -org.RollingFileAppender log4j.emailOut.HTMLLayout -org.log4j. a thread que disparou o log.apache.mail que pode ser encontrado no arquivo mail.layout=org. veja este exemplo que irá criar um saída em uma tabela HTML: log4j. classe. htmlOut !-------------------------------HTMLLayout OPTIONS----------------------------! log4j.htmlOut.DateLayout(abstrata): org.emailOut.PatternLayout log4j.emailOut.emailOut.To=<destinatario> log4j.PatternLayout -org.layout.XMLLayout -org.log4j.apache.appender. e o pacote javax.SMTPAppender log4j.jar da Sun.rootCategory=DEBUG.SMTPHost=<seu servidor smtp> log4j.appender. Layout Layout é o formato como a mensagem vai ser mostrada.log4j.log4j. só é preciso fazer a devida configuração assim como qualquer outro appender: log4j.log4j.através do arquivo activation.layout.LocationInfo=true log4j.log4j.apache.apache.apache.appender.Title=Log gerado pelo Log4j Isto irá criar um arquivo com o nome HTMLLayout. arquivo.

prioridade (o -5 indica que deve alinhar a direita se o número de caracteres for menor que cinco) c .log4j. Ela serve justamente para formatar um evento de log e retornar uma string que será mostrada no appender escolhido. podemos mostrar tais informações na ordem em que escolhermos e com o formato que desejarmos. o nome do arquivo *.ConversionPattern=%-2d{dd/MM/yy HH:mm} [%t] %5p %c:%L - %m%n Isto irá mostrar 22/01/04 13:07 [main] INFO logging.Sort . a classe.UseLogger :12 .log4j.b. Veja este exemplo: Pattern: "%r [%t] %-5p %c{2} . stdOut # stdOut usa PatternLayout log4j.org/log4j/docs/api/org/apache/log4j/PatternLayout. consulte a classe org.c" por exemplo.de prioridade. numero de milissegundos transcorridos desde o inicio do programa t .layout=org.PatternLayout nos javadocs do Log4j.UseLogger :14 .apache. Isto depende do pattern usado.appender.apache. é a mensagem (não pode faltar !) n .apache.c") m . deverá ser mostrado apenas "b.PatternLayout. a versão on-line é http://logging.rootCategory=DEBUG.java desta classe e o número da linha (se LocationInfo = true) e a mensagem de log."\n" ou "\r\n" Para usar os patterns devemos dizer que o layout será da classe org. para fazer a formatação usamos uma propriedade de PatternLayout chamada ConversionPattern.Fim da aplicacao Para ver a lista dos patterns.html .stdOut.stdOut. Veja como esta configuração é simples: log4j.layout.%m%n" 176 [main] INFO examples.Iniciando a aplicacao 22/01/04 13:07 [main] INFO logging.appender. Ao enviar o log para o console ou para um arquivo por exemplo. um ótimo exemplo é o formato da data.nome da classe (2 indica que se o nome completo da classe for "a.log4j.Populating an array of 2 elements in reverse order r . nome da thread que gerou o evento de log p .apache. podemos mostrar "dd/mm/aaaa" ou "aaaa-mm-dd" com hora ou não.PatternLayout log4j.é o separador de linhas padrão do sistema operacional .

ConsoleAppender #log4j.category.SimpleLayout log4j.dest1. dest1 log4j.TestLogging=false log4j.appender.appender. # ############################################################################### !-----------------------------------------------------------------------------! ! PLACE THIS FILE ANYWHERE IN CLASSPATH ! ! Appenders are additive by default. System properties are searched first and ! ! then this file.debug=true ! Set this to false for log4j to actually obey the log4j. ! ! Priorities are inherited until overridden in a category.disable=INFO !-----------------------------------------------------------------------------! ! Configure categories (loggers) ! !-----------------------------------------------------------------------------! ! ROOT CATEGORY (Usually sufficient to set this one only) ! Here. .dest1=org. paste and uncomment them above.dest1. logs messages with priority DEBUG (default) or higher #log4j.ConversionPattern=%-5p %l %x: %m%n !----------------------####### END OF PROPERTIES #######----------------------! ############################################################################### # Below I document in more detail how to write a log4j configuration file.appender.disable property(next) #log4j.apache.layout=org. the value of the key can be defined as a system ! ! property or in this file itself.log4j.disableOverride=false ! Disable all logging in all categories for messages with priority equal to ! or lower than the one given here #log4j.rootCategory=.layout=org.log4j. dest1 log4j.apache. # # SELECTIVELY copy lines beginning with #.log4j.additivity. ! ! In ${property_key}.apache. #log4j.layout.debug=true #log4j.dest1.TestLogging=DEBUG.disable=fatal #log4j.appender.PatternLayout #log4j.rootCategory=.Um arquivo de configuração abrangente Veja abaixo um arquivo com muitas opções de configuração do Log4j. ! !-----------------------------------------------------------------------------! !-----------------------------------------------------------------------------! ! Configure log4j's operation at the meta level ! !-----------------------------------------------------------------------------! ! Observe log4j parsing this file #log4j. dest1 ! Or.

dest1.MaxBackupIndex=2 ! WRITE LOG TO A FILE.appender.) #log4j.dest3.appender. #log4j.dest2.appender.MaxFileSize=300KB ! Rollover log file at the start of each week #log4j.log4j.log4j.appender.TestLogging=false ! !-----------------------------------------------------------------------------! !-----------------------------------------------------------------------------! ! Configure appenders (log destinations/targets) and their options ! !-----------------------------------------------------------------------------! ! WRITE TO CONSOLE (stdout or stderr) #log4j.SimpleLayout ! USE A C PRINTF STYLE PATTERN TO FORMAT LOG MESSAGE #log4j.ImmediateFlush=true ! WRITE LOG TO A FILE. dest1.appender.your log message) #log4j. overrides ancestor's priority and makes it WARN or higher for this cat.appender.TestLogging=DEBUG.Append=false ! Control the maximum log file size #log4j.dest3. dest3 ! ! If you DO NOT want additivity for this category.apache.home}/log4j.appender.'yyyy-ww !-----------------------------------------------------------------------------! ! Configure appender layouts (log formats) and their options ! !-----------------------------------------------------------------------------! ! USE SIMPLE LOG FORMAT (e.apache.#log4j.MaxFileSize=100KB ! Keep backup file(s) (backups will be in filename.DailyRollingFileAppender ! Specify the file name #log4j.1.dest2=org. dest3 !--------DON'T DO THIS!!! APPENDERS ARE ADDITIVE BY DEFAULT!!!---------------! ! It will write the same log message TWICE to dest1. .ConversionPattern=%-5p: %m%n .log4j.apache.apache.RollingFileAppender ! This appender will only log messages with priority equal to or higher than ! the one specified here #log4j.dest1=org.File=${java.ConsoleAppender #log4j.appender.layout=org.dest1.dest3. dest1.dest2.dest1. ROLL THE FILE EVERY WEEK #log4j. then for ! ! this category.appender.TestLogging=DEBUG.DatePattern='.g.category.appender. overwrite #log4j.appender.appender.File=log4TestLogging2.dest1. ROLL THE FILE AFTER SOME SIZE #log4j.PatternLayout ! For a pattern layout. #log4j.layout=org.TestLogging=WARN.2 etc.rootCategory=debug.dest2. say so ! !#log4j. specify the pattern (Default is %m%n which is fastest) #log4j.category.log4j.dest2.dest2. Once for root. dest2 ! YOUR CATEGORIES (to customize logging per class/pkg/project/etc) ! Here.category.log ! Don't append.Threshold=ERROR ! Specify the file name (${property_key} gets substituted with its value) #log4j.appender.log4j.html ! Control the maximum log file size #log4j.appender.layout. ! !#log4j.apache.additivity.appender.dest3=org. dest3 ! Or. INFO .

#log4j.dest3.name=false ! .Java method name ! ! ! !------------------------------FORMAT MODIFIERS-------------------------------! ! %-any_letter_above .appender. INFO.appender.SSS}.ConversionPattern=[%d{yyyy-mm-dd hh:mm}.message priority (FATAL. width (truncate beginning if reqd.) ! ! %.! Or.PatternLayout #log4j.) ! ! %-10. ! ! Truncate from beginning if wider than 10 characters. WARN.LocationInfo=true ! Set <title> tag (Default: Log4J Log Messages) #log4j.dest2.disable=INFO !#log4j.properties !#log4j.dest2.Example.layout. min.dest2.Title=My App Log !-----------------------------------------------------------------------------! ! PATTERN FORMATS GLOSSARY ! !-----------------------------------------------------------------------------! ! %n .layout=org.30any_letter_above .Left-justify in min. Left-justify time elapsed within 10-wide field. ERROR.layout.%m%n #log4j.layout. (the pattern below will slow down your app) #log4j.10r[%t]%x(%F:%L) .appender.debug=true !#log4j.layout=org. ! !-----------------------------------------------------------------------------! !-----------------------------------------------------------------------------! ! OPTIONS GLOSSARY ! !-----------------------------------------------------------------------------! !-------------------------OVERALL OPTIONS FOR log4j---------------------------! ! Specify as command line option: -Dlog4j.20 char.ConversionPattern=%-5p %6.dest1.log4j. max.Java source line number ! ! %C . width (default is right-justify) ! ! %20any_letter_above .%m%n ! FORMAT LOG MESSAGES IN THE FORM OF AN HTML TABLE #log4j.appender. %C{1} will output the last one component ! ! %M .category.newline ! ! %m .Java source file name ! ! %L .log4j.layout.additivity.defaultInitOverride=false ! Specify as command line option: -Dlog4j. %d{ABSOLUTE}.dest3.your log message ! ! %p . %d{dd MMM yyyy HH:mm:ss.ConversionPattern=[%d{ISO8601}]%5p%6. DEBUG or custom) ! ! %r . ! ! %d{HH:mm:ss.name of current thread ! ! %x .Nested Diagnostic Context (NDC) (you supply it!) ! ! ! !-------------------------SLOW PERFORMANCE FORMATS----------------------------! ! %d . width (pad with spaces if reqd.%6.configuration=app_config.your.layout.HTMLLayout ! Include Java file name and line number (Default is false) #log4j.date and time.dest3.10r .name of your category (logger).6r]%- 5p[%t]%x(%F:%L) .percent sign in output ! ! ! !-----------------------SOME MORE CLUTTER IN YOUR LOG-------------------------! ! %c .apache.appender. %d{DATE}.6r[%t]%x(%F:%L) - %m%n ! Or.disableOverride=false !#log4j.appender.appender. also %d{ISO8601}. %c{2} will outputs last two components ! ! %t .Java class name.apache.30 char.Shortcut for %F%L%C%M ! ! %F .SSS} and so on ! ! %l .millisecs since program started running ! ! %% .

dest2.ImmediateFlush=true !#log4j.dest1.DatePattern='.appender.txt !#log4j.layout.Title=My app title ! !--------------------------------XMLLayout OPTIONS----------------------------! !#log4j.Threshold=INFO !#log4j. Contato: owner@hotwork.dest3.appender.appender.dest2.dest2.appender.txt !#log4j.appender.DateFormat=ISO8601 !#log4j.dest1.dest1.layout.dest2.appender.LocationInfo=true !#log4j.!----------------------------NullAppender OPTIONS-----------------------------! !#log4j.File=mylog.Append=false !#log4j.dest2.appender.appender.dev.appender.appender.appender.layout.layout.dest2.ImmediateFlush=true !#log4j.Threshold=INFO !#log4j.appender.File=mylog.dest2. Correções.appender.appender.ImmediateFlush=true !#log4j.Append=false ! !-------------------------RollingFileAppender OPTIONS-------------------------! !#log4j.dest3.CategoryPrefixing=false !#log4j.ImmediateFlush=true !#log4j.ContextPrinting=false ! !-----------------------------PatternLayout OPTIONS---------------------------! !#log4j.java.Threshold=INFO !#log4j.appender.dest1.layout.txt !#log4j.Threshold=INFO ! !---------------------------ConsoleAppender OPTIONS---------------------------! !#log4j.dest2.MaxBackupIndex=2 ! !-----------------------DailyRollingFileAppender OPTIONS----------------------! !#log4j.appender. sugestões ou qualquer outra informação relevante é de suma importância para nós e será muito bem vinda.appender.layout.Append=false !#log4j.dest2.dest1.dest2.layout.dest2.appender.ThreadPrinting=false !#log4j.err ! !-----------------------------FileAppender OPTIONS----------------------------! !#log4j.Target=System.appender.sourceforge.html .LocationInfo=true !-----------------------------------------------------------------------------! Feedback Por favor.net/hotwork/manual/log4j/log4j-user-guide.dest1.dest1.Threshold=INFO !#log4j.layout.layout.appender.appender.dest3.appender.dest2.File=mylog.dest1.appender.ConversionPattern=%m%n ! !-------------------------------HTMLLayout OPTIONS----------------------------! !#log4j. dê a sua opinião a respeito do conteúdo apresentado.dest1.dest2.appender.appender.net Fonte: http://hotwork.dest2.appender.'yyyy-ww ! !-----------------------------SimpleLayout OPTIONS----------------------------! !**None** ! !-------------TTCCLayout OPTIONS (PatternLayout is more flexible)-------------! !#log4j.MaxFileSize=100KB !#log4j.dest1.dest2.appender.TimeZoneID=GMT-8:00 !#log4j.appender.