Saltar al contenido

Especificación del archivo de configuración Log4j2 cuando se usa JAR ejecutable

Solución:

Algo que no se explica muy bien / obviamente en la documentación de Java es que si está usando un Jar ejecutable, solo usará la ruta de clase como se especifica en el archivo de manifiesto. No escuchará el -cp o --classpath argumentos.

-Dlog4j.configurationFile=directory/file.xml

Sin embargo, definitivamente debería funcionar. Supongo que se está ejecutando en Windows dada la dirección de la barra. ¿Está seguro de que lo está ejecutando desde el directorio relativo correcto?

Actualizar

Lo probé en Windows sin problemas. Usé el siguiente manifiesto:

Manifest-Version: 1.0
Built-By: andrew.flower
Build-Jdk: 1.7.0_67
Class-Path: lib/log4j-api-2.1.jar lib/log4j-core-2.1.jar
Created-By: Apache Maven 3.2.3
Main-Class: com.andrew_flower.test.Log4jTest
Archiver-Version: Plexus Archiver

Los frascos Log4j2 se encuentran en un lib/ directorio y el log4j2.xml está en el conf/ directorio. Ejecuté el siguiente comando y encontré la configuración con éxito.

java -Dlog4j.configurationFile=conflog4j2.xml -jar log4j2test1-1.0-SNAPSHOT.jar

Resolví el problema de especificar la ubicación de la configuración de log4j2 en un Jar ejecutable que creé a partir de Eclipse al incluir esto en mi código Java:

System.setProperty("log4j.configurationFile", "resources/log4j2.xml");

Tengo un paquete y necesitaba especificar la ruta a mi carpeta “recursos” (en mi carpeta “src” en Eclipse):

System.setProperty("log4j.configurationFile", "com/company/app/resources/log4j2.xml");

Observe que no incluí “src” en mi ruta y creo que es la ruta en la carpeta “bin” la que se requiere: es decir, en mi caso, “com / company / app / resources / log4j2.xml”

Mi archivo de configuración se ve así:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration> 

<appenders>

<Console name="Console" target="SYSTEM_OUT">
  <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level - %msg%n"/>  
</Console>

<RollingFile 
        name="RollingFile" 
        fileName="${sys:logFilename}"
        filePattern="${sys:logFilename}-%d{yyyy-MM-dd}-%i.log"> 
  <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level - %msg%n"/>      
  <Policies>
    <SizeBasedTriggeringPolicy size="1 MB"/>
  </Policies>  
  <DefaultRolloverStrategy max="10"/> 
</RollingFile>

</appenders> 


<loggers>     
 <root level="all">
  <appender-ref ref="Console"/>      
  <appender-ref ref="RollingFile"/> 
 </root>    
</loggers>

También observe que asigno dinámicamente la ruta del archivo de registro rodante + nombre “$ {sys: logFilename}” al incluir esto en mi código java:

System.setProperty("logFilename", "logs/myApp.log");

Para que funcionen estas 2 asignaciones dinámicas de System.setProperty, deben ejecutarse antes de la declaración “getLogger”, por lo que mi código Java se ve así:

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class MyTestLoggingClass {

 public static Logger logger = null;

 ...................
 setUpLogging();
 ...............

 public static void setUpLogging() {
    System.setProperty("log4j.configurationFile",  "com/company/app/resources/log4j2.xml");
    System.setProperty("logFilename", "logs/myApp.log");

    logger = LogManager.getLogger(Logger.class.getName());  
 }

}

Tener “logger” declarado al comienzo de mi clase (pero sin invocar “getLogger” antes de mis 2 declaraciones System.setProperty) me permite hacer referencia a “logger” en otros métodos. Sin embargo, estoy obligado a inicializarlo, así que elegí “nulo” pero luego lo actualicé con la declaración “getLogger”; dado esto, no puedo hacerlo “final” (solo puedo asignarlo una vez) pero puedo hacerlo estático – una variable de clase constante.

nb, los 2 frascos log4j2 que incluí en la ruta de compilación son:

  1. log4j-api-2.6.2.jar

  2. log4j-core-2.6.2.jar

Para otras personas que puedan tener este problema …

  1. Asegúrese de que su -Dlog4j.configurationFile las opciones ocurren antes de tu ‘-jar’ no después. Puede parecer obvio, pero vi ese error una vez.
  2. Intente tratar la ubicación del archivo como una URL y vea si funciona. Es decir, escapar de los espacios con % 20 etc. También use ‘file: //sendero‘, reemplace las barras invertidas con barras hacia adelante.
  3. Las rutas de Windows se pueden escribir como archivo: // c: /path/to/log4j2.xml

Por lo tanto, si tiene un log4j2.xml en la carpeta de su programa para su exampleApp en C:Program FilesExampleApp luego…

java.exe -Dlog4j.configurationFile=file://c:/program%20files/exampleapp/log4j2.xml -jar exampleApp.jar ... 

…Deberia trabajar

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *