¿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


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


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


26

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


¿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.


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!


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.


10

Tratar:

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

9

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


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.


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".


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.


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

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.


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

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í


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


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 .


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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.