Skip to content

version:1.5.18,Could not initialize Logback logging from classpath:logback-spring.xml #954

@KaKaLuoTeSun

Description

@KaKaLuoTeSun

Hi there,
The following is my logback-spring.xml configuration file:

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
	<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
		<pattern>${LOG_PATTERN}</pattern>
	</encoder>
</appender>

<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
	<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
		<FileNamePattern>${LOG_HOME}/${FILE_NAME}-%d{yyyy-MM-dd}.%i.log</FileNamePattern>
		<cleanHistoryOnStart>true</cleanHistoryOnStart>
	</rollingPolicy>
	<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
		<pattern>${LOG_PATTERN}</pattern>
	</encoder>
</appender>

<appender name="ERROR"  class="ch.qos.logback.core.rolling.RollingFileAppender">
	<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
		<level>ERROR</level>
	</filter>
	<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
		<FileNamePattern>${LOG_HOME}/${FILE_NAME}-%d{yyyy-MM-dd}.%i.error.log</FileNamePattern>
		<cleanHistoryOnStart>true</cleanHistoryOnStart>
		<springProfile name="prod">
			<MaxHistory>30</MaxHistory>
			<maxFileSize>20MB</maxFileSize>
			<totalSizeCap>5GB</totalSizeCap>
		</springProfile>
		<springProfile name="!prod">
			<MaxHistory>7</MaxHistory>
			<maxFileSize>20MB</maxFileSize>
			<totalSizeCap>3GB</totalSizeCap>
		</springProfile>
	</rollingPolicy>
	<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
		<pattern>${ERROR_LOG_PATTERN}</pattern>
	</encoder>
</appender>

<springProfile name="prod">
	<logger name="org.apache.ibatis" level="WARN" />
	<logger name="springfox.documentation.schema.property.CachingModelPropertiesProvider" level="ERROR" />
	<logger name="org.mybatis" level="WARN" />
	<logger name="com.dm" level="WARN" />
	<logger name="com.dm.dsa.DsaApplication" level="INFO" />
	<root level="WARN">
		<appender-ref ref="FILE" />
		<appender-ref ref="ERROR" />
	</root>
</springProfile>

<springProfile name="!prod">
	<logger name="org.apache.ibatis" level="INFO" />
	<logger name="springfox.documentation.schema.property.CachingModelPropertiesProvider" level="ERROR" />
	<logger name="org.mybatis" level="INFO" />
	<logger name="com.dm" level="INFO" />
	<logger name="com.dm.dsa.websocket.WebSocket" level="INFO" />
	<logger name="org.springframework.jdbc.datasource.DataSourceTransactionManager" level="DEBUG" />
	<logger name="org.springframework.jdbc.support.JdbcTransactionManager" level="DEBUG" />
	<logger name="com.baomidou.dynamic.datasource.tx.LocalTxUtil" level="DEBUG" />
	<root level="INFO">
		<appender-ref ref="STDOUT" />
		<appender-ref ref="FILE" />
		<appender-ref ref="ERROR" />
	</root>
</springProfile>
======================== However, my project fails to start when the installation path or working directory contains special characters like @¥%......& (e.g., C:\Users\me\Desktop\@¥%......&\my-app\...). It throws an error during startup related to logback and the % symbol in the log file path.

After some debugging, I found that this might be caused by logback interpreting % in the fileNamePattern (e.g. ${LOG_HOME}/${FILE_NAME}-%d{yyyy-MM-dd}.%i.log) as a format specifier, and if the path before it contains a %, it fails to parse.

Do you know how to safely support special characters (especially %) in the working directory path when using logback? Is there a way to escape or sanitize the file path?

Thanks in advance!

