¿Dónde debo poner el archivo log4j.properties?

135

Escribí un proyecto de servicio web usando netbeans 6.7.1 con glassfish v2.1, puse log4j.properties en el directorio raíz del proyecto y uso:

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

en Constructor:

PropertyConfigurator.configure("log4j.properties");

y en funciones:

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

pero, es información de error (en realidad, he tratado de ponerlo en casi todos los directorios que pude darme cuenta):

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.

el proyecto de ejemplo se puede obtener de http://www.91files.com/?N3F0QGQPWMDGPBRN0QA8

mononucleosis infecciosa
fuente
2
¿Cuál es el propósito de PropertyConfigurator.configure ("log4j.properties"); línea? Nunca uso este. Su archivo log4j.xml solo debe estar "en algún lugar" en su classpath.
Antoine Claval
1
Mire stackoverflow.com/questions/1140358/… para ver cómo se registra la configuración de log4j. Creo que esto debería ayudarte mucho, porque algunos contenedores tienen su propia configuración log4j.
dz.
@AntoineClaval Eliminé esa línea maldita y funcionó a las mil maravillas. Hombre, qué paseo ..
Siddharth

Respuestas:

113

Sé que es un poco tarde para responder esta pregunta, y tal vez ya encontraste la solución, pero estoy publicando la solución que encontré (después de buscar en Google mucho), por lo que puede ayudar un poco:

  1. Coloque log4j.properties en WEB-INF \ clases del proyecto como se mencionó anteriormente en este hilo.
  2. Ponga log4j-xx.jar en WEB-INF \ lib
  3. Pruebe si log4j se cargó: agregue -Dlog4j.debug@ al final de sus opciones java de tomcat

Espero que esto ayude.

rgds

perder
fuente
Use el comando 'ejecutar' para obtener tomcat en primer plano; Puede pasar las opciones de Java a través de la línea de comando. Además, la opción -x para bash es útil para ver qué sucede exactamente con sus opciones: JAVA_OPTS = -Dlog4j.debug bash -x /usr/local/tomcat/bin/catalina.sh run
RoyM
50

Como ya se dijo, log4j.properties debe estar en un directorio incluido en el classpath, quiero agregar que en un proyecto mavenizado puede ser un buen lugar src/main/resources/log4j.properties

stivlo
fuente
26

Puede especificar la ubicación del archivo de configuración con el argumento VM -Dlog4j.configuration = "archivo: / C: /workspace3/local/log4j.properties"

Makatun
fuente
¿es file: / o file: /// o simplemente / path / to / file en un sistema unix?
morfeo
Para Windows es solo archivo: /, supongo que Unix es el mismo
Amalgovinus
Esta es la única respuesta que toma que tiene en cuenta múltiples entornos que tienen diferentes niveles de registro.
Matt
En macOS, en jvm.options de Liberty Server no use comillas y use el archivo: ///
wnm3
Solo una actualización que podría ayudar a ahorrar algo de frustración: si está utilizando log4j2, el nombre del argumento se ha cambiado alog4j.configurationFile
dan.m era user2321368 el
25

Debe ponerlo en el directorio raíz, que corresponde a su contexto de ejecución.

Ejemplo:

    MyProject
       src
           MyClass.java
           log4j.properties

Si comienza a ejecutar desde un proyecto diferente, debe tener ese archivo en el proyecto utilizado para comenzar la ejecución. Por ejemplo, si un proyecto diferente contiene algunas pruebas JUnit, también debe tener su archivo log4j.properties.


Sugiero usar log4j.xml en lugar de log4j.properties. Tiene más opciones, obtenga asistencia de su IDE, etc.

KLE
fuente
por ejemplo, casi lo pongo en todos los directorios. pero no es útil para el proyecto de despliegue Glassfish, porque GF no copia propiedades en el directorio correcto. Parece que GF lo pierde.
mono
En realidad, creo que el problema es el despliegue automático de netbeans. Intento implementarlo por archivo war en la consola de administración, está bien. No sé si tenía razón. Si tenía razón, ¿por qué netbeans no implementa estos archivos cuando se implementa automáticamente el proyecto?
mono
funcionó ! pero no es poco elegante ... cree que está mejor ubicado en una carpeta tipo "recurso".
Adams.H
17

Para un proyecto basado en Maven, mantenga sus log4j.properties en src / main / resources. ¡Nada más que hacer!

Byorn
fuente
Eso es todo, y es lo mismo para otros archivos de propiedades como XMLConfiguration en Maven Projects. ¡Gracias!
Ramon
13

Si coloca log4j.properties dentro de src, no necesita usar la declaración:

PropertyConfigurator.configure("log4j.properties");

Se tomará automáticamente ya que el archivo de propiedades está en el classpath.

Y yo
fuente
10

Tratar:

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

El archivo debe ubicarse en el directorio WEB-INF / classes. Esta estructura de directorio debe estar empaquetada dentro del archivo war.

