带有LogBack的SpringBoot创建LOG_PATH_IS_UNDEFINED文件夹

时间:2014-08-11 20:36:51

标签: spring logback spring-boot

我正在使用带有LogBack的SpringBoot并在我的yml文件中使用以下配置:

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

logging.path将Spring Environment变量传送到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.

然后它再次开始配置logback,但这次使用我设置的路径:

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.

我的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> 

如果我从项目中删除了我的logback.xml文件,它就不会创建文件夹,那么Spring在解析yml之前是在哪里加载xml?

如何避免Logback创建此LOG_PATH_IS_UNDEFINED目录?

21 个答案:

答案 0 :(得分:12)

在您的情况下,LOG_PATH未在启动时定义。您应该使用${LOG_PATH:-.}代替See

但如果您在logging.path中定义application.properties,则会在.${logging.path}目录中看到两个日志文件。

Logback初始化后的

Spring容器集LOG_PATH ...据我所知,不支持使用lazy文件创建Logback。在这种情况下,您应该使用logback-spring.xml代替logback.xml

答案 1 :(得分:4)

我遇到了类似的问题,很容易解决。基本上,概念是Spring Boot已经为Spring Boot属性提供了System属性 - LOG_PATH - logging.path所以你在application.properties中定义logging.path并简单地使用LOG_PATH您的回归配置 - logback-spring.xml

您不应为<property ...>声明注销LOG_PATH,只需随时使用即可。

见近底here

答案 2 :(得分:2)

我遇到了同样的问题。 在logback.xml中放入一个条目

<property resource="application.properties" />

在application.properties

FILE_LOG_PATTERN=###
LOG_FILE=###

当您的应用程序启动时,创建的目录的名称是您在属性文件中定义的名称。

答案 3 :(得分:1)

我遇到了同样的问题。我尝试定义自己的logback.xml,但在使用application.properties文件中定义的logging.path和logging.file属性时遇到了麻烦。以下是我解决(并解决)问题的方法。

首先,我了解到您无法同时定义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仍然抱怨日志文件未定义,并在当前目录中创建一个名为LOG_FILE_IS_UNDEFINED_XXX的空文件。但是我的属性中的实际日志文件已创建并正确附加到。

安德鲁

答案 4 :(得分:1)

如果您将Spring Boot版本升级到 pom.xml ,请确保已替换

logging.path =您的/日志/路径

作者

logging.file.path =您的/日志/路径

进入 application.properties 。那是我的情况。

答案 5 :(得分:1)

基于Spring Boot common properties, 将以下内容添加到您的application.yml

logging:
  file:
    path: logs/dev

如果使用application.properties,则应为

logging.file.path = logs/dev

答案 6 :(得分:1)

我遇到了同样的问题,因为我在application.properties上配置了logging.path和logging.file,但是在Spring Boot LogBack配置之前生成了一些日志,因此将它们写入LOG_PATH_IS_UNDEFINED / LOG_FILE_IS_UNDEFINED文件,然后将日志切换到右侧位置。

我找到了2种可能的解决方案:

1)在bootstrap.properties中配置logging.path和logging.file,因为bootstrap中的配置发生在

之前

2)启动应用程序时,使用-Dlogging.path = ... -Dlogging.file = ...将logging.path和logging.file设置为系统属性

答案 7 :(得分:1)

可能不是您的情况,但如果您bootstrap.properties确保logging.path在那里定义并且仅在那里定义。

答案 8 :(得分:0)

要从.yml文件中的外部路径调用logback,它对我有用:

日志记录:   config:C:/folder/logback.xml

答案 9 :(得分:0)

在准备Spring Boot环境之前,Spring Boot主类或SpringApplication将初始化loggerfactory,它将检测默认配置文件(logback.groovylogback.xml,{{1但是,此时Spring Boot应用程序尚未启动,这意味着未设置变量logback-test.xml。因此,首先应该更改logback配置文件的名称,并在Spring Boot配置中手动配置文件名LOG_PATH。通过这种方式,logback将默认配置控制台appender而不是创建文件appender,然后当Spring Boot环境准备就绪时,它将触发enviromentready事件,这将导致logging.config重新配置logback。您可以在springboot的页面https://github.com/spring-projects/spring-boot/issues/2558

中找到该问题

答案 10 :(得分:0)

  

某处Spring正在解析yml

之前加载xml

所以只需将 logback.xml 重命名为 your-logback.xml 并在application.properties中添加 int size = mSectionsPagerAdapter.getCount(); for (int i = 0; i < size; i++) { Fragment fragment = mSectionsPagerAdapter.getItem(i); if (fragment != null && fragment instanceof FeedsFragment) { ((FeedsFragment)fragment).doFeedsQuery(); } }

答案 11 :(得分:0)

尝试将以下内容添加到您的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 :(得分:0)

在logback中输入一个条目:

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

并参考:

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

答案 13 :(得分:0)

如果您使用的是Spring Boot Finchley(2.x),则可以在spring.application.nameapplication.properties文件中定义application.yml,并在Logback配置中添加以下内容:

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

您现在可以将${springAppName}作为变量pattern

答案 14 :(得分:0)

版本: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

答案 15 :(得分:0)

执行以下操作仅创建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"/>

请勿使用以下行,否则将永远不会禁用控制台日志,并且会在temp目录中创建spring.log文件(如果您未在application.properties中提供logging.path)。查看下面文件的代码以了解更多信息。

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

答案 16 :(得分:0)

我也有类似的问题。我通过将logback-spring.xml重命名为logback-whatever.xml并在application.properties中添加以下内容来解决它:

logging.config = classpath:logback-whatever.xml

此外,当我们将用户定义的属性用于记录目的时,也会出现此问题,例如:

log.path =日志 log.archive.path =已存档

答案 17 :(得分:0)

我想你已经包含了一个错误文件。 请更改

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

<include resource="org/springframework/boot/logging/logback/base.xml"/>
然后试一试。

答案 18 :(得分:0)

在logback.xml中声明属性LOG_PATH

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

是您必须指定创建日志文件的目录的位置。如果此字段为空,则logback将在程序执行中创建新目录。创建的目录名称为LOG_PATH_IS_UNDEFINED

答案 19 :(得分:0)

对我有用的东西

  • 在资源文件夹下具有logback-spring.xml(与yamls相同)
  • 在application.yaml中设置环境变量
  • 修改后,进行./gradlew干净的构建

答案 20 :(得分:0)

大家新年快乐! 因此,我已将 Spring Boot 更新到版本 (2.4.1),并且开始出现 LOG_PATH_IS_UNDEFINED 错误。

我做了一些研究,我猜测从 logging.path 到 LOG_PATH 的属性映射存在问题。 (我手动调试了记录器并且正在加载属性)

我的解决方案/补丁:

我在最顶部添加了到 logback-spring.xml 的手动映射:

<springProperty scope="context" name="LOG_PATH" source="logging.path"/>

现在它对我有用...