The error message is:
java.lang.IllegalStateException: Could not initialize Logback logging from classpath:logback-spring.xml
at org.springframework.boot.logging.logback.LogbackLoggingSystem.lambda$loadConfiguration$2(LogbackLoggingSystem.java:265)
at org.springframework.boot.logging.logback.LogbackLoggingSystem.withLoggingSuppressed(LogbackLoggingSystem.java:483)
at org.springframework.boot.logging.logback.LogbackLoggingSystem.loadConfiguration(LogbackLoggingSystem.java:255)
at org.springframework.boot.logging.AbstractLoggingSystem.initializeWithConventions(AbstractLoggingSystem.java:81)
at org.springframework.boot.logging.AbstractLoggingSystem.initialize(AbstractLoggingSystem.java:61)
at org.springframework.boot.logging.logback.LogbackLoggingSystem.initialize(LogbackLoggingSystem.java:197)
at org.springframework.boot.context.logging.LoggingApplicationListener.initializeSystem(LoggingApplicationListener.java:332)
at org.springframework.boot.context.logging.LoggingApplicationListener.initialize(LoggingApplicationListener.java:298)
at org.springframework.boot.context.logging.LoggingApplicationListener.onApplicationEnvironmentPreparedEvent(LoggingApplicationListener.java:246)
at org.springframework.boot.context.logging.LoggingApplicationListener.onApplicationEvent(LoggingApplicationListener.java:223)
at com.dm.dsa.config.app.SqlarkLoggingInitializeListener.onApplicationEvent(SqlarkLoggingInitializeListener.java:20)
at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:185)
at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:178)
at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:156)
at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:138)
at org.springframework.boot.context.event.EventPublishingRunListener.multicastInitialEvent(EventPublishingRunListener.java:136)
at org.springframework.boot.context.event.EventPublishingRunListener.environmentPrepared(EventPublishingRunListener.java:81)
at org.springframework.boot.SpringApplicationRunListeners.lambda$environmentPrepared$2(SpringApplicationRunListeners.java:64)
at java.base/java.lang.Iterable.forEach(Iterable.java:75)
at org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:118)
at org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:112)
at org.springframework.boot.SpringApplicationRunListeners.environmentPrepared(SpringApplicationRunListeners.java:63)
at org.springframework.boot.SpringApplication.prepareEnvironment(SpringApplication.java:353)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:313)
at com.dm.dsa.DsaApplication.main(DsaApplication.java:122)
Caused by: java.lang.NumberFormatException: For input string: ".....&/"
at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:67)
at java.base/java.lang.Integer.parseInt(Integer.java:654)
at java.base/java.lang.Integer.parseInt(Integer.java:786)
at ch.qos.logback.core.pattern.FormatInfo.valueOf(FormatInfo.java:83)
at ch.qos.logback.core.pattern.parser.Parser.T(Parser.java:134)
at ch.qos.logback.core.pattern.parser.Parser.E(Parser.java:94)
at ch.qos.logback.core.pattern.parser.Parser.Eopt(Parser.java:113)
at ch.qos.logback.core.pattern.parser.Parser.E(Parser.java:98)
at ch.qos.logback.core.pattern.parser.Parser.parse(Parser.java:89)
at ch.qos.logback.core.rolling.helper.FileNamePattern.parse(FileNamePattern.java:71)
at ch.qos.logback.core.rolling.helper.FileNamePattern.(FileNamePattern.java:56)
at ch.qos.logback.core.rolling.TimeBasedRollingPolicy.start(TimeBasedRollingPolicy.java:72)
at ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy.start(SizeAndTimeBasedRollingPolicy.java:43)
at ch.qos.logback.core.model.processor.ImplicitModelHandler.postHandleComplex(ImplicitModelHandler.java:207)
at ch.qos.logback.core.model.processor.ImplicitModelHandler.postHandle(ImplicitModelHandler.java:186)
at ch.qos.logback.core.model.processor.DefaultProcessor.secondPhaseTraverse(DefaultProcessor.java:257)
at ch.qos.logback.core.model.processor.DefaultProcessor.secondPhaseTraverse(DefaultProcessor.java:253)
at ch.qos.logback.core.model.processor.DefaultProcessor.secondPhaseTraverse(DefaultProcessor.java:253)
at ch.qos.logback.core.model.processor.DefaultProcessor.traversalLoop(DefaultProcessor.java:90)
at ch.qos.logback.core.model.processor.DefaultProcessor.process(DefaultProcessor.java:106)
at ch.qos.logback.core.joran.GenericXMLConfigurator.processModel(GenericXMLConfigurator.java:222)
at org.springframework.boot.logging.logback.SpringBootJoranConfigurator.processModel(SpringBootJoranConfigurator.java:136)
at ch.qos.logback.core.joran.GenericXMLConfigurator.doConfigure(GenericXMLConfigurator.java:178)
at ch.qos.logback.core.joran.GenericXMLConfigurator.doConfigure(GenericXMLConfigurator.java:123)
at ch.qos.logback.core.joran.GenericXMLConfigurator.doConfigure(GenericXMLConfigurator.java:66)
at org.springframework.boot.logging.logback.LogbackLoggingSystem.configureByResourceUrl(LogbackLoggingSystem.java:300)
at org.springframework.boot.logging.logback.LogbackLoggingSystem.lambda$loadConfiguration$2(LogbackLoggingSystem.java:262)
... 24 more

pgsql
复制
编辑

Metadata

Metadata

Assignees

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