Log4j - Utilizando dois appenders na mesma classe

Ola,

Eu tenho dois appenders configurados no meu arquivo log4j.properties, como eu faço para na minha classe eu criar duas variávies de log uma para cada appender??

O que eu preciso é algo do tipo

Logger logger1 = Logger.getLogger(MinhaClasse.class); Logger logger2 = Logger.getLogger(MinhaClasse.class);

O logger1 utiliza um appender (JDBC) e o logger2 utiliza outro appender (arquivo)

Alguém já precisou fazer isso?? Se alguem puder me ajudar :slight_smile:

Bom,

A dificuldade era de pegar o appender do arquivo de .properties e atribuir para uma variável especifica.
Fiz uma POG aqui que resolve o assunto - não estou bem certo se é POG mesmo…

Eu criei duas classes separadas com métodos estáticos, assim na hora de chamar o log eu chamo estaticamente os métodos das classes.

Além disso eu posso passar os parâmetros que eu precisar para cada classe.

[code]log4j.rootLogger=DEBUG, app1, app2

log4j.appender.app1=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.app1.Threshold=DEBUG
log4j.appender.app1.driver=oracle.jdbc.driver.OracleDriver
log4j.appender.app1.URL=jdbc:oracle:thin:@localhost:1521:xpto
log4j.appender.app1.user=teste
log4j.appender.app1.password=teste
log4j.appender.app1.sql=INSERT INTO foo VALUES(‘bar’)
log4j.appender.app1.layout=org.apache.log4j.PatternLayout

log4j.appender.app2=org.apache.log4j.DailyRollingFileAppender
log4j.appender.app2.File=logs/xpto.log
log4j.appender.app2.DatePattern=’.'EEE
log4j.appender.app2.layout=org.apache.log4j.PatternLayout
log4j.appender.app2.layout.ConversionPattern=%-5p %t [%d{ISO8601}] %m%n

APP ROOT LOGGER

log4j.logger.com.meupacote.log.app1.TesteApp1=debug, app1
log4j.additivity.com.meupacote.log.app1.TesteApp1=true
log4j.logger.com.meupacote.log.app2.TesteApp2=debug, app2
log4j.additivity.com.meupacote.log.app2.TesteApp2=true[/code]

[code]public class Main {

public static void main (String args[]) {
    TesteApp1.logger("logando app1!!");
    TesteApp2.logger("logando app2"");
}

}
[/code]

Não conheço Log4J a fundo, mas não entendi por que você precisa de dois Loggers para ter dois appenders. Eu já usei mais de um appender para o mesmo logger (na verdade três: um para System.out, outro para arquivo-texto e outro, customizado, para Document do Swing) e todos estes appenders recebiam dados do mesmo logger. A não ser que você queira ter logs diferentes para cada tipo de appender. Seria o caso?

Então, eu já tenho uma aplicação rodando e que faz log em arquivo, eu quero colocar um log em banco mas para apenas umas situações

Ou seja, eu queria mexer o menos possível no código da aplicação

Já que você utilizou antes, como eu faria para, usando uma configuração igual a do log4j.properties acima em alguns lugares do código o meu objeto Logger utilizar o appender para arquivo e em outros lugares utilizar o appender para banco de dados??

Eu até tentei utilizar o método getAppender da classe Logger, mas eu acho que eu tenho que usar Category porque esse método estava me retornando sempre nulo

[]´s

Você pode instanciar e atribuir um appender via programação. No meu caso, eu criei um appender (estendendo a classe AppenderSkeleton do Log4J) para um javax.swing.text.Document do Swing e o liguei ao logger programaticamente.

final Appender documentAppender = new SwingDocumentAppender(processingLog.getDocument()); logger.addAppender(documentAppender); onde “logger” é um org.apache.log4j.Logger.

Assim, basta que você descubra a classe de appender do Log4J que você deseja utilizar e acredito (nunca fiz) ser possível você instanciar o appender e adicioná-lo on-the-fly ao logger.

Entendi…

mas se eu quiser pegar os appenders que já estão definidos no arquivo de properties, como faria??

Bom, na verdade decidimos abortar o uso do log4j aqui, criei uma classe Logger que utiliza a conexão do DAO e insere na tabela que preciso os dados que preciso, que a propósito vem de lugares diferentes…rs

http://www.guj.com.br/posts/list/37698.java