SpringBoot с LogBack, создающим папку LOG_PATH_IS_UNDEFINED

Я использую SpringBoot с LogBack и используя приведенную ниже конфигурацию в своем yml файле:

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

Logging.path Spring Переменная среды переносится в переменную среды LOG_PATH, и файл журнала помещается в нужное место, но есть также каталог LOG_PATH_IS_UNDEFINED, созданный в корневом каталоге моего проекта.

Это, по-видимому, вызвано тем, что SpringBoot использует другую фазу, чтобы настроить LogBack с переменными среды.

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.

И затем после этого он снова начнет настраивать журнал, но на этот раз с помощью установленного вами пути:

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.

Мой журнал .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> 

Если я удалю файл logback.xml из проекта, он не создает папку, поэтому где-то Spring загружает xml перед разбором yml?

Как я могу избежать Logback для создания этого каталога LOG_PATH_IS_UNDEFINED?

Ответ 1

В вашем случае LOG_PATH не определяется при запуске. Вы должны использовать ${LOG_PATH:-.} Вместо этого, см.

Но если вы определите logging.path в вашем application.properties вы увидите два файла журнала . и в ${logging.path}.

Spring контейнер установлен LOG_PATH после инициализации Logback... Logback не поддерживается создание ленивых файлов, насколько я знаю. В этом случае вы должны использовать logback-spring.xml вместо logback.xml.

Ответ 2

Я столкнулся с подобной проблемой и ее легко решить. В принципе, концепция заключается в том, что Spring Boot уже предоставляет вам свойство System - LOG_PATH для Spring свойство загрузки - logging.path, поэтому вы определяете logging.path в своих приложениях .properties и просто используете LOG_PATH в своей конфигурации резервного копирования - logback-spring.xml.

Нельзя объявлять журнал <property ...> для LOG_PATH, просто используйте его, когда захотите.

Смотрите внизу внизу здесь

Ответ 3

Я столкнулся с той же проблемой. поместите запись в logback.xml

<property resource="application.properties" />

В application.properties

FILE_LOG_PATTERN=###
LOG_FILE=###

когда ваше приложение запускается, имя созданного каталога - это то, что вы определили в файле свойств.

Ответ 4

Я столкнулся с той же проблемой. Я попытался определить свой собственный файл logback.xml и имел проблемы с использованием свойств logging.path и logging.file, определенных в файле application.properties. Вот как я решил (и работал) проблемы.

Сначала я узнал, что вы не можете определить свойства logging.path и logging.file. Поскольку я использую RollingFileAppender, который будет создавать несколько файлов в течение нескольких дней, я определяю файл logging.file, но использую его больше как префикс файла.

В application.properties

# Don't add the file type at the end.  This will be added in logback.xml
logging.file=logs/my-app-name

В src/main/resources/logback.xml

<configuration>

    <property name="FILE_LOG_PATTERN" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"/>

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder> 
          <Pattern>${FILE_LOG_PATTERN}</Pattern>
        </encoder> 
    </appender>

    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder> 
          <Pattern>${FILE_LOG_PATTERN}</Pattern>
        </encoder> 
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_FILE}.%d{yyyy-MM-dd}.log</fileNamePattern>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
    </appender>

    <root level="INFO">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="FILE" />
    </root>

</configuration>

Похоже, что это работает по большей части. Я определил свой собственный файл FILE_LOG_PATTERN в файле, который, я думаю, является необязательным. Интересной частью является fileNamePattern. Он корректно переводит logging.file из моего файла application.properties в переменную LOG_FILE. Единственное реальное уродство здесь заключается в том, что при запуске Logback все еще жалуется на файл журнала undefined и создает пустой файл с именем LOG_FILE_IS_UNDEFINED_XXX в текущем каталоге. Но фактический файл журнала в моей собственности создан и правильно добавлен.

Эндрю

Ответ 5

