Onde devo colocar o arquivo log4j.properties?

135

Eu escrevi um projeto de serviço da web usando o netbeans 6.7.1 com glassfish v2.1, coloque log4j.properties no diretório raiz do projeto e use:

static Logger logger = Logger.getLogger(MyClass.class);

no Construtor:

PropertyConfigurator.configure("log4j.properties");

e em funções:

logger.info("...");
logger.error("...");
// ...

mas, são informações de erro (na verdade, tentei colocá-lo em quase todos os diretórios que pude perceber):

log4j:ERROR Could not read configuration file [log4j.properties].
java.io.FileNotFoundException: log4j.properties (The system cannot find the file specified)
        at java.io.FileInputStream.open(Native Method)
        at java.io.FileInputStream.<init>(FileInputStream.java:106)
        at java.io.FileInputStream.<init>(FileInputStream.java:66)
        at org.apache.log4j.PropertyConfigurator.doConfigure(PropertyConfigurator.java:297)
        at org.apache.log4j.PropertyConfigurator.configure(PropertyConfigurator.java:315)
        at com.corp.ors.demo.OrsDemo.main(OrisDemo.java:228)
log4j:ERROR Ignoring configuration file [log4j.properties].
log4j:WARN No appenders could be found for logger (com.corp.ors.demo.OrsDemo).
log4j:WARN Please initialize the log4j system properly.

o projeto de exemplo pode ser obtido em http://www.91files.com/?N3F0QGQPWMDGPBRN0QA8

mono
fonte
2
Qual é o objetivo do PropertyConfigurator.configure ("log4j.properties"); linha ? Eu nunca uso este. Seu arquivo log4j.xml deve estar apenas "em algum lugar" no seu caminho de classe.
Antoine Claval 28/09/09
1
Veja stackoverflow.com/questions/1140358/… para descobrir como a própria configuração do log4j está sendo registrada. Eu acho que isso deve ajudá-lo muito, porque alguns contêineres têm sua própria configuração log4j.
dz.
@AntoineClaval Eu removi a linha amaldiçoada e funcionou como um encanto. Cara, que passeio ..
Siddharth

Respostas:

113

Sei que é um pouco tarde para responder a essa pergunta, e talvez você já tenha encontrado a solução, mas estou postando a solução que encontrei (depois que pesquisei bastante no Google), por isso pode ajudar um pouco:

  1. Coloque log4j.properties em WEB-INF \ classes do projeto, conforme mencionado anteriormente neste encadeamento.
  2. Coloque log4j-xx.jar em WEB-INF \ lib
  3. Teste se log4j foi carregado: adicione -Dlog4j.debug@ o final das suas opções java do tomcat

Espero que isso ajude.

rgds

senhorita
fonte
Use o comando 'run' para obter o tomcat em primeiro plano; você pode passar opções java através da linha de comando. Além disso, a opção -x para bash é útil para ver o que exatamente acontece com suas opções: JAVA_OPTS = -Dlog4j.debug bash -x /usr/local/tomcat/bin/catalina.sh run
RoyM
50

Como já foi dito, o log4j.properties deve estar em um diretório incluído no caminho de classe. Quero acrescentar que, em um projeto automatizado, um bom local pode ser src/main/resources/log4j.properties

Stivlo
fonte
26

Você pode especificar o local do arquivo de configuração com o argumento da VM -Dlog4j.configuration = "file: / C: /workspace3/local/log4j.properties"

Makatun
fonte
é file: / ou file: /// ou apenas / path / to / file em um sistema unix?
morpheus
Para Windows é apenas file: /, eu estou supondo unix é o mesmo
Amalgovinus
Essa é a única resposta que leva que leva em consideração vários ambientes com diferentes níveis de log.
Matt
No macOS, no jvm.options do Liberty Server, não use aspas nem use o arquivo: ///
wnm3
Apenas uma atualização que poderia ajudar a salvar alguma frustração: se você estiver usando log4j2, o nome do argumento foi alterado paralog4j.configurationFile
m.dan foi user2321368
25

