Java >> Java tutorial >  >> Tag >> Log4j

Angivelse af Log4j2-konfigurationsfil ved brug af eksekverbar JAR

Noget der ikke er forklaret særlig godt/naturligvis i Java-dokumentationen er, at hvis du bruger en eksekverbar Jar, vil den kun bruge Class-Path som angivet i Manifest-filen. Den lytter ikke til -cp eller --classpath argumenter.

-Dlog4j.configurationFile=directory/file.xml

burde bestemt virke dog. Jeg går ud fra, at du kører på Windows givet din skråstreg retning. Er du sikker på, at du kører det fra den korrekte relative mappe?

Opdater

Jeg har lige prøvet det i Windows uden problemer. Jeg brugte følgende manifest:

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

Log4j2-krukkerne er placeret i en lib/ biblioteket og log4j2.xml er i conf/ vejviser. Jeg udførte følgende kommando, og den fandt konfigurationen med succes.

java -Dlog4j.configurationFile=conf\log4j2.xml -jar log4j2test1-1.0-SNAPSHOT.jar

Jeg løste problemet med at angive placeringen af ​​log4j2-konfigurationen i en løbbar Jar, som jeg oprettede fra Eclipse ved at inkludere dette i min java-kode:

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

Jeg har en pakke, og derfor skulle jeg angive stien til min "ressourcer"-mappe (i min "src"-mappe i Eclipse):

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

Bemærk, at jeg ikke inkluderede "src" i min sti, og jeg tror, ​​det er stien i "bin"-mappen, der kræves:dvs. i mit tilfælde "com/company/app/resources/log4j2.xml"

Min konfigurationsfil ser sådan ud:

<?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>

Bemærk også, at jeg dynamisk tildeler den rullende logfilsti + navn "${sys:logFilename}" ved at inkludere dette i min java-kode:

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

For at få disse 2 dynamiske System.setProperty-tildelinger til at fungere, skal de udføres før "getLogger"-sætningen, og min java-kode ser således ud:

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

}

At have "logger" erklæret i starten af ​​min klasse (men uden at kalde "getLogger" før mine 2 System.setProperty-udsagn) gør det muligt for mig at referere til "logger" i andre metoder. Jeg er dog forpligtet til at initialisere det, og derfor valgte jeg "null", men senere opdatere det med "getLogger"-sætningen - givet dette kan jeg ikke gøre det "endeligt" (kan kun tildele det én gang), men kan gøre det statisk - en konstant klassevariabel.

nb de 2 log4j2-krukker, jeg inkluderede i byggestien, er:

  1. log4j-api-2.6.2.jar

  2. log4j-core-2.6.2.jar


Til andre, der kan have dette problem...

  1. Sørg for, at din -Dlog4j.configurationFile indstillinger forekommer før din '-krukke' ikke efter. Det virker måske indlysende, men så den fejl en gang.
  2. Prøv at behandle filplaceringen som en url, og se om det virker. dvs. undslippe mellemrum med %20 osv. Brug også 'file://sti ', erstat omvendte skråstreg med fremadgående skråstreg.
  3. Windows-stier kan skrives som file://c:/path/to/log4j2.xml

Derfor, hvis du har en log4j2.xml i din programmappe til din exampleApp i C:\Program Files\ExampleApp så...

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

...skulle virke


Java tag