Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

RollingFileAppender crash when log file path has unmatched parenthesis #914

Open
danamlund opened this issue Jan 27, 2025 · 0 comments
Open

Comments

@danamlund
Copy link

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
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant