Onde colocar o log4j.properties?

10 respostas
Luiz_Gustavo

Pessoal,

tenho um projeto modularizado, com um módulo web e um ejb (usando o Netbeans), e estou com dificuldades para fazer o log com o log4j.
Preciso fazer o log nas classes Session Bean, mas onde quer que eu coloque o log4j.properties… ele não é lido.
No caso de projetos modularizados, onde é o melhor lugar para se colcoar o log4j.properties, uma vez que vou fazer logs tanto no módulo ejb quanto no módulo web?

obrigado!

10 Respostas

R

Eu costumo colocar na raiz do source folder.

Qual application server vc tá usando ?

[]'s

Luiz_Gustavo

Rafaelprp:
Eu costumo colocar na raiz do source folder.

Qual application server vc tá usando ?

[]'s

Opa, jóia?

tô usando o glassfish… mas futuramente rodará no JBoss tb.
Eu tentei implementar um listener, para configurar o Log4J, pois deixando ele encontrar sozinho o log4j.properties não tá funcionando:

...
public void contextInitialized(ServletContextEvent sce) {
        try {
            PropertyConfigurator.configure("log4j.properties");
        }
        catch (Exception e) {
                e.printStackTrace();
        }
    }
...

e estou colocando o log4j.properties no mesmo diretório do listener… mas não está rolando.

Além disso, esse listener fica no módulo web… creio que não funcionará para o módulo ejb.

Tô realmente perdido com o log4j :?

Fazendo os exemplos encontrados por aí, com classes java simples e fora de uma IDE funciona que é uma beleza, mas dentro da IDE tá problemático.
Sei que é só porque não peguei o jeito ainda… não costumava usar antes… mas chego lá :smiley:

Alguma sugestão?

Obrigado!

ozielneto

Rafael,

nas aplicações Java SE, você precisa colocar no Classpath da aplicação.

nas aplicações Java EE, você precisar configurar via o AppServer
pois se você colocar dentro da sua aplicação, você pode encontrar problemas de classloader.

O JBoss já possui o LOG4J como serviço, para configurar o GLASSFISH é muito simples também.

Assim, sua aplicação só precisa usar a categorias criadas no arquivo de properties.

Bom estudo.

Luiz_Gustavo

ozielneto:
Rafael,

… para configurar o GLASSFISH é muito simples também…

Assim, sua aplicação só precisa usar a categorias criadas no arquivo de properties.

Olá Oziel,

estou tentando usar da seguinte forma:

private static final Category logger = Category.getInstance(NomeDaClasse.class.getName());

assim, eu espero que a categoria instanciada herde de rootCategory.

Realmente não consigo forçar a utilização de um properties de dentro da aplicação?
Seria interessante que o properties estivesse na aplicação, pois queria deixar isso independente do App Server.

Luiz_Gustavo

Neste Post no theserverside, uma das dicas é deixar que o Log4J encontre sozinho o arquivo de propriedades, mas isso parece não funcionar (no meu caso).

Dieval_Guizelini

Luiz,

eu sempre coloquei o arquivo do log4j na pasta WEB-INF/classes

Você está utilizando o locale? pode ser que esteja procurando um arquivo com pt_BR ou outro.

att

Dieval

Luiz_Gustavo

Dieval Guizelini:
Luiz,

eu sempre coloquei o arquivo do log4j na pasta WEB-INF/classes

Você está utilizando o locale? pode ser que esteja procurando um arquivo com pt_BR ou outro.

att

Dieval

Olá Dieval,

então, em outros projetos, quando usamos o Eclipse e a estrutura de diretórios contempla um diretório classes dentro do WEB-INF, costumamos colocar o arquivo aí também.
Porém nesse projeto a estrutura de diretórios é diferente…

tenho dois módulos

- modulo-web
   - src
      - conf
      - java
         - pacotes.comecam.aqui
   - web
      - WEB-INF
      - resources

- modulo-ejb
   - src
      - conf
      - java
         - pacotes.comecam.aqui
         - log4j.properties
         - Message.properties

Preciso usar log nos 2 módulos. Estou tentando colocar inicialmente no módulo de ejb, da maniera mostrada acima, colocando o properties na raiz do diretório dos fontes, mas nada. :?

E posteriormente preciso fazer com que a mesma configuração valha para o módulo web.

Alguma idéia?

Dieval_Guizelini

Luiz,

se você colocar na aplicação web uma configuração do log4j ela não ficou acessível ao módulo da aplicação?

outro palpite seria tentar fazer a leitura do arquivo que estivesse na mesma pasta do .class utilizando

InputStream is; Properties prop = new Properties(); try { is = Thread.currentThread().getClass().getResourceAsStream("Access.properties"); prop.load(is);

ou

Properties properties = new Properties( System.getProperties() ); URL url = this.getClass().getResource( "/resourcePath/resourceName" ); System.out.println( "Loading properties from URL '" + url + "'." ); URLConnection connection = url.openConnection(); properties.load( connection.getInputStream() );

ou

String jbossServerHomeDir = System.getProperty("jboss.server.home.dir"); Properties props = new Properties(); props.load(new FileInputStream(jbossServerHomeDir + "/conf/app.properties")); confFile = jbossServerHomeDir + "/" + props.getProperty("log.configfile");

talvez ajude.

fw

Luiz_Gustavo

Ah, consegui pessoal!!!
Olha o que precisei fazer (levando em consideração o esquema de organização de diretórios mostrado anteriormente):

  • deixei o log4j.properties na raiz do diretório de fontes do módulo EJB;

  • no módulo web, criei um listener:

public class LoggerListener implements ServletContextListener {

    public void contextInitialized(ServletContextEvent sce) {
        try {
            PropertyConfigurator.configure(getClass().getClassLoader().getResource("log4j.properties"));
        }
        catch (Exception e) {
                e.printStackTrace();
        }
    }

    public void contextDestroyed(ServletContextEvent sce) {

    }

}

registrado devidamente no web.xml:

<listener>
       <listener-class> pacote.LoggerListener</listener-class>
</listener>

com isso consegui usar o log tanto nos session bean quanto nos managed beans, usando o esquema:

private static final Category logger = Category.getInstance(NomeDaClasse.class.getName());

Obrigado a todos que responderam pelas dicas.

Abraços!!!

ozielneto

Veja no meu blog como configurar o Log4J no glassfish
e ainda evitar de usar listeners, empacotar o log4.jar no modulo.war ou ejb.jar.

Criado 11 de dezembro de 2007
Ultima resposta 3 de jan. de 2008
Respostas 10
Participantes 4