java - ejemplo - ¿No se han encontrado agregadores para el registrador(log4j)?
log4j.properties ejemplo (25)
He puesto log4j en mi ruta de acceso de compilación, pero recibo el siguiente mensaje cuando ejecuto mi aplicación:
log4j:WARN No appenders could be found for logger (dao.hsqlmanager).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
¿Qué significan estas advertencias? ¿Cuál es el appender aquí?
Agregue lo siguiente como primer código:
Properties prop = new Properties();
prop.setProperty("log4j.rootLogger", "WARN");
PropertyConfigurator.configure(prop);
Asegúrese de que el archivo de propiedades se haya establecido correctamente. Y nuevamente, parece que el compilador no puede encontrar el archivo de propiedades, se puede establecer como seguimiento en el pom (solo cuando se usa el proyecto de Maven).
<build>
<sourceDirectory> src/main/java</sourceDirectory>
<testSourceDirectory> src/test/java</testSourceDirectory>
<resources>
<resource>
<directory>resources</directory>
</resource>
</resources>
</build >
Asegúrese de que su proyecto esté abierto en Eclipse, luego haga clic en el menú "Ejecutar" en la parte superior de Eclipse y haga clic en lo siguiente:
correr
Ejecutar configuraciones
Classpath (pestaña)
Entradas de usuario
agregar el tarro a la derecha
agregar el archivo jar log4j
Aplicar
correr
El mensaje de error ya no debería aparecer.
Como se explicó anteriormente hay 2 enfoques.
El primero es agregar esta línea a tu método principal:
BasicConfigurator.configure();
El segundo enfoque es agregar este archivo log4j.properties estándar a su ruta de clase :
Mientras toma el segundo enfoque, debe asegurarse de que inicializa el archivo correctamente, por ejemplo.
Properties props = new Properties();
props.load(new FileInputStream("log4j property file path"));
props.setProperty("log4j.appender.File.File", "Folder where you want to store log files/" + "File Name");
Asegúrese de crear la carpeta requerida para almacenar los archivos de registro.
Creo que deberías entender dónde se encuentran los archivos de configuración log4j en el archivo jar log4j o en el código Java.
src/main/resources/log4j.properties
es la ruta de Eclipse. Colóquelos en una ubicación adecuada para que no tenga que codificar la ruta absoluta en el código.
Lea mi artículo y la solución de muestra para eso http://askyourquestions.info/2016/03/27/how-to-see-where-the-log-is-logger-in-slf4j/
En el eclipse de Java, copie su carpeta conf_ref a conf.
En mi caso, el error fue la bandera " aditividad ". Si es "falso" para su paquete de proyecto raíz, entonces los paquetes secundarios no tendrán un appender y verá el error " appender not found ".
Esta breve introducción a la guía log4j es un poco antigua pero sigue siendo válida.
Esa guía le brindará información sobre cómo usar registradores y agregadores.
Solo para ponerte en marcha tienes dos enfoques simples que puedes tomar.
El primero es agregar esta línea a tu método principal:
BasicConfigurator.configure();
El segundo enfoque es agregar este log4j.properties
estándar (tomado de la guía mencionada anteriormente) a su ruta de clase:
# Set root logger level to DEBUG and its only appender to A1.
log4j.rootLogger=DEBUG, A1
# A1 is set to be a ConsoleAppender.
log4j.appender.A1=org.apache.log4j.ConsoleAppender
# A1 uses PatternLayout.
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
Esto es sólo una advertencia.
Fijación
Esto ocurre cuando los archivos de configuración predeterminados log4j.properties
y log4j.xml
no se pueden encontrar y la aplicación no realiza una configuración explícita.
Para solucionarlo, simplemente cree / copie log4j.properties
o log4j.xml
en su ubicación en la ruta de clase (generalmente lo mismo que los archivos jar).
Opcionalmente, configure la opción java: -Dlog4j.configuration=file:///path/to/log4j.properties
.
log4j
utilizaThread.getContextClassLoader().getResource()
para localizar los archivos de configuración predeterminados y no comprueba directamente el sistema de archivos. Conocer la ubicación adecuada para colocarlog4j.properties
olog4j.xml
requiere comprender la estrategia de búsqueda del cargador de clases en uso.log4j
no proporciona una configuración predeterminada ya que la salida a la consola o al sistema de archivos puede estar prohibida en algunos entornos.
Depuración
Para la depuración, puede intentar usar el parámetro -Dlog4j.debug=true
.
Configuración de log4j.properties
Configuración de muestra de log4j.properties
:
# Set root logger level to DEBUG and its only appender to A1.
log4j.rootLogger=DEBUG, A1
# A1 is set to be a ConsoleAppender.
log4j.appender.A1=org.apache.log4j.ConsoleAppender
# A1 uses PatternLayout.
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
# Print only messages of level WARN or above in the package com.foo.
log4j.logger.com.foo=WARN
Aquí hay otro archivo de configuración que usa varios agregadores:
log4j.rootLogger=debug, stdout, R
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
# Pattern to output the caller''s file name and line number.
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=example.log
log4j.appender.R.MaxFileSize=100KB
# Keep one backup file
log4j.appender.R.MaxBackupIndex=1
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n
Apache Solr
Si usa Solr , copie <solr>/example/resources/log4j.properties
en una ubicación en la ruta de <solr>/example/resources/log4j.properties
.
La configuración de muestra de log4j.properties
de Solr es como:
# Logging level
solr.log=logs/
log4j.rootLogger=INFO, file, CONSOLE
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%-4r [%t] %-5p %c %x /u2013 %m%n
#- size rotation with log cleanup.
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.MaxFileSize=4MB
log4j.appender.file.MaxBackupIndex=9
#- File to log to and log format
log4j.appender.file.File=${solr.log}/solr.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%-5p - %d{yyyy-MM-dd HH:mm:ss.SSS}; %C; %m/n
log4j.logger.org.apache.zookeeper=WARN
log4j.logger.org.apache.hadoop=WARN
# set to INFO to enable infostream log messages
log4j.logger.org.apache.solr.update.LoggingInfoStream=OFF
Ver también:
La instalación de Mi Eclipse no pudo encontrar log4j.properties
al ejecutar pruebas JUnit desde Eclipse, a pesar de que el archivo se encontraba en src/test/resources
.
La razón fue que Eclipse (o el conector m2e ) no copió el contenido de src/test/resources
en la carpeta de salida target/test-classes
esperada target/test-classes
- la causa principal fue que en las propiedades del proyecto bajo Java Build Path -> Source source - > Carpetas de origen en la ruta de compilación -> src / test / resources , de alguna manera hubo una entrada Excluded: **
. Quité esa entrada excluida .
Alternativamente, podría haber copiado manualmente src/test/resources/log4j.properties
para target/test-classes/log4j.properties
.
La mayoría de las respuestas aquí sugirieron que el archivo log4j.properties
se coloque en la ubicación correcta (para el proyecto de Maven, debe estar ubicado en src/main/resources
)
Pero para mí, el problema es que mi log4j.properties
no está configurado correctamente. Aquí hay una muestra que funciona para mí, puedes probarla primero.
# Root logger option
log4j.rootLogger=INFO, stdout
# Direct log messages to stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
La razón puede ser la falta de la palabra static
en algunos:
final static Logger logging = Logger.getLogger(ProcessorTest.class);
Si hago que el registrador sea el campo de instancia, recibo exactamente esta misma advertencia:
No appenders could be found for logger (org.apache.kafka.producer.Sender)
Lo que es peor, la advertencia apunta no a ProcessorTest
, donde vive el error, sino a una clase absolutamente diferente (Remitente) como fuente de problemas. Esa clase tiene set logger correcto y no necesita ningún cambio! ¡Podríamos buscar el problema por años!
La solución en este sitio funcionó para mí https://crunchify.com/java-how-to-configure-log4j-logger-property-correctly/ . Ahora no veo advertencias en absoluto de log4j
Puse esto en un archivo log4j.properties que puse en src / main / resources
# This sets the global logging level and specifies the appenders
log4j.rootLogger=INFO, theConsoleAppender
# settings for the console appender
log4j.appender.theConsoleAppender=org.apache.log4j.ConsoleAppender
log4j.appender.theConsoleAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.theConsoleAppender.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
Log4J muestra este mensaje de advertencia cuando el código Java de Log4j está buscando crear una primera línea de registro en su programa.
En este momento, Log4j hace 2 cosas.
- busca encontrar el archivo
log4j.properties
- Busca para instanciar el appender definido en
log4j.properties
Si log4J
no encuentra el archivo log4j.properties
o si el aplicador declarado en log4j.rootlogger
no está definido en log4j.properties
otra log4j.properties
archivo log4j.properties
se muestra el mensaje de advertencia.
PRECAUCIÓN: el contenido del archivo de propiedades debe ser correcto.
El siguiente contenido NO es correcto
log4j.rootLogger=file
log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=c:/Trace/MsgStackLogging.log
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=%m%n
log4j.appender.FILE.ImmediateFlush=true
log4j.appender.FILE.Threshold=debug
log4j.appender.FILE.Append=false
¡porque el file
appender se declara en LOWER-CASE en la declaración log4j.rootlogger
y se define en la declaración log4j.appender usando UPPER-CASE!
Un archivo correcto sería
log4j.rootLogger=FILE
log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=c:/Trace/MsgStackLogging.log
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=%m%n
log4j.appender.FILE.ImmediateFlush=true
log4j.appender.FILE.Threshold=debug
log4j.appender.FILE.Append=false
Si se usa MAVEN, debe poner los archivos log4j.properties en src/main/resources
Y comenzar una compilación de MAVEN.
El archivo Log4j.properties luego se copia en target/classes
carpeta target/classes
.
¡Log4J usa el archivo log4j.properties
que encontró en target/classes
!
Me encontré con este problema cuando intenté construir un jar ejecutable con maven en intellij 12. Resultó que debido a que el archivo de manifiesto java no incluía una ruta de clase, el archivo de propiedades log4j no se podía encontrar en el nivel raíz (donde archivo jar fue ejecutado desde.)
Para tu información yo estaba recibiendo el registrador de esta manera:
Logger log = LogManager.getLogger(MyClassIWantedToLogFrom.class);
Y pude hacerlo funcionar con un archivo pom que incluía esto:
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.2-beta-5</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>com.mycompany.mainPackage.mainClass</mainClass>
</manifest>
<manifestEntries>
<Class-Path>.</Class-Path> <!-- need to add current directory to classpath properties files can be found -->
</manifestEntries>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
Me enfrenté al mismo problema cuando uso log4j2. Mi problema es causado por usar una biblioteca dependiente incorrecta:
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<scope>runtime</scope>
</dependency>
En su lugar, debería usar:
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<scope>runtime</scope>
</dependency>
En mi caso, tengo un log4j2.xml definido en mi directorio de "recursos", y especificado para usarlo por:
System.setProperty("log4j.configurationFile", "log4j2.xml");
Me sale el mismo error. Aquí el problema que lleva a este mensaje de error:
Creo algunos objetos que usan el registrador antes de configurar el log4j:
Logger.getLogger(Lang.class.getName()).debug("Loading language: " + filename);
Solución: configure log4j al principio en el método principal:
PropertyConfigurator.configure(xmlLog4JConfigFile);
// or BasicConfigurator.configure(); if you dont have a config file
Otra razón por la que esto puede suceder (en RCP4) es que está utilizando varios marcos de trabajo de registro en su archivo de destino. Como ejemplo, esto ocurrirá si usa una combinación de slf4j, log4j y ch.qos.logback.slf4j en la pestaña de contenido de los archivos de destino.
Parece que necesita agregar la ubicación de su archivo log4j.properties
a la Classpath en Eclipse.
Asegúrese de que su proyecto esté abierto en Eclipse, luego haga clic en el menú "Ejecutar" en la parte superior de Eclipse y haga clic en lo siguiente:
- correr
- Ejecutar configuraciones
- Classpath (pestaña)
- Entradas de usuario
- Avanzado (botón a la derecha)
- Añadir carpetas
- luego navegue a la carpeta que contiene su archivo log4j.properties
- Aplicar
- correr
El mensaje de error ya no debería aparecer.
Primera importación:
import org.apache.log4j.PropertyConfigurator;
Luego agregue el siguiente código al método principal:
String log4jConfPath ="path to/log4j.properties";
PropertyConfigurator.configure(log4jConfPath);
Cree un archivo en la ruta y agregue el siguiente código a ese archivo.
log4j.rootLogger=INFO, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{2}: %m%n
Si log4j.properties
está de hecho en la ruta de log4j.properties
, está usando Spring Boot para hacer un archivo WAR para implementarlo en un servidor de aplicaciones, está omitiendo un archivo web.xml
a favor de la configuración automática de Spring Boot y no recibe ningún mensaje de registro. En cualquier caso, necesita configurar Log4j explícitamente. Suponiendo que está utilizando Log4j 1.2.x:
public class AppConfig extends SpringBootServletInitializer {
public static void main( String[] args ) {
// Launch the application
ConfigurableApplicationContext context = SpringApplication.run( AppConfig.class, args );
}
@Override
protected SpringApplicationBuilder configure( SpringApplicationBuilder application ) {
InputStream log4j = this.getClass().getClassLoader().getResourceAsStream("log4j.properties");
PropertyConfigurator.configure(log4j);
return application;
}
// Other beans as required...
}
Si trabajas en conjunto con muchos proyectos, puedes enfrentar un problema de estilo.
* tienes que tener un archivo lof4j.properties y este archivo está incluido en las propiedades de registro de otro proyecto.
* Además, puede intentar colocar los archivos de propiedades log4j en la ruta src cuando el proyecto funciona Linux OS, las bibliotecas de otros proyectos y los archivos log4.properties pueden estar debajo de una carpeta en una ubicación en el classpath.
Solución rápida:
Añadir código a la función principal :
String log4jConfPath = "/path/to/log4j.properties"; PropertyConfigurator.configure(log4jConfPath);
crear un archivo llamado log4j.properties en / ruta / a
log4j.rootLogger=INFO, stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target=System.out log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{2}: %m%n
Tal vez el proyecto relevante contenga log4j en la ruta de compilación java, agrego mahout_h2o cuando encontré este problema en un proyecto mahout usando eclipse, ¡funciona!
Utiliza el registrador en su código para registrar un mensaje. El Appender
es un objeto agregado a un Logger
para escribir el mensaje en un destino específico. Hay FileAppender
para escribir en archivos de texto o ConsoleAppender
para escribir en la Consola. Necesitas mostrar tu código de configuración de Logger y Appender para obtener más ayuda.
lea el tutorial para comprender mejor la interacción entre Logger y Appender.