J'utilise Spring Boot et je veux qu'il écrive la sortie du journal dans un fichier.
Selon la documentation, cela se fait simplement en définissant
logging.file=filename.log
Alors que la sortie de la console fonctionne correctement, filename.log
n'est pas créé. De plus, si je crée le fichier manuellement, rien n'y est écrit. Qu'est-ce qui me manque?
J'ai trouvé une solution. Je ne suis pas très heureux avec cela car il ne répond toujours pas à ma question initiale pourquoi la propriété logging.file
n'est pas respectée.
J'ai créé le logback-spring.xml
à partir de Georges ' answer dans le même répertoire que celui où réside application.properties
. Selon la documentation Spring Boot le récupérera à partir de là. Apparemment, cela ne se produit pas dans mon cas.
Je dois également ajouter logging.config=classpath:logback-spring.xml
pour que Spring soit disponible. Les parties pertinentes de mon application.properties
sont maintenant
logging.config=classpath:logback-spring.xml
logging.file=logs/logfile.log
(J'ai créé le répertoire logs
manuellement.)
Voici comment j'ai réussi à écrire la sortie dans un fichier local. Pour désactiver la journalisation de la console et écrire la sortie uniquement dans un fichier, vous devez utiliser un fichier personnalisé logback-spring.xml _ (appelez-le logback-spring.xml afin de tirer parti fonctionnalités (formatage de date, etc. fournies par Boot)} qui importe file-appender.xml au lieu de console-appender.xml. Pour ce faire, vous devez coller ce code ci-dessous dans votre fichier logback-spring.xml.
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/logback/defaults.xml" />
<property name="LOG_FILE" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${Java.io.tmpdir:-/tmp}}/}spring.log}"/>
<include resource="org/springframework/boot/logging/logback/file-appender.xml" />
<root level="INFO">
<appender-ref ref="FILE" />
</root>
</configuration>
Vous devez également ajouter les éléments suivants à votre application.properties:
logging.file=myapplication.log
Notez que ce fichier journal myapplication.log sera généré par springboot.
Voici à quoi ressemble mon arbre de structure d'application:
Si vous voulez avoir plus de plaisir, vous pouvez localiser le fichier base.xml dans vos dépendances maven comme ceci:
Je ne sais pas si cela vous aiderait mais j'utilise également Logback dans mon projet Spring-Boot
et la structure est la suivante
Fichier: logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="logback.xsd">
<property resource="\application.properties"/>
<appender name="FILE"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${app.logPathPrefix}/myproject.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${app.logPathPrefix}/myproject.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>50MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%level] [%thread] [%logger:%line] %msg%n
</pattern>
</encoder>
</appender>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%level] [%thread] [%logger:%line] %msg%n
</pattern>
</encoder>
</appender>
<logger name="org.springframework" level="INFO" />
<logger name="com.mycompany" level="INFO" />
<logger name="org.hibernate" level="DEBUG" />
<root level="INFO">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
</root>
</configuration>
Fichier: application.properties
app.logPathPrefix=/var/log/myproject
Si vous utilisez Maven, ajoutez la dépendance:
<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>
Vous devez maintenant spécifier un fichier appelé "log4j.properties" que vous devez placer dans le répertoire spécifique: "src/main/resources/log4j.properties"
Voici à quoi le fichier devrait ressembler par exemple:
# Root logger option
log4j.rootLogger=INFO, file, stdout
log4j.logger.org.springframework.ws.client.MessageTracing.sent=TRACE
log4j.logger.org.springframework.ws.client.MessageTracing.received=TRACE
# Direct log messages to stdout
log4j.appender.stdout=org.Apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.Apache.log4j.PatternLayout
# log4j.appender.springlog.Threshold=INFO
log4j.appender.springlog.layout=org.Apache.log4j.PatternLayout
log4j.appender.springlog.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
# Direct log messages to a log file
log4j.appender.file=org.Apache.log4j.RollingFileAppender
log4j.appender.file.File=D:/example/filename.log
log4j.appender.file.MaxFileSize=10MB
log4j.appender.file.MaxBackupIndex=10
log4j.appender.file.layout=org.Apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
Importez maintenant ces:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Déclarez une variable logger comme ceci:
final static Logger logger = Logger.getLogger(TheClassYourIn.class);
Et utilisez-le dans la classe comme ceci:
logger.info("Well hello world then ");
De cette façon, cela fonctionne pour moi. J'espère que cette réponse vous aidera. Bonne chance !
PS: log4j.appender.file.File = 'répertoire' est comment vous spécifiez où les journaux doivent être stockés. Si vous ne spécifiez pas de répertoire et que vous le laissez simplement comme nom de fichier.log, ce fichier sera automatiquement créé dans le répertoire du projet.
Je viens d'utiliser le mécanisme de journalisation fourni par Spring-Boot. J'ai écrit ci-dessous dans mon fichier 'logback.xml':
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/logback/defaults.xml" />
<include resource="org/springframework/boot/logging/logback/file- appender.xml" />
<root level="INFO">
<appender-ref ref="FILE" />
</root>
</configuration>
Je mets les fichiers application.properties et logback.xml sous le même paquet 'src/main/resources' . Dans le fichier application.properties, un paramètre est ajouté:
logging.file = xyz.log
Cela a parfaitement fonctionné pour moi.
Si vous êtes sur Spring Boot, vous pouvez directement ajouter les propriétés suivantes dans le fichier application.properties pour définir le niveau de journalisation, Personnaliser le modèle de journalisation et stocker les journaux dans le fichier externe.
Ce sont différents niveaux de journalisation et son ordre de minimum << maximum.
OFF << FATAL << ERREUR << AVERTISSEMENT << INFO << DEBUG << TRACE << ALL
# To set logs level as per your need.
logging.level.org.springframework = debug
logging.level.tech.hardik = trace
# To store logs to external file
# Here use strictly forward "/" slash for both Windows, Linux or any other os, otherwise, your logs it won't work.
logging.file=D:/spring_app_log_file.log
# To customize logging pattern.
logging.pattern.file= "%d{yyyy-MM-dd HH:mm:ss} - %msg%n"
Merci de passer par ce lien pour personnaliser vos journaux de manière plus vive.
https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-logging.html
Désolé pour la réponse tardive. Il semble que le journal de spring lit la propriété à partir de son propre chemin de classe .En raison de la priorité, il ne respecte pas les propriétés fournies.
springApplication.setDefaultProperties(properties);
comme ceci public static void main(String[] args) {
SpringApplication springApplication = new SpringApplication(MainClass.class);
Properties properties = new Properties();
properties.put("logging.file", logDirectory);
springApplication.setDefaultProperties(properties);
springApplication.run(args);
}
-Dlogging.file=/location/output.log
.Les deux éléments ci-dessus ne sont pas les meilleurs car, pour définir d'autres propriétés de journalisation, ils doivent également suivre la même procédure.
Définissez un fichier de propriétés et mettez-y toutes vos configurations de journalisation, puis spécifiez le fichier dans -Dspring.config.location
. Ceci est une dérivation de mon autre problème et voici comment j'ai résolu cela . vérifiez cela afin de connaître les autres solutions que j'ai essayées et leurs défis.
Dans mon cas, j’ai ajouté un fichier "logback.xml" dans un de mes sous-modules par erreur, ce qui a causé ce problème. Supprimez-le et tout ira bien.
J'ai eu le même problème. Cela est probablement dû aux autorisations de fichiers sur le système de fichiers. Le dossier de l'application appartenait à root, mais ./logs appartenait au propriétaire du processus. En tant que tel, les éléments suivants ne fonctionnaient pas:
logging.file = my.log
mais cela a
logging.file =/opt/myapp/logs/my.log