Você deve colocá-lo no diretório raiz, que corresponde ao seu contexto de execução.

Exemplo:

    MyProject
       src
           MyClass.java
           log4j.properties

Se você começar a executar a partir de um projeto diferente, precisará desse arquivo no projeto usado para iniciar a execução. Por exemplo, se um projeto diferente realizar alguns testes JUnit, ele precisará também ter seu arquivo log4j.properties.


Sugiro usar log4j.xml em vez do log4j.properties. Você tem mais opções, obtenha assistência do seu IDE e assim por diante ...

KLE
fonte
por exemplo, eu quase coloco em todos os diretórios. mas não é útil implantar o projeto Glassfish, porque o GF não copia propriedades para o diretório correto. Parece que a GF o perde.
mono
na verdade, acho que o problema é da implantação automática de netbeans. Eu tento implantar por arquivo war no console de administração, está tudo bem. Não sei se estava certa. Se eu estava certo, por que o netbeans não implanta esses arquivos ao implantar automaticamente o projeto.
mono
funcionou ! mas não é deselegante ... acha que é melhor colocado em um tipo de pasta "recurso".
precisa saber é o seguinte
17

Para um projeto baseado em Maven, mantenha seu log4j.properties em src / main / resources. Nada mais a fazer!

Byorn
fonte
É isso mesmo, e é o mesmo para outros arquivos de propriedades como o XMLConfiguration no Maven Projects. Obrigado!
Ramon
13

Se você colocar log4j.properties dentro de src, não precisará usar a instrução -

PropertyConfigurator.configure("log4j.properties");

Ele será obtido automaticamente, pois o arquivo de propriedades está no caminho de classe.

Ani
fonte
10

Experimentar:

PropertyConfigurator.configure(getClass().getResource("/controlador/log4j.properties"));
Jhon M
fonte
9

O arquivo deve estar localizado no diretório WEB-INF / classes. Essa estrutura de diretórios deve ser empacotada no arquivo war.

Martin OConnor
fonte
em teoria, é a resposta, mas o problema é log4j.properties é perdido quando o glassfish implementa o arquivo war.
mono
3
Ele deve estar em WEB-INF / classes e embalados dentro do arquivo guerra
Martin OConnor
@mono - pelo menos no arquivo para download, NÃO HÁ log4j.properties em web / WEB-INF / classes. Martin está certo, é onde deveria estar.
fvu 02/10/2009
O truque é, você colocá-lo na pasta src, (Sua pasta de origem root), no processo de construção de seu código, o arquivo é transferido para as classes pasta automaticamente ...
Mostafa Zeinali
7

Meu IDE é o NetBeans. Coloquei o arquivo log4j.property, como mostrado nas fotos

Raiz

pasta raiz do projeto

Rede

pasta da web

WEB-INF

Pasta WEB-INF

Para usar este arquivo de propriedades, você deve escrever este código:

package example;

import java.io.File;
import org.apache.log4j.PropertyConfigurator;
import org.apache.log4j.Logger;
import javax.servlet.*;
public class test {

public static ServletContext context;
static Logger log = Logger.getLogger("example/test");

public test() {

        String homeDir = context.getRealPath("/");
        File propertiesFile = new File(homeDir, "WEB-INF/log4j.properties");
        PropertyConfigurator.configure(propertiesFile.toString());
        log.info("This is a test");
    }
}

Você pode definir o contexto estático ServletContext de outro arquivo JSP. Exemplo:

test.context = getServletContext(); 
test sample = new test(); 

Agora você pode usar o arquivo log4j.property em seus projetos.

Ali Mamedov
fonte
5

Algumas respostas específicas tecnicamente corretas já foram fornecidas, mas, em geral, elas podem estar em qualquer lugar no caminho de classe do tempo de execução, ou seja, onde quer que as classes sejam procuradas pela JVM.

Pode ser o diretório / src no Eclipse ou o diretório WEB-INF / classes em seu aplicativo implementado, mas é melhor estar ciente do conceito de caminho de classe e por que o arquivo é colocado nele, não apenas trate WEB-INF / classes como um diretório "mágico".

Brian
fonte
5

Gastei muito tempo para descobrir por que o arquivo log4j.properties não é visto.
Então notei que ele estava visível para o projeto apenas quando estava nas pastas MyProject / target / classes / e MyProject / src / main / resources .
Espero que seja útil para alguém.
PS: O projeto foi baseado em artigos.

RedCH
fonte
3

Descobri que o Glassfish por padrão está visualizando [local de instalação do Glassfish] \ glassfish \ domains [seu domínio] \ como o diretório de trabalho padrão ... você pode soltar o arquivo log4j.properties nesse local e inicializá-lo no seu código usando PropertyConfigurator Como mencionado anteriormente...

Properties props = System.getProperties();
System.out.println("Current working directory is " + props.getProperty("user.dir"));
PropertyConfigurator.configure("log4j.properties");
Durandal00
fonte
1

Não sei se essa é a maneira correta, mas resolveu o meu problema. coloque o arquivo log4j.properties em "pasta do projeto" / config e use PropertyConfigurator.configure ("config // log4j.properties");

funcionará com o IDE, mas não quando você mesmo executar o arquivo jar. quando você executa o arquivo jar sozinho, copie o arquivo log4j.properties para a pasta em que o arquivo jar está. quando o arquivo jar e property no mesmo diretório, ele executa bem.

sampathpremarathna
fonte
1

Coloque log4j.properties no caminho de classe. Aqui estão os 2 casos que ajudarão você a identificar o local adequado: 1. Para aplicativos da Web, o caminho da classe é / WEB-INF / classes.

\WEB-INF      
    classes\
        log4j.properties
  1. Para testar a partir do teste main / unit, o caminho da classe é o diretório de origem

    \Project\
       src\
          log4j.properties
Sharif
fonte
1

Há muitas maneiras de fazer isso:

Way1: se você estiver tentando no projeto maven sem usar o PropertyConfigurator

Primeiro: verifique o diretório de recursos em scr / main

  if available,
       then: create a .properties file and add all configuration details.
  else
       then: create a directory named resources and a file with .properties     
write your configuration code/details.

segue a captura de tela:

! [insira a descrição da imagem aqui

Way2: Se você estiver tentando com o arquivo Properties para o projeto java / maven, use PropertyConfigurator

Coloque o arquivo de propriedades em qualquer lugar do projeto e forneça o caminho correto. diga: src / javaLog4jProperties / log4j.properties

estático{

 PropertyConfigurator.configure("src/javaLog4jProperties/log4j.properties");

}

insira a descrição da imagem aqui

Way3: Se você está tentando com xml no projeto java / maven Use DOMConfigurator

Coloque o arquivo de propriedades em qualquer lugar do projeto e forneça o caminho correto. diga: src / javaLog4jProperties / log4j.xml

estático{

 DOMConfigurator.configure("src/javaLog4jProperties/log4j.xml");

}

insira a descrição da imagem aqui

Shivendra Pandey
fonte
1

Sua configuração padrão do projeto terá uma estrutura de projeto semelhante a:

src/main/java
src/main/resources

Se você colocar log4j.properties dentro da pasta de recursos, poderá criar a pasta de recursos se ela não existir.

Robert Squire
fonte
0

Na verdade, acabei de enfrentar esse problema em uma estrutura padrão de projeto Java, da seguinte maneira:

\myproject
    \src
    \libs
    \res\log4j.properties

No Eclipse, preciso adicionar a pasta res para criar o caminho, no entanto, no Intellij, preciso marcar a pasta res como recursos, como mostra a captura de tela vinculada: clique com o botão direito do mouse na pasta res e marque como recursos .

Miracle Chan
fonte
0

Você não precisa especificar PropertyConfigurator.configure("log4j.properties");na sua classe Log4J, se você já definiu o log4j.properties na estrutura do seu projeto.

No caso de Projeto Dinâmico da Web: -

Você precisa salvar seu log4j.properties em WebContent -> WEB-INF -> log4j.properties

Espero que isso possa ajudá-lo.

Manish Patel
fonte