web-dev-qa-db-fra.com

Spring Boot - aucun fichier journal écrit (logging.file n'est pas respecté)

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?

22
Christoph Möbius

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

13
Christoph Möbius

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:

 enter image description here

Si vous voulez avoir plus de plaisir, vous pouvez localiser le fichier base.xml dans vos dépendances maven comme ceci: 

 enter image description here

4
georges van

Je ne sais pas si cela vous aiderait mais j'utilise également Logback dans mon projet Spring-Boot et la structure est la suivante

 enter image description here

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
4
Ravindran Kanniah

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.

1
Lazar Lazarov

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.

0
Punit

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

0
Hardik Patel

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.

Quelques astuces pour se déplacer:

  1. Dans la classe principale, définissez la variable de propriété à l'aide de 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);
    }
  1. Transmettez la propriété en tant que paramètre JVM -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. 

Solution

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.

0
Mani

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.

0
July

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

0
beaudet