-
-
Notifications
You must be signed in to change notification settings - Fork 1.3k
Description
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>
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
复制
编辑