37

I am using SpringBoot with LogBack and using the below configuration in my yml file:

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

The logging.path Spring Environment Variable is transferred to the LOG_PATH Environment variable and the log file is placed at the correct place, but there is also a directory called LOG_PATH_IS_UNDEFINED created in the root directory of my project.

This seems to be caused by the different phase used by SpringBoot to configure LogBack with its Environment variables.

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.

And then after that it start configuring logback again but this time using the path i set:

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.

My 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> 

If I remove my logback.xml file from the project it doesn't create the folder, so somewhere Spring is loading the xml before parsing the yml?

How can I avoid Logback to create this LOG_PATH_IS_UNDEFINED directory?

Davi Alves
  • 1,704
  • 2
  • 19
  • 24

23 Answers23

18

In your case LOG_PATH is not defined on startup. You should use ${LOG_PATH:-.} instead , See .

But if you define logging.path in your application.properties you will see two log files in . and in ${logging.path} directory.

Spring container set LOG_PATH after Logback initialization... Logback is not supported lazy file creation as far as I know. In this case you should use logback-spring.xml instead logback.xml.

Sabir Khan
  • 9,826
  • 7
  • 45
  • 98
Igor Tytar
  • 433
  • 1
  • 4
  • 10
  • 1
    Thanks for your input, but the logback-spring.xml is new. By the time I asked this it didn't exist. Spring released it on v1.3. – Davi Alves Dec 03 '15 at 20:21
8

I faced similar issue and its easy to solve it. Basically , concept is that Spring Boot already gives you System property - LOG_PATH for Spring Boot property - logging.path so you define logging.path in your application.properties and simply use LOG_PATH in your logback configuration - logback-spring.xml.

You shouldn't declare logback <property ...> for LOG_PATH , just use it whenever you want.

See at near bottom here

Sabir Khan
  • 9,826
  • 7
  • 45
  • 98
5

I encountered the same problem. put an entry in logback.xml

<property resource="application.properties" />

In application.properties

FILE_LOG_PATTERN=###
LOG_FILE=###

when your application starts,the name of the directory created is what you have defined in the properties file.

Mark Rotteveel
  • 100,966
  • 191
  • 140
  • 197
Chaucer
  • 51
  • 1
  • 1
4

Before Spring Boot enviroment is prepared, the Spring Boot main class or the SpringApplication will initialize the loggerfactory, which will detect the default configuration file (logback.groovy, logback.xml, logback-test.xml), but at this time the Spring Boot application is not started yet, which means the variable LOG_PATH is not set. So at first you should alter the name of your logback config file and configure the file name manually in the Spring Boot config as logging.config. By this way the logback will configure a console appender by default instead of creating a file appender, and then when the Spring Boot enviroment is ready it will fire an enviromentready event, which causes a logback reconfig by LoggingApplicationListener. You can find the issue at springboot's page https://github.com/spring-projects/spring-boot/issues/2558

Nisse Engström
  • 4,738
  • 23
  • 27
  • 42
Johnson
  • 41
  • 3
4

Might not be your case but if you have bootstrap.properties make sure logging.path is defined there and only there.

prettyvoid
  • 3,446
  • 6
  • 36
  • 60
4

if you're on Spring Boot Finchley (2.x), you can define spring.application.name in your application.properties or application.yml file and add the following in your Logback configuration:

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

you will now have ${springAppName} as a variable at your disposal for your log pattern.

Dexter Legaspi
  • 3,192
  • 1
  • 35
  • 26
3

Do below to create dev/log directory only. Do not add log.path in application.properties

Add log.path=dev/logs in your bootstrap.properties.

Add below line in your logback-spring.xml.

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

Note Make sure you include the below line only.

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

Do not use the below line else console logs will never be disabled and spring.log file will be created in temp directory(if you dont not provide logging.path in application.properties). The check the code of below file to know more.

 <include resource="org/springframework/boot/logging/logback/base.xml"/>
Ravi Gupta
  • 81
  • 5
  • 2
    The above solution will help in case of **spring-cloud**. During spring cloud's boostraping process, bootstrap.properties is loaded before application.properties. If we don't specify log.path in bootstrap.properties then can not find this path and logback creates an **LOG_PATH_IS_UNDEFINED** directory. After the bootstrap process logback is re-initialized with right configuration. Seems to be related to Spring cloud. – Ravi Gupta May 22 '19 at 05:55
  • Moving logging config to `application.properties` will fix the issue, no need to change logback.xml or logback-spring.xml – Eric Jan 24 '20 at 06:48
3

If you upgrade your Spring Boot version into pom.xml, make sure that your replaced

logging.path = your/log/path

by

logging.file.path = your/log/path

into application.properties. That was my case.

Dharman
  • 30,962
  • 25
  • 85
  • 135
Dervillers Mattéo
  • 175
  • 1
  • 1
  • 14
2

I encountered the same problem. I tried to define my own logback.xml and had trouble using the logging.path and logging.file properties defined in my application.properties file. Here is how I resolved (and worked around) the issues.

First, I learned that you cannot define both logging.path and logging.file properties. Since I'm using a RollingFileAppender that will produce multiple files over multiple days, I define logging.file, but use it more like a file prefix.

In application.properties

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

In 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>

This seems to work for the most part. I defined my own FILE_LOG_PATTERN in the file, which I think is optional. The interesting part is the fileNamePattern. It correctly translates logging.file from my application.properties file into the variable LOG_FILE. The only real ugliness here is that on startup Logback still complains about the log file being undefined and creates an empty file called LOG_FILE_IS_UNDEFINED_XXX in the current directory. But the actual log file in my property is created and correctly appended to.

Andrew

anschoewe
  • 1,089
  • 1
  • 14
  • 34
