Dove devo inserire il file log4j.properties?


135

Ho scritto un progetto di servizio web usando netbeans 6.7.1 con glassfish v2.1, ho messo log4j.properties nella directory principale del progetto e ho usato:

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

in costruttore:

PropertyConfigurator.configure("log4j.properties");

e nelle funzioni:

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

ma si tratta di informazioni sull'errore (in realtà, ho provato a metterlo in quasi tutte le directory che potevo realizzare):

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.

il progetto di esempio potrebbe essere ottenuto da http://www.91files.com/?N3F0QGQPWMDGPBRN0QA8


2
Qual è lo scopo di PropertyConfigurator.configure ("log4j.properties"); linea? Non ho mai usato questo. Il tuo file log4j.xml deve essere solo "da qualche parte" nel tuo percorso di classe.
Antoine Claval,

1
Guarda stackoverflow.com/questions/1140358/… per scoprire come viene registrata la configurazione stessa di log4j. Penso che questo dovrebbe aiutarti molto, perché alcuni contenitori hanno la loro configurazione log4j.
dz.

@AntoineClaval Ho rimosso quella linea maledetta e ha funzionato come un fascino. Amico, che cavalcata ...
Siddharth,

Risposte:


113

So che è un po 'tardi per rispondere a questa domanda, e forse hai già trovato la soluzione, ma sto pubblicando la soluzione che ho trovato (dopo aver cercato su Google molto) quindi potrebbe aiutare un po':

  1. Inserisci log4j.properties in WEB-INF \ classi del progetto come indicato in precedenza in questo thread.
  2. Inserisci log4j-xx.jar in WEB-INF \ lib
  3. Verifica se è stato caricato log4j: aggiungi -Dlog4j.debug@ la fine delle tue opzioni Java di Tomcat

Spero che questo possa aiutare.

rgds


Utilizzare il comando 'run' per ottenere tomcat in primo piano; puoi passare le opzioni java tramite la riga di comando. Inoltre, l'opzione -x per bash è utile per vedere cosa succede esattamente alle tue opzioni: JAVA_OPTS = -Dlog4j.debug bash -x /usr/local/tomcat/bin/catalina.sh run
RoyM

50

Come già detto, log4j.properties dovrebbe essere in una directory inclusa nel percorso di classe, voglio aggiungere che in un progetto mavenized un buon posto può essere src/main/resources/log4j.properties


26

È possibile specificare il percorso del file di configurazione con l'argomento VM -Dlog4j.configuration = "file: / C: /workspace3/local/log4j.properties"


è file: / o file: /// o solo / path / to / file su un sistema unix?
Morpheus,

Per Windows è solo un file: /, immagino che unix sia lo stesso
Amalgovinus,

Questa è l'unica risposta che prende in considerazione più ambienti con livelli di registro diversi.
Matt,

Su macOS, in jvm.options di Liberty Server non usare le virgolette e il file: ///
wnm3

Solo un aggiornamento che potrebbe aiutare a risparmiare un po 'di frustrazione: se stai usando log4j2, il nome dell'argomento è stato cambiato inlog4j.configurationFile
dan.m era user2321368

25

Devi inserirlo nella directory principale, che corrisponde al contesto di esecuzione.

Esempio:

    MyProject
       src
           MyClass.java
           log4j.properties

Se si avvia l'esecuzione da un altro progetto, è necessario disporre di quel file nel progetto utilizzato per l'avvio dell'esecuzione. Ad esempio, se un progetto diverso contiene alcuni test JUnit, deve avere anche il suo file log4j.properties.


Suggerisco di usare log4j.xml invece di log4j.properties. Hai più opzioni, ottieni assistenza dal tuo IDE e così via ...


ad esempio, ho quasi messo ogni directory. ma non è utile distribuire il progetto Glassfish, perché GF non copia le proprietà nella directory corretta. Sembra che GF lo perda.
mono,

in realtà, penso che il problema sia dovuto alla distribuzione automatica dei netbeans. Provo a distribuire tramite file di guerra nella console di amministrazione, va bene. Non so se avevo ragione. Se avevo ragione, perché netbeans non distribuisce questi file quando si distribuisce automaticamente il progetto.
mono,

ha funzionato ! ma non è inelegante ... pensa che sia meglio collocato in un tipo di cartella "risorsa".
Adams.H

17

Per un progetto basato su Maven, mantieni i tuoi log4j.properties in src / main / resources. Nient'altro da fare!


Questo è tutto, ed è lo stesso per altri file delle proprietà come XMLConfiguration in Maven Projects. Grazie!
Ramon,

13

Se inserisci log4j.properties in src, non è necessario utilizzare l'istruzione -

PropertyConfigurator.configure("log4j.properties");

Verrà preso automaticamente poiché il file delle proprietà si trova nel percorso di classe.


10

Provare:

PropertyConfigurator.configure(getClass().getResource("/controlador/log4j.properties"));

9

