SpringBoot项目使用Log4j2处理Appender File时抛出非法字符<:>异常
问题根因
- 报错中的冒号来自Log4j2默认配置的
${sys:LOG_PATH}路径占位符:Log4j2 2.11.1版本的内置默认配置引用该变量作为日志存储根路径,未显式赋值时,Log4j2会直接将${sys:LOG_PATH}完整字符串拼接进最终路径,其中的冒号属于Windows系统路径非法字符,因此触发报错。 - application.properties中配置的
logging.file是SpringBoot默认适配Logback的属性,对Log4j2的适配兼容性不足,无法覆盖Log4j2默认配置的占位符逻辑。
修复方案
方案1:升级Log4j2版本(推荐)
Log4j2 2.12.0及以上版本已经修复了占位符未赋值时的路径拼接bug,直接将Log4j2依赖版本升级到2.17.2(同时覆盖了历史安全漏洞,稳定性更强)即可解决该问题。
方案2:显式指定LOG_PATH变量
在项目启动类的main方法最顶部添加代码手动给系统变量赋值:
public static void main(String[] args) { System.setProperty("LOG_PATH", "./log"); SpringApplication.run(Application.class, args); }
同时修改application.properties中的日志路径写法,使用正斜杠替代反斜杠提升跨平台兼容性:
logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n logging.pattern.file=%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n logging.file=log/web.log
方案3:使用独立Log4j2配置文件
在resources目录下新建log4j2.xml配置文件,直接写死日志路径完全绕过默认占位符逻辑:
<?xml version="1.0" encoding="UTF-8"?> <Configuration status="WARN"> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n"/> </Console> <File name="FileAppender" fileName="./log/web.log" append="true"> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n"/> </File> </Appenders> <Loggers> <Root level="info"> <AppenderRef ref="Console"/> <AppenderRef ref="FileAppender"/> </Root> </Loggers> </Configuration>
使用该方案时可以删除application.properties中所有logging.开头的配置,避免规则冲突。
内容的提问来源于stack exchange,提问作者Ragul
相关产品推荐
相关产品推荐