2

somewhere Spring is loading the xml before parsing the yml

so just rename logback.xml to your-logback.xml and add logging.config=classpath:your-logback.xml in your application.properties

mikelinjie
  • 21
  • 1
1

put an entry in logback:

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

and reference it:

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

MWiesner
  • 8,868
  • 11
  • 36
  • 70
dsfere
  • 11
  • 1
1

I had the same problem since I configured logging.path and logging.file on application.properties but some logs was produced before Spring Boot LogBack configuration and so they were written into LOG_PATH_IS_UNDEFINED/LOG_FILE_IS_UNDEFINED file and then the logs switched to the right location.

I found 2 possible solutions:

1) Configure logging.path and logging.file in bootstrap.properties since the configuration in bootstrap take place before

or

2) Set logging.path and logging.file as system properties with -Dlogging.path=... -Dlogging.file=... when launching the application

Massimo Da Ros
  • 393
  • 3
  • 11
1

Based on Spring Boot common properties, add the following into your application.yml

logging:
  file:
    path: logs/dev

if using application.properties, it should be

logging.file.path = logs/dev
Balloon Wen
  • 61
  • 1
  • 2
1

By reading the answers here I've "extrapolated" the simplest, as configuration-free as possible way of solving this problem.

First of all, configure the logging.path property in the application.properties or application.yml file. This one is needed.
Then, name your logback configuration file logback-spring.xml.
The test version of that automatically-detected name is logback-test-spring.xml.

This is how I solved the issue with logging.path being the only configuration property I needed to set for logs.

I guess if you upvote my answer you should also(/instead) upvote @Sabir Khan's and/or @Igor Tytar's ones.

nonzaprej
  • 1,322
  • 2
  • 21
  • 30
  • 1
    Just to add - Spring Boot's Logback extensions can't be used with standard logback.xml extension. Hence, rename to logback-spring.xml. – Amirul Apr 12 '23 at 10:03
0

Declare the property LOG_PATH in your logback.xml

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

is where you must specify the directory where the log files are created. If this field is left empty, logback will create a new directory in the program execution. The name of the directory created is LOG_PATH_IS_UNDEFINED

Dheeraj Arora
  • 608
  • 4
  • 13
  • And how can I make it load the logging.path configuration in my yml file? Just tried using and now I have a logging.path_IS_UNDEFINED folder. And neither the files are created in the folder. – Davi Alves Aug 11 '14 at 20:56
  • Is logging.path an OS environment variable? If yes, it should get replaced as mentioned in the logback documentation. – Dheeraj Arora Aug 11 '14 at 21:03
  • No it's a property in the application.yml file loaded by Spring. So that's why it seems to be an issue with SpringBoot loading the logging configuration before loading the properties file. – Davi Alves Aug 11 '14 at 21:07
  • Yeah could be. Is it required for you to define logging path in yml properties? Are you using the same property at other places as well in your project? – Dheeraj Arora Aug 11 '14 at 21:16
  • Would be nice to have all my properties in a single file thought. Nope just for logback.xml. – Davi Alves Aug 11 '14 at 21:32
  • I've encountered the exact same problem. My custom logback file seems to ignore my logging.path property. The Spring Boot documentation indicates this property value should be made available in the logback.xml file as LOG_PATH. (see bottom of http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-logging.html) – anschoewe Feb 13 '15 at 15:12
0

I suppose you have included an error file. Please change

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

to

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

then have a try.

Nisse Engström
  • 4,738
  • 23
  • 27
  • 42
Solar
  • 1
  • This question was for an older version of SpringBoot which had the file I mentioned. Doesn't matter because it seems that they fixed it on the current revision 1.3. – Davi Alves Nov 25 '15 at 17:18
0

Try adding the following to your POM file

<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>
Maro
  • 4,065
  • 7
  • 33
  • 34
0

To call an logback form an external path in a .yml file, it worked for me as:

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

bernardo
  • 23
  • 3
0

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. springboot:

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

Zed
  • 23
  • 1
  • 7
0

I was also having similar issue. I resolved it by renaming logback-spring.xml to logback-whatever.xml and added below in application.properties:

logging.config=classpath:logback-whatever.xml

Also, this issue comes when we use user defined properties for logging purposes such as:

log.path=logs log.archive.path=archived

Sukh
  • 424
  • 5
  • 16
0

What worked for me:

  • having logback-spring.xml under resources folder (the same as yamls)
  • setting the environment variable in the application.yaml
  • after modifications, do a ./gradlew clean build
Alesis Joan
  • 405
  • 3
  • 8
0

Happy new year everybody! So, I've updated my spring boot to version (2.4.1) and I started getting the LOG_PATH_IS_UNDEFINED error.

I did a bit of research and I'm guessing there is a problem with the mapping of the properties from logging.path to LOG_PATH. (I manually debugged the logger and the properties were being load)

My solution/Patch:

I added a manual mapping to the logback-spring.xml at the very top:

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

Now it is working for me...

Esteban
  • 1,496
  • 17
  • 22
0
  1. Rename logback.xml to logback-spring.xml.

Based on the Spring boot's documentation, you can't use Spring boot's logback extension with standard logback.xml file. It needs to be renamed.

  1. Configure your application.properties or application.yml with the following;

For application.properties:

logging.config=classpath:logback-spring.xml
logging.file.path=/logs

For application.yml:

logging:
  config: classpath:logback-spring.xml
  file:
    path: /logs
  1. In the logback-spring.xml, set as below:
<springProperty scope="context" name="LOG_PATH" source="logging.file.path"/>
  1. Use the LOG_PATH variable to anywhere you like in the file:
<file>${LOG_PATH}/file.log</file>
Amirul
  • 542
  • 6
  • 15