2016-04-25 11 views
2
geschrieben

Ich verwende log4j 2. Ich versuche herauszufinden, warum meine Protokolldatei nicht geschrieben wird, aber meine Konsole ist. Dies ist die Ausgabe ich an die Konsole haben:log4j 2: Protokolldatei wird erstellt, aber nicht in

2016-04-25 12:26:07,142 INFO [main] helperCode.LogPlus (LogPlus.java:50) - 
---------------------------------------------------------------------------- 
------------ The test is starting now at 2016-04-25-12-26-07-135 ----------- 
---------------------------------------------------------------------------- 

2016-04-25 12:26:07,151 INFO [main] helperCode.LogPlus (LogPlus.java:50) - 
-------------------------------------------------------------------------- 
------------ METHOD loginBadPasswordGoodUsername_3 starting: ------------ 
-------------------------------------------------------------------------- 

Die Fragen, die ich bereits in Betracht gezogen habe:

  • Der Ausgang wird sich nicht wiederholen, so dass die Protokollausgabe ist ein Problem, nicht umgeleitet werden.
  • Ich verwende nirgendwo java.util.logging.Logger in meinem Projekt;
  • Die Ausgabe der Protokolldatei ist im log4j-Stil formatiert und nicht im JUL-Stil, daher weiß ich, dass JUL sie nicht überschreibt;

Hier ist meine XML-Konfigurationsdatei:

<?xml version="1.0" encoding="UTF-8"?> 
<Configuration> 
    <Appenders> 
     <File name="FileLogger" fileName="${sys:logFilePath}" append="false"> 
      <PatternLayout pattern="%d %t %-5p %c{2} - %m%n" /> 
     </File> 
     <Async name="Async"> 
      <AppenderRef ref="FileLogger" /> 
     </Async> 
     <Console name="STDOUT" target="SYSTEM_OUT"> 
      <PatternLayout pattern="%d %-5p [%t] %C{2} (%F:%L) - %m%n" /> 
     </Console> 
    </Appenders> 
    <Loggers> 
     <Logger name="automationFramework" level="trace"> 
      <AppenderRef ref="FileLogger" /> 
     </Logger> 
     <Root level="trace"> 
      <AppenderRef ref="STDOUT" /> 
     </Root> 
    </Loggers> 
</Configuration> 

ich die Ausgabe in die Datei auf der Systemvariablen „Protokolldatei“ befindet leite.

Ich bin mir nicht sicher, was passiert, und die Config-Dateien auf Antworten für ähnliche Fragen sind nicht im XML-Format, so dass ich nicht sicher bin, wie die Config-Datei Code in XML zu pendeln.

+0

Zeigen Sie uns, wie konfigurieren Sie das im Code ... und wie implementieren Sie den Logger ... –

+0

Ihr Paketname ist automationFramework (für Java-Klasse in Ihrem Projekt)? – Unknown

+0

Eigentlich, Unknown, ΦXoce und 웃 Пepeúpa, ich denke, ich habe es gerade herausgefunden. Wie Sie vorgeschlagen haben, Unbekannt, wurde das Paket, von dem die Aufrufe ausgeführt wurden, etwas anderes genannt.Ich änderte den Paketnamen innerhalb der log4j 2 Konfigurationsdatei zu diesem Paket und es reparierte Sachen. Danke euch beiden! –

Antwort

1

In Ihrem Fall, wie in dem Kommentar erwähnt, haben Sie nicht das Paket namens applicationframework. Ändern Sie das name-Attribut also durch den Paketnamen der Klassen, in denen Protokollereignisse aufgezeichnet werden sollen.

<Logger name="your package" level="trace"> 
       <AppenderRef ref="FileLogger" /> 
     <Root level="trace"> 
      <AppenderRef ref="STDOUT" /> 
     </Root> 
</Logger> 

Für weitere Informationen besuchen log4j-manual-configuration

0

Glad die andere Antwort geholfen. Brauchen Sie den genannten Logger? Warum hast du nicht einfach den Root Logger? Außerdem haben Sie einen Async-Appender deklariert, verwenden ihn aber nicht. Ist das absichtlich? Dies ist, was würde ich vorschlagen:

<?xml version="1.0" encoding="UTF-8"?> 
<Configuration> 
    <Appenders> 
     <File name="FileLogger" fileName="${sys:logFilePath}" append="false"> 
      <PatternLayout pattern="%d %t %-5p %c{2} - %m%n" /> 
     </File> 
     <Async name="Async"> 
      <AppenderRef ref="FileLogger" /> 
     </Async> 
     <Console name="STDOUT" target="SYSTEM_OUT"> 
      <PatternLayout pattern="%d %-5p [%t] %C{2} (%F:%L) - %m%n" /> 
     </Console> 
    </Appenders> 
    <Loggers> 
     <Root level="trace"> 
      <AppenderRef ref="STDOUT" level="info" /> 
      <AppenderRef ref="Async" /> 
     </Root> 
    </Loggers> 
</Configuration> 

Beachten Sie, dass Sie auch eine Ebene auf der AppenderRef angeben. Ich habe die Console Appender-Ebene INFO gemacht, um diesen Punkt zu verdeutlichen.

Wenn das Protokoll Standortdaten anzeigen und asynchrone Protokollierer oder Appender verwenden soll, müssen Sie includeLocation="true" auf dem Async Appender angeben.

+1

Hey Remko, yeah Ich wollte nur die Informationen von einem Paket protokollieren, aber es ist gut zu wissen, dass diese Einschränkung entfernt werden kann. –

0

Für die komplette noob, wie ich diese Zeile in Unknown Antwort oben:

<Logger name="your package" level="trace"> 

ist der Schlüssel. Wenn es "Ihr Paket" heißt, bedeutet es wirklich das "Paket foo.bar", das Sie oben in der .java-Datei deklariert haben, wo Sie den Logger erstellt haben, nicht den Klassennamen, den Sie zum Erstellen des Loggers übergeben haben, wie:

LOGGER = LogManager.getLogger(MyClass.class.getName()); 

Es hat mich heute eine lächerliche Zeit gekostet, um meine log4j2-Ausgabe in eine Datei zu bringen und mit verschiedenen "Namen" -Werten zu spielen, bis die Glühbirne weiterging.