it-swarm.com.de

Wo wird die slf4j-Protokolldatei gespeichert?

Ich habe folgende Importe:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

und die folgende Instanziierung:

private static Logger logger = LoggerFactory.getLogger(Test.class);

und das Folgende in meiner Hauptmethode:

logger.info("SOME MESSAGE: ");

Ich kann die Ausgabe jedoch nirgendwo finden. Alles was ich sehe ist in meiner Konsole:

21:21:24.235 [main] INFO  some_folder.Test - SOME MESSAGE: 

Wie finde ich die Protokolldatei?

Beachten Sie, dass sich folgende Elemente auf meinem Buildpfad befinden:

slf4j-api-1.7.5.jar

slf4j-log4j12-1.6.4.jar

Ich habe die Antwort auf ähnliche Fragen gelesen, aber niemand sagt, wie das Problem behoben werden kann.

45
user2763361

slf4j ist nur eine API. Sie sollten eine konkrete Implementierung haben (zum Beispiel log4j). Diese konkrete Implementierung verfügt über eine Konfigurationsdatei, die Ihnen sagt, wo die Protokolle gespeichert werden sollen.

enter image description here

Wenn slf4j Protokollnachrichten mit einem Logger abfängt, wird es einem Appender übergeben, der entscheidet, was mit der Nachricht geschehen soll. Standardmäßig zeigt der ConsoleAppender die Nachricht in der Konsole an.

Die Standardkonfigurationsdatei lautet:

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

  <Appenders>
    <!-- By default => console -->
    <Console name="Console" target="SYSTEM_OUT">
      <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
    </Console>
  </Appenders>

  <Loggers>
    <Root level="error">
      <AppenderRef ref="Console"/>
    </Root>
  </Loggers>
</Configuration>

Wenn Sie eine Konfigurationsdatei im Klassenpfad verfügbar machen, wird sie von Ihrer konkreten Implementierung (in Ihrem Fall log4j) gefunden und verwendet. Siehe Log4J-Dokumentation.

Beispiel eines Datei-Appenders:

<Appenders>
<File name="File" fileName="${filename}">
  <PatternLayout>
    <pattern>%d %p %C{1.} [%t] %m%n</pattern>
  </PatternLayout>
</File>

...
</Appenders>

Vollständiges Beispiel mit einem Datei-Appender: 

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

  <Appenders>
    <File name="File" fileName="${filename}">
      <PatternLayout>
        <pattern>%d %p %C{1.} [%t] %m%n</pattern>
      </PatternLayout>
    </File>
  </Appenders>

  <Loggers>
    <Root level="error">
      <AppenderRef ref="File"/>
    </Root>
  </Loggers>

</Configuration>
44

Wie bereits erwähnt, ist es nur eine Fassade und es hilft, zwischen verschiedenen Logger-Implementierungen problemlos umzuschalten. Zum Beispiel, wenn Sie die Implementierung von log4j verwenden möchten.

Ein Beispielcode würde wie folgt aussehen.

Wenn Sie Maven verwenden, erhalten Sie die Abhängigkeiten 

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.6</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>1.7.5</version>
    </dependency>

Habe unten in log4j.properties im Verzeichnis src/main/resources/log4j.properties

            log4j.rootLogger=DEBUG, STDOUT, file

            log4j.appender.STDOUT=org.Apache.log4j.ConsoleAppender
            log4j.appender.STDOUT.layout=org.Apache.log4j.PatternLayout
            log4j.appender.STDOUT.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n

            log4j.appender.file=org.Apache.log4j.RollingFileAppender
            log4j.appender.file.File=mylogs.log
            log4j.appender.file.layout=org.Apache.log4j.PatternLayout
            log4j.appender.file.layout.ConversionPattern=%d{dd-MM-yyyy HH:mm:ss} %-5p %c{1}:%L - %m%n

Der unten abgebildete Hello-Weltcode würde in der Konsole und in einer Protokolldatei gemäß der obigen Konfiguration gedruckt.

            import org.slf4j.Logger;
            import org.slf4j.LoggerFactory;

            public class HelloWorld {
              public static void main(String[] args) {
                Logger logger = LoggerFactory.getLogger(HelloWorld.class);
                logger.info("Hello World");
              }
            }

enter image description here

26
Jay

Es schreibt standardmäßig nicht in eine Datei. Sie müssten etwas wie RollingFileAppender konfigurieren und müssen den Root-Logger darauf schreiben (möglicherweise zusätzlich zum Standard ConsoleAppender).

3
jmkgreen

Die Protokolldatei ist nicht sichtbar, da der Speicherort der Konfigurationsdatei slf4j mit den folgenden Argumenten an den Java-Ausführungsbefehl übergeben werden muss (z. B.).

-Dlogging.config = {Dateipfad}\log4j2.xml 

-Dlog4j.configurationFile = {Dateipfad}\log4j2.xml

1