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.
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.
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>
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");
}
}
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).
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