You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 00:24:00