Перед подготовкой SpringApplication Spring Boot основной класс Spring Boot или SpringApplication инициализирует фабрику logger, которая обнаружит файл конфигурации по умолчанию (logback.groovy, logback.xml, logback-test.xml), но в это время Spring Boot приложение еще не запущено, что означает, что переменная LOG_PATH не установлена. Поэтому сначала вы должны изменить имя вашего файла конфигурации logback и вручную настроить имя файла в конфигурации Spring Boot как logging.config. Таким образом, при входе в систему по умолчанию консольный приложение будет настраиваться вместо создания файлового приложения, а затем, когда среда Spring Boot будет готова, оно запускает событие enviromentready, что вызывает повторное конфигурирование LoggingApplicationListener в систему с помощью LoggingApplicationListener. Вы можете найти проблему на странице Springboot https://github.com/spring-projects/spring-boot/issues/2558

Ответ 6

logging.path это не ваш случай, но если у вас есть bootstrap.properties убедитесь, что logging.path определен там и только там.

Ответ 7

У меня была та же проблема, так как я настроил logging.path и logging.file для application.properties, но некоторые журналы создавались до конфигурации Spring Boot LogBack, поэтому они были записаны в файл LOG_PATH_IS_UNDEFINED/LOG_FILE_IS_UNDEFINED, а затем журналы переключились в нужное место.

Я нашел 2 возможных решения:

1) Сконфигурируйте logging.path и logging.file в bootstrap.properties, поскольку конфигурация в начальной загрузке выполняется до

или же

2) Установите logging.path и logging.file как системные свойства с помощью -Dlogging.path =... -Dlogging.file =... при запуске приложения.

Ответ 8

Объявить свойство LOG_PATH в вашем файле logback.xml

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

где вы должны указать каталог, в котором создаются файлы журнала. Если это поле оставлено пустым, logback создаст новый каталог при выполнении программы. Имя созданного каталога: LOG_PATH_IS_UNDEFINED

Ответ 9

Я полагаю, вы включили файл ошибок. Пожалуйста измените

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

в

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

тогда попробуйте.

Ответ 10

введите запись в logback:

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

и ссылайтесь на него:

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

Ответ 11

Попробуйте добавить в свой файл 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>

Ответ 12

где-то Spring загружается xml перед разбором yml

поэтому просто переименуйте logback.xml в ваш-logback.xml и добавьте logging.config=classpath:your-logback.xml в application.properties

Ответ 13

Чтобы вызвать форму журнала внешнего пути в файле .yml, он работал у меня как:

протоколирование: config: C:/folder/logback.xml

Ответ 14

если вы используете Spring Boot Finchley (2.x), вы можете определить spring.application.name в файле application.properties или application.yml и добавить следующее в конфигурацию Logback:

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

Теперь вы будете иметь ${springAppName} в качестве переменной для вашего pattern журнала.

Ответ 15

версия: 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. springboot:

application.yml

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

spring-logback.xml

${LOG_PATH}/awesome-app.log

настраиваемая конфигурация журнала: https://docs.spring.io/spring-boot/docs/1.5.6.RELEASE/reference/htmlsingle/#boot-features-custom-log-configuration

Ответ 16

Сделайте ниже, чтобы создать только каталог dev/log. Не добавляйте log.path в application.properties

Добавьте log.path=dev/logs в ваши bootstrap.properties.

Добавьте строку ниже в вашем logback-spring.xml.

<springProperty scope="context" name="LOG_PATH" source="log.path"/>
<property name="LOG_FILE" value="${LOG_PATH}/app/current"/>

Примечание. Обязательно указывайте только нижнюю строку.

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

Не используйте строку ниже, иначе журналы консоли никогда не будут отключены, и файл spring.log будет создан во временном каталоге (если вы не указали logging.path в application.properties). Проверьте код файла ниже, чтобы узнать больше.

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

Ответ 17

У меня тоже была похожая проблема. Я решил это, переименовав logback-spring.xml в logback-what.xml и добавив ниже в application.properties:

logging.config = путь к классам: Logback-whatever.xml

Кроме того, эта проблема возникает, когда мы используем определенные пользователем свойства для ведения журнала, например:

log.path = logs log.archive.path = в архиве