Skip to content

RollingFileAppender crash when log file path has unmatched parenthesis #914

Closed

Description

@danamlund

Discovered because a windows user had a home folder ala "c:/users/Michael(Financ" likely due to a truncated user name. This is an issue for all log file paths that are not valid regex patterns.

Issue seen on logback version 1.5.9.

Stack trace:

Exception in thread "main" java.util.regex.PatternSyntaxException: Unclosed group near index 38
log.orphan(paren.\d{4}-\d{2}-\d{2}.log
	at java.base/java.util.regex.Pattern.error(Pattern.java:2204)
	at java.base/java.util.regex.Pattern.accept(Pattern.java:2054)
	at java.base/java.util.regex.Pattern.group0(Pattern.java:3232)
	at java.base/java.util.regex.Pattern.sequence(Pattern.java:2300)
	at java.base/java.util.regex.Pattern.expr(Pattern.java:2245)
	at java.base/java.util.regex.Pattern.compile(Pattern.java:1945)
	at java.base/java.util.regex.Pattern.<init>(Pattern.java:1576)
	at java.base/java.util.regex.Pattern.compile(Pattern.java:1101)
	at java.base/java.util.regex.Pattern.matches(Pattern.java:1220)
	at java.base/java.lang.String.matches(String.java:2965)
	at ch.qos.logback.core.rolling.RollingFileAppender.checkForFileAndPatternCollisions(RollingFileAppender.java:113)
	at ch.qos.logback.core.rolling.RollingFileAppender.start(RollingFileAppender.java:84)
	at LogbackInvalidRegexPathCheck.main(LogbackInvalidRegexPathCheck.java:23)

Code example:

import org.slf4j.LoggerFactory;

import ch.qos.logback.classic.Logger;
import ch.qos.logback.core.rolling.RollingFileAppender;
import ch.qos.logback.core.rolling.TimeBasedRollingPolicy;

public class LogbackInvalidRegexPathCheck {
    public static void main(String[] args) throws Exception {
        Logger logger = (Logger) LoggerFactory.getLogger("invalid-regex");
        
        RollingFileAppender<Object> rollingFileAppender = new RollingFileAppender<>();
        
        rollingFileAppender.setFile("log.log");
        TimeBasedRollingPolicy<Object> rollingPolicy = new TimeBasedRollingPolicy<>();
        rollingPolicy.setFileNamePattern("log.orphan(paren.%d{yyyy-MM-dd}.log");
        rollingPolicy.setParent(rollingFileAppender);
        rollingPolicy.setContext(logger.getLoggerContext());
        rollingPolicy.start();
        
        rollingFileAppender.setRollingPolicy(rollingPolicy);
        rollingFileAppender.setTriggeringPolicy(rollingPolicy);
        rollingFileAppender.setContext(logger.getLoggerContext());
        rollingFileAppender.start();
    }
}

logback.xml example:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration>

<configuration>
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%kvp- %msg%n</pattern>
    </encoder>
  </appender>

  <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>log.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
      <fileNamePattern>log.orphan(paren.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
      <maxHistory>5</maxHistory>
      <maxFileSize>10MB</maxFileSize>
    </rollingPolicy>
    <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
      <pattern>%date %level [%thread] %logger{10} [%file:%line] -%kvp- %msg%n</pattern>
    </encoder>
  </appender>

  <root level="debug">
    <appender-ref ref="STDOUT"/>
    <appender-ref ref="FILE"/>
  </root>
</configuration>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions