web-dev-qa-db-fra.com

Spring Boot avec LogBack créant le dossier LOG_PATH_IS_UNDEFINED

J'utilise SpringBoot avec LogBack et j'utilise la configuration ci-dessous dans mon fichier yml:

logging:
    path: C:/var/log/pincode

La variable d'environnement logging.path Spring est transférée vers la variable d'environnement LOG_PATH et le fichier journal est placé à l'emplacement correct. Un répertoire appelé LOG_PATH_IS_UNDEFINED est également créé dans le répertoire racine de mon projet.

Cela semble être dû à la phase différente utilisée par SpringBoot pour configurer LogBack avec ses variables d'environnement.

17:29:21,325 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Assuming default type [ch.qos.logback.classic.encoder.PatternLayoutEncoder] for [encoder] property
17:29:21,337 |-INFO in c.q.l.core.rolling.TimeBasedRollingPolicy - Will use the pattern LOG_PATH_IS_UNDEFINED/catalina.out.%d{yyyy-MM-dd} for the active file
17:29:21,340 |-INFO in c.q.l.core.rolling.DefaultTimeBasedFileNamingAndTriggeringPolicy - The date pattern is 'yyyy-MM-dd' from file name pattern 'LOG_PATH_IS_UNDEFINED/catalina.out.%d{yyyy-MM-dd}'.
17:29:21,340 |-INFO in c.q.l.core.rolling.DefaultTimeBasedFileNamingAndTriggeringPolicy - Roll-over at midnight.
17:29:21,343 |-INFO in c.q.l.core.rolling.DefaultTimeBasedFileNamingAndTriggeringPolicy - Setting initial period to Mon Aug 11 17:24:07 BRT 2014
17:29:21,346 |-INFO in ch.qos.logback.core.rolling.RollingFileAppender[serverConsole] - Active log file name: LOG_PATH_IS_UNDEFINED/catalina.out
17:29:21,346 |-INFO in ch.qos.logback.core.rolling.RollingFileAppender[serverConsole] - File property is set to [LOG_PATH_IS_UNDEFINED/catalina.out]
...
17:29:21,358 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - End of configuration.

Et puis après cela, il recommence à configurer la consignation, mais cette fois en utilisant le chemin que j’ai défini:

17:29:21,672 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Assuming default type [ch.qos.logback.classic.encoder.PatternLayoutEncoder] for [encoder] property
17:29:21,673 |-INFO in c.q.l.core.rolling.TimeBasedRollingPolicy - No compression will be used
17:29:21,673 |-INFO in c.q.l.core.rolling.TimeBasedRollingPolicy - Will use the pattern C:/var/log/pincode//catalina.out.%d{yyyy-MM-dd} for the active file
17:29:21,674 |-INFO in c.q.l.core.rolling.DefaultTimeBasedFileNamingAndTriggeringPolicy - The date pattern is 'yyyy-MM-dd' from file name pattern 'C:/var/log/pincode//catalina.out.%d{yyyy-MM-dd}'.
17:29:21,674 |-INFO in c.q.l.core.rolling.DefaultTimeBasedFileNamingAndTriggeringPolicy - Roll-over at midnight.
17:29:21,674 |-INFO in c.q.l.core.rolling.DefaultTimeBasedFileNamingAndTriggeringPolicy - Setting initial period to Mon Aug 11 17:29:21 BRT 2014
17:29:21,674 |-INFO in ch.qos.logback.core.rolling.RollingFileAppender[serverConsole] - Active log file name: C:/var/log/pincode//catalina.out
17:29:21,674 |-INFO in ch.qos.logback.core.rolling.RollingFileAppender[serverConsole] - File property is set to [C:/var/log/pincode//catalina.out]
...
17:29:21,685 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - End of configuration.

Mon logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true">
<include resource="org/springframework/boot/logging/logback/basic.xml" />
<property name="FILE_LOG_PATTERN"
    value="%d{yyyy-MM-dd HH:mm:ss.SSS} %5p ${PID:- } [%t] --- %-40.40logger{39} : %m%n%wex" />

<appender name="serverConsole"
          class="ch.qos.logback.core.rolling.RollingFileAppender">
    <Append>true</Append>
    <File>${LOG_PATH}/catalina.out</File>
    <encoder>
        <pattern>${FILE_LOG_PATTERN}</pattern>
    </encoder>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <fileNamePattern>${LOG_PATH}/catalina.out.%d{yyyy-MM-dd}
        </fileNamePattern>
        <maxHistory>15</maxHistory>
    </rollingPolicy>
</appender>

<!-- Plain Text Rolling Appender -->
<appender name="server"
    class="ch.qos.logback.core.rolling.RollingFileAppender">
    <Append>true</Append>
    <File>${LOG_PATH}/pincode.log</File>
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
        <level>INFO</level>
        <onMatch>ACCEPT</onMatch>
        <onMismatch>DENY</onMismatch>
    </filter>
    <encoder>
        <pattern>${FILE_LOG_PATTERN}</pattern>
    </encoder>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <fileNamePattern>${LOG_PATH}/pincode.log.%d{yyyy-MM-dd}
        </fileNamePattern>
        <maxHistory>15</maxHistory>
    </rollingPolicy>
</appender>

<!-- Plain Text Rolling Appender -->
<appender name="server-error"
    class="ch.qos.logback.core.rolling.RollingFileAppender">
    <Append>true</Append>
    <File>${LOG_PATH}/pincode-error.log</File>
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
        <level>ERROR</level>
        <onMatch>ACCEPT</onMatch>
        <onMismatch>DENY</onMismatch>
    </filter>
    <encoder>
        <pattern>${FILE_LOG_PATTERN}</pattern>
    </encoder>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <fileNamePattern>${LOG_PATH}/pincode-error.log.%d{yyyy-MM-dd}
        </fileNamePattern>
        <maxHistory>15</maxHistory>
    </rollingPolicy>
</appender>

<logger name="com.app" level="INFO">
    <appender-ref ref="server" />
    <appender-ref ref="server-error" />
</logger>

<root level="INFO">
    <appender-ref ref="serverConsole" />
</root> 

Si je supprime mon fichier logback.xml du projet, il ne crée pas le dossier. Par conséquent, quelque part, Spring charge le fichier xml avant d'analyser le fichier yml?

Comment éviter Logback pour créer ce répertoire LOG_PATH_IS_UNDEFINED?

15
Davi Alves

Dans votre cas, LOG_PATH n'est pas défini au démarrage. Vous devriez utiliser ${LOG_PATH:-.} à la place, Voir .

Mais si vous définissez logging.path dans votre application.properties, vous verrez deux fichiers journaux dans le répertoire . et dans le répertoire ${logging.path}

Ensemble de conteneurs Spring LOG_PATH après l'initialisation de Logback ... Logback n'est pas pris en charge pour la création de fichiers différés à ma connaissance. Dans ce cas, vous devriez utiliser logback-spring.xml à la place de logback.xml.

10
Igor Tytar

J'ai fait face à un problème similaire et il est facile de le résoudre. Fondamentalement, Spring Boot vous donne déjà la propriété système - LOG_PATH pour la propriété Spring Boot - logging.path afin que vous définissiez logging.path dans votre application.properties et que vous utilisiez simplement LOG_PATH dans votre configuration de consignation - logback-spring.xml

Vous ne devez pas déclarer logback <property ...> pour LOG_PATH, utilisez-le à tout moment. 

Voir en bas ici

4
Sabir Khan

J'ai rencontré le même problème . Mettre une entrée dans logback.xml

<property resource="application.properties" />

Dans application.properties

FILE_LOG_PATTERN=###
LOG_FILE=###

au démarrage de votre application, le nom du répertoire créé correspond à ce que vous avez défini dans le fichier de propriétés. 

2
Chaucer

Ce n'est peut-être pas votre cas, mais si vous avez bootstrap.properties, assurez-vous que logging.path est défini ici et uniquement là.

1
prettyvoid

Essayez d’ajouter ce qui suit à votre fichier POM

<plugin>
            <artifactId>maven-clean-plugin</artifactId>
            <version>3.0.0</version>
            <configuration>
                <filesets>
                    <fileset>
                        <directory>${basedir}/catalina.base_IS_UNDEFINED</directory>
                        <includes>
                            <include>**/*.log</include>
                        </includes>
                        <followSymlinks>false</followSymlinks>
                    </fileset>
                </filesets>
            </configuration>
        </plugin>
0
Maro

Je suppose que vous avez inclus un fichier d’erreur . S'il vous plaît changer

<include resource="org/springframework/boot/logging/logback/basic.xml" />

à

<include resource="org/springframework/boot/logging/logback/base.xml"/>

alors essayez.

0
Solar

mettre une entrée dans le logback:

<property name="DEV_HOME" value="c:/application_logs/ps-web" />

et le référencer:

<fileNamePattern>${DEV_HOME}.%d{yyyy-MM-dd}.log</fileNamePattern>

0
dsfere

J'ai eu le même problème depuis que j'ai configuré logging.path et logging.file sur application.properties, mais certains journaux ont été générés avant la configuration de Spring Boot LogBack. Ils ont donc été écrits dans le fichier LOG_PATH_IS_UNDEFINED/LOG_FILE_IS_UNDEFINED, puis les journaux ont été basculés au bon emplacement.

J'ai trouvé 2 solutions possibles:

1) Configurez logging.path et logging.file dans bootstrap.properties car la configuration dans bootstrap a lieu avant

ou

2) Définissez logging.path et logging.file en tant que propriétés système avec -Dlogging.path = ... -Dlogging.file = ... lors du lancement de l'application

0
Massimo Da Ros

si vous utilisez Spring Boot Finchley (2.x), vous pouvez définir spring.application.name dans votre fichier application.properties ou application.yml et ajouter les éléments suivants dans votre configuration Logback:

<configuration>
  <springProperty scope="context" name="springAppName" source="spring.application.name"/>
</configuration>

vous aurez maintenant ${springAppName} comme variable à votre disposition pour votre journal pattern.

0
Dexter Legaspi

Déclarez la propriété LOG_PATH dans votre logback.xml

<property name="LOG_PATH" value="" />

est l'endroit où vous devez spécifier le répertoire dans lequel les fichiers journaux sont créés. Si ce champ est laissé vide, logback créera un nouveau répertoire dans l'exécution du programme. Le nom du répertoire créé est LOG_PATH_IS_UNDEFINED

0
Dheeraj Arora

Avant la préparation de l’environnement Spring Boot, la classe principale Spring Boot ou la SpringApplication initialisera loggerfactory, qui détectera le fichier de configuration par défaut (logback.groovy, logback.xml, logback-test.xml) mais l’application Spring Boot n’a pas encore démarré. la variable LOG_PATH n'est pas définie. Au début, vous devez donc modifier le nom de votre fichier de configuration logback et le configurer manuellement dans la configuration du démarrage du ressort en tant que logging.config. De cette manière, le logback configurera un appender de console par défaut au lieu de créer un appender de fichier, puis lorsque l'environnement Spring Boot sera prêt, il déclenchera un événement enviromentready, ce qui provoquera une reconfiguration de logback par LoggingApplicationListener. Vous pouvez trouver le problème sur la page de springboot https://github.com/spring-projects/spring-boot/issues/2558

0
Johnson

version: 1.5.9 

  1. springcloud:

bootstrap.yml

spring:
  application:
    name: awesome-app
# profile:
#   active: dev
logging:
  path: /code/awesome-app

spring-logback.xml

${LOG_PATH}/awesome-app.log
  1. botte de printemps:

application.yml

spring:
  application:
    name: awesome-app
# profile:
#   active: dev
logging:
  path: /code/awesome-app

spring-logback.xml

${LOG_PATH}/awesome-app.log

custom-log-configuration: https://docs.spring.io/spring-boot/docs/1.5.6.RELEASE/reference/htmlsingle/#boot-features-custom-log-configuration

0
Zed

Pour appeler un logback à partir d'un chemin externe dans un fichier .yml, cela fonctionnait pour moi comme:

enregistrement: config: C: /folder/logback.xml

0
bernardo

quelque part, Spring charge le xml avant d'analyser le yml

il suffit donc de renommer logback.xml en your-logback.xml et d'ajouter logging.config=classpath:your-logback.xml dans votre application.properties

0
mikelinjie