Il file dovrebbe trovarsi nella directory WEB-INF / classes. Questa struttura di directory dovrebbe essere impacchettata all'interno del file war.


in teoria, è la risposta, ma il problema è che log4j.properties viene perso quando Glassfish distribuisce file di guerra.
mono,

3
Dovrebbe essere in WEB-INF / classi e impacchettato nel file di guerra
Martin OConnor,

@mono - almeno nell'archivio scaricabile NON ci sono log4j.properties nelle classi web / WEB-INF /. Martin ha ragione, ecco dove dovrebbe essere.
fvu,

Il trucco è che lo metti nella tua cartella src, (La tua cartella sorgente di root), nel processo di Creazione del tuo codice, il file viene trasferito automaticamente nella cartella delle classi ...
Mostafa Zeinali

7

Il mio IDE è NetBeans. Ho messo il file log4j.property come mostrato nelle immagini

Radice

cartella principale del progetto

ragnatela

cartella web

WEB-INF

Cartella WEB-INF

Per utilizzare questo file delle proprietà è necessario scrivere questo codice:

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");
    }
}

È possibile definire il contesto ServletContext statico da un altro file JSP. Esempio:

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

Ora puoi utilizzare il file log4j.property nei tuoi progetti.


5

Alcune risposte specifiche tecnicamente corrette già fornite, ma in generale, possono trovarsi ovunque sul percorso di classe di runtime, ovvero ovunque le classi vengano ricercate dalla JVM.

Potrebbe essere la directory / src in Eclipse o la directory WEB-INF / classes nella tua app distribuita, ma è meglio essere consapevoli del concetto di classpath e del motivo per cui il file è inserito in essa, non limitarti a trattare WEB-INF / classi come directory "magica".


5

Ho trascorso molto tempo per capire perché il file log4j.properties non è stato visualizzato.
Poi ho notato che era visibile per il progetto solo quando era nelle cartelle MyProject / target / classes / e MyProject / src / main / resources .
Spero che sia utile a qualcuno.
PS: il progetto era basato su maven.


3

Ho scoperto che Glassfish per impostazione predefinita sta guardando [Ubicazione installazione Glassfish] \ glassfish \ domains [il tuo dominio] \ come directory di lavoro predefinita ... puoi rilasciare il file log4j.properties in questa posizione e inizializzarlo nel tuo codice usando PropertyConfigurator Come precedentemente menzionato...

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

1

Non so che questo sia il modo corretto, ma ha risolto il mio problema. metti il ​​file log4j.properties in "cartella progetto" / config e usa PropertyConfigurator.configure ("config // log4j.properties");

funziona con IDE ma non quando si esegue il file jar da soli. quando esegui il file jar da solo, copia il file log4j.properties nella cartella in cui si trova il file jar. quando il file jar e le proprietà nella stessa directory funzionano correttamente.


1

Inserisci log4j.properties in classpath. Ecco i 2 casi che ti aiuteranno a identificare la posizione corretta: 1. Per l'applicazione web il percorso di classe è / WEB-INF / classi.

\WEB-INF      
    classes\
        log4j.properties
  1. Per eseguire il test dal test principale / unità, il percorso di classe è la directory di origine

    \Project\
       src\
          log4j.properties

1

Ci sono molti modi per farlo:

Way1: se si sta provando nel progetto maven senza usare PropertyConfigurator

Primo: controlla la directory delle risorse su 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 lo screenshot:

! [inserisci la descrizione dell'immagine qui

Way2: se si sta provando con il file Properties per il progetto java / maven, utilizzare PropertyConfigurator

Posiziona il file delle proprietà ovunque nel progetto e fornisci il percorso corretto. ad esempio: src / javaLog4jProperties / log4j.properties

statico{

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

}

inserisci qui la descrizione dell'immagine

Way3: se si sta provando con xml sul progetto java / maven, utilizzare DOMConfigurator

Posiziona il file delle proprietà ovunque nel progetto e fornisci il percorso corretto. dì: src / javaLog4jProperties / log4j.xml

statico{

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

}

inserisci qui la descrizione dell'immagine


1

L'impostazione del progetto standard avrà una struttura di progetto simile a:

src/main/java
src/main/resources

Inserite log4j.properties nella cartella delle risorse, è possibile creare la cartella delle risorse se non esiste


0

In realtà, ho appena riscontrato questo problema in una struttura di progetto Java standard come segue:

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

In Eclipse ho bisogno di aggiungere la cartella res per creare il percorso, tuttavia, in Intellij, devo contrassegnare la cartella res come rese come mostra lo screenshot collegato: fare clic destro sulla cartella res e contrassegnare come risorse .


0

Non è necessario specificare PropertyConfigurator.configure("log4j.properties");nella classe Log4J, se sono già stati definiti log4j.properties nella struttura del progetto.

In caso di progetto dinamico Web: -

Devi salvare log4j.properties in WebContent -> WEB-INF -> log4j.properties

Spero che questo possa aiutarti.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.