Martin OConnor
fuente
en teoría, es la respuesta, pero el problema es que log4j.properties se pierde cuando glassfish despliega el archivo de guerra.
mono
3
Debe estar en WEB-INF / classes y empaquetado dentro del archivo de guerra
Martin OConnor
@mono: al menos en el archivo descargable NO hay log4j.properties en web / WEB-INF / classes. Martin tiene razón, ahí es donde debería estar.
fvu
El truco es que lo pones en tu carpeta src, (tu carpeta fuente raíz), en el proceso de construcción de tu código, el archivo se transfiere a la carpeta de clases automáticamente ...
Mostafa Zeinali
7

Mi IDE es NetBeans. Puse el archivo log4j.property como se muestra en las imágenes

Raíz

carpeta raíz del proyecto

Web

carpeta web

WEB-INF

Carpeta WEB-INF

Para usar este archivo de propiedades, debe escribir 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");
    }
}

Puede definir el contexto estático de ServletContext desde otro archivo JSP. Ejemplo:

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

Ahora puede usar el archivo log4j.property en sus proyectos.

Ali Mamedov
fuente
5

Ya se han proporcionado algunas respuestas específicas técnicamente correctas, pero en general, puede estar en cualquier lugar del classpath en tiempo de ejecución, es decir, donde sea que JVM busque las clases.

Este podría ser el directorio / src en Eclipse o el directorio WEB-INF / classes en su aplicación implementada, pero es mejor tener en cuenta el concepto de classpath y por qué se coloca el archivo en él, no solo trate WEB-INF / clases como un directorio "mágico".

Brian
fuente
5

He dedicado mucho tiempo a descubrir por qué no se ve el archivo log4j.properties .
Entonces noté que era visible para el proyecto solo cuando estaba en las carpetas MyProject / target / classes / y MyProject / src / main / resources .
Espero que sea útil para alguien.
PD: El proyecto se basó en Maven.

RedCH
fuente
3

Descubrí que Glassfish por defecto está mirando [Glassfish install location] \ glassfish \ domains [su dominio] \ como el directorio de trabajo predeterminado ... puede soltar el archivo log4j.properties en esta ubicación e inicializarlo en su código usando PropertyConfigurator como se menciono antes...

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

No sé si esta es la forma correcta, pero resolvió mi problema. coloque el archivo log4j.properties en la "carpeta de proyecto" / config y use PropertyConfigurator.configure ("config // log4j.properties");

funcionará con IDE pero no cuando ejecute el archivo jar usted mismo. cuando ejecute el archivo jar usted mismo, simplemente copie el archivo log4j.properties en la carpeta en la que se encuentra el archivo jar. Cuando el archivo jar y la propiedad en el mismo directorio se ejecute bien.

sampathpremarathna
fuente
1

Ponga log4j.properties en classpath. Estos son los 2 casos que lo ayudarán a identificar la ubicación adecuada: 1. Para la aplicación web, el classpath es / WEB-INF / classes.

\WEB-INF      
    classes\
        log4j.properties
  1. Para probar desde la prueba principal / unidad, el classpath es el directorio fuente

    \Project\
       src\
          log4j.properties
Sharif
fuente
1

Hay muchas formas de hacerlo:

Way1: si está intentando en un proyecto maven sin usar PropertyConfigurator

Primero: verifique el directorio de recursos en 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.

sigue la captura de pantalla:

! [ingrese la descripción de la imagen aquí

Way2: si está intentando con el archivo de propiedades para el proyecto java / maven Use PropertyConfigurator

Coloque el archivo de propiedades en cualquier parte del proyecto y proporcione la ruta correcta. diga: src / javaLog4jProperties / log4j.properties

estático{

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

}

ingrese la descripción de la imagen aquí

Way3: Si está intentando con xml en un proyecto java / maven, use DOMConfigurator

Coloque el archivo de propiedades en cualquier parte del proyecto y proporcione la ruta correcta. diga: src / javaLog4jProperties / log4j.xml

estático{

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

}

ingrese la descripción de la imagen aquí

Shivendra Pandey
fuente
1

La configuración estándar del proyecto tendrá una estructura de proyecto similar a:

src/main/java
src/main/resources

Coloca log4j.properties dentro de la carpeta de recursos, puede crear la carpeta de recursos si no existe

Robert Squire
fuente
0

En realidad, acabo de experimentar este problema en una estructura de proyecto Java Stardard de la siguiente manera:

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

En Eclipse, necesito agregar la carpeta res para crear la ruta, sin embargo, en Intellij, necesito marcar la carpeta res como recursos como muestra la captura de pantalla vinculada: haga clic derecho en la carpeta res y márquela como recursos .

Milagro Chan
fuente
0

No necesita especificar PropertyConfigurator.configure("log4j.properties");en su clase Log4J, si ya ha definido log4j.properties en la estructura de su proyecto.

En caso de proyecto dinámico web: -

Debe guardar sus log4j.properties en WebContent -> WEB-INF -> log4j.properties

Espero que esto te pueda ayudar.

Patel Manish
fuente