web-dev-qa-db-fra.com

Où le fichier journal slf4j est-il enregistré?

J'ai les importations suivies:

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

et l'instanciation suivante:

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

et ce qui suit dans ma méthode principale:

logger.info("SOME MESSAGE: ");

Cependant, je ne peux pas trouver la sortie n'importe où. Tout ce que je vois, c'est qu'il y a dans ma console:

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

Comment localiser le fichier journal?

Notez que les éléments suivants sont sur mon chemin de construction:

slf4j-api-1.7.5.jar

slf4j-log4j12-1.6.4.jar

J'ai lu la réponse à des questions similaires, mais personne n'a dit comment résoudre le problème.

45
user2763361

slf4j n'est qu'une API. Vous devriez avoir une implémentation concrète (par exemple, log4j). Cette implémentation concrète contient un fichier de configuration qui vous indique où stocker les journaux.

enter image description here

Lorsque slf4j attrape un message de log avec un logger, il est donné à un appender qui décide quoi faire avec le message. Par défaut, ConsoleAppender affiche le message dans la console.

Le fichier de configuration par défaut est:

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

Si vous mettez un fichier de configuration disponible dans le chemin de classe, votre implémentation concrète (dans votre cas, log4j) le trouvera et l'utilisera. Voir Documentation Log4J.

Exemple de fichier appender:

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

...
</Appenders>

Exemple complet avec un fichier 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
Arnaud Denoyelle

Comme nous l'avons déjà mentionné, il ne s'agit que d'une façade et permet de basculer facilement entre différentes mises en œuvre d'enregistreurs. Par exemple, si vous souhaitez utiliser l'implémentation log4j.

Un exemple de code ressemblerait à celui ci-dessous.

Si vous utilisez maven, obtenez les dépendances 

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

Ayez les éléments suivants dans log4j.properties à l’emplacement 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

Le code Hello du monde ci-dessous serait imprimé dans la console et dans un fichier journal conformément à la configuration ci-dessus.

            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

Il n'écrit pas dans un fichier par défaut. Vous auriez besoin de configurer quelque chose comme la variable RollingFileAppender et que le consignateur racine y écrive (éventuellement en plus de la variable ConsoleAppender par défaut).

3
jmkgreen

Le fichier journal n'est pas visible car l'emplacement du fichier de configuration slf4j doit être transmis à la commande d'exécution Java à l'aide des arguments suivants.

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

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

1
Rahul Vanimisetty