Skip to content

DirectWriteRolloverStrategy can't create log files on Windows Log4j2 2.17.2 #1645

Closed
@posuhov

Description

@posuhov

Description

My application is running on SpringBoot 2.7.13. I have an appender defined like

Configuration:
  status: warn
  appenders:
    RollingFile:
      - name: LogToRollingFileWithPattern
        filePattern: application-%i.log
        PatternLayout:
          Pattern: "%level %d{DEFAULT_MICROS} [%t] %c{1} %X{AWS-XRAY-TRACE-ID} - %msg%n"
        Policies:
          SizeBasedTriggeringPolicy:
            size: 1MB
        DirectWriteRolloverStrategy:
          maxFiles: 5
  Loggers:
    Root:
      level: info
      AppenderRef:
        - ref: LogToRollingFileWithPattern

Once I start the application the exception is printed in console and file are not created.
Everything works with DefaultRolloverStrategy and files are created as expected

Configuration

Version: 2.17.2

Operating system: Windows 10

JDK: JDK 17

Logs

2023-07-31 18:35:38,086 main ERROR An exception occurred processing Appender LogToRollingFileWithPattern java.lang.NullPointerException: Cannot invoke "java.io.File.mkdirs()" because the return value of "java.io.File.getParentFile()" is null
	at org.apache.logging.log4j.core.appender.rolling.RollingFileManager.createParentDir(RollingFileManager.java:253)
	at org.apache.logging.log4j.core.appender.FileManager.createOutputStream(FileManager.java:191)
	at org.apache.logging.log4j.core.appender.OutputStreamManager.getOutputStream(OutputStreamManager.java:165)
	at org.apache.logging.log4j.core.appender.OutputStreamManager.writeToDestination(OutputStreamManager.java:250)
	at org.apache.logging.log4j.core.appender.FileManager.writeToDestination(FileManager.java:277)
	at org.apache.logging.log4j.core.appender.rolling.RollingFileManager.writeToDestination(RollingFileManager.java:275)
	at org.apache.logging.log4j.core.appender.OutputStreamManager.flushBuffer(OutputStreamManager.java:283)
	at org.apache.logging.log4j.core.appender.OutputStreamManager.flush(OutputStreamManager.java:294)
	at org.apache.logging.log4j.core.appender.AbstractOutputStreamAppender.directEncodeEvent(AbstractOutputStreamAppender.java:217)
	at org.apache.logging.log4j.core.appender.AbstractOutputStreamAppender.tryAppend(AbstractOutputStreamAppender.java:208)
	at org.apache.logging.log4j.core.appender.AbstractOutputStreamAppender.append(AbstractOutputStreamAppender.java:199)
	at org.apache.logging.log4j.core.appender.RollingFileAppender.append(RollingFileAppender.java:312)
	at org.apache.logging.log4j.core.config.AppenderControl.tryCallAppender(AppenderControl.java:161)
	at org.apache.logging.log4j.core.config.AppenderControl.callAppender0(AppenderControl.java:134)
	at org.apache.logging.log4j.core.config.AppenderControl.callAppenderPreventRecursion(AppenderControl.java:125)
	at org.apache.logging.log4j.core.config.AppenderControl.callAppender(AppenderControl.java:89)
	at org.apache.logging.log4j.core.config.LoggerConfig.callAppenders(LoggerConfig.java:675)
	at org.apache.logging.log4j.core.config.LoggerConfig.processLogEvent(LoggerConfig.java:633)
	at org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:616)
	at org.apache.logging.log4j.core.config.LoggerConfig.logParent(LoggerConfig.java:666)
	at org.apache.logging.log4j.core.config.LoggerConfig.processLogEvent(LoggerConfig.java:635)
	at org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:616)
	at org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:552)
	at org.apache.logging.log4j.core.config.DefaultReliabilityStrategy.log(DefaultReliabilityStrategy.java:63)
	at org.apache.logging.log4j.core.Logger.log(Logger.java:161)
	at org.apache.logging.log4j.spi.AbstractLogger.tryLogMessage(AbstractLogger.java:2205)
	at org.apache.logging.log4j.spi.AbstractLogger.logMessageTrackRecursion(AbstractLogger.java:2159)
	at org.apache.logging.log4j.spi.AbstractLogger.logMessageSafely(AbstractLogger.java:2142)
	at org.apache.logging.log4j.spi.AbstractLogger.logMessage(AbstractLogger.java:2022)
	at org.apache.logging.log4j.spi.AbstractLogger.logIfEnabled(AbstractLogger.java:1875)
	at org.apache.commons.logging.LogAdapter$Log4jLog.log(LogAdapter.java:266)
	at org.apache.commons.logging.LogAdapter$Log4jLog.info(LogAdapter.java:230)
	at org.springframework.boot.SpringApplication.logStartupProfileInfo(SpringApplication.java:637)
	at org.springframework.boot.SpringApplication.prepareContext(SpringApplication.java:378)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:306)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1303)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1292)
	at com.example.Application.main(Application.java:21)

Reproduction

Errors appears right after application start. It happens during creation a directory for logs
image
However if we replace file.getParentFile() with file.getAbsoluteFile().getParentFile() it returns a correct non null File

Metadata

Metadata

Assignees

Labels

appendersAffects one or more Appender pluginsbugIncorrect, unexpected, or unintended behavior of existing coderuntimeSpecific to the runtime environment

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions