首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >filePattern中存在:字符会导致RollingFileAppender (log4j2)在编程配置时出现非法字符错误

filePattern中存在:字符会导致RollingFileAppender (log4j2)在编程配置时出现非法字符错误
EN

Stack Overflow用户
提问于 2022-04-11 17:58:37
回答 1查看 238关注 0票数 0

在log4j2.xml中,在定义RollingFileAppender时,它可以正常工作。以编程方式抛出错误。XML文件-

代码语言:javascript
复制
  <RollingFile name="LogToRollingFile" fileName="logs/app.log"
                     filePattern="logs/$${date:yyyy-MM-dd-HH-mm}/app_%d{yyyy-MM-dd-HH-mm}_%i.log">

Java代码试图复制相同的代码。

代码语言:javascript
复制
final RollingFileAppender rollingFileAppender = RollingFileAppender.newBuilder()
                    .setName("RollingFileAppenderFor"+fileName)
                    .withFileName("logs/"+ fileName+".log")
                    .withFilePattern("logs/$${date:yyyy-MM-dd-HH-mm}/"+ fileName +"-%d{yyyy-MM-dd-HH-mm}-%i.log.gz")
                    .withAppend(true)
                    .setConfiguration(config)
                    .setLayout(layout)
                    .withPolicy(CompositeTriggeringPolicy.createPolicy(timeBasedTriggeringPolicy,sizeBasedTriggeringPolicy))
                    .withStrategy(defaultRolloverStrategy)
                    .build();

导致以下错误。

代码语言:javascript
复制
2022-04-11 23:20:55,164 main ERROR An exception occurred processing Appender RollingFileAppenderForMephisto java.nio.file.InvalidPathException: Illegal char <:> at index 11: logs\${date:yyyy-MM-dd-HH-mm}
    at java.base/sun.nio.fs.WindowsPathParser.normalize(WindowsPathParser.java:182)
    at java.base/sun.nio.fs.WindowsPathParser.parse(WindowsPathParser.java:153)
    at java.base/sun.nio.fs.WindowsPathParser.parse(WindowsPathParser.java:77)
    at java.base/sun.nio.fs.WindowsPath.parse(WindowsPath.java:92)
    at java.base/sun.nio.fs.WindowsFileSystem.getPath(WindowsFileSystem.java:232)
    at java.base/java.io.File.toPath(File.java:2387)
    at org.apache.logging.log4j.core.appender.rolling.AbstractRolloverStrategy.getEligibleFiles(AbstractRolloverStrategy.java:121)
    at org.apache.logging.log4j.core.appender.rolling.AbstractRolloverStrategy.getEligibleFiles(AbstractRolloverStrategy.java:95)
    at org.apache.logging.log4j.core.appender.rolling.AbstractRolloverStrategy.getEligibleFiles(AbstractRolloverStrategy.java:86)
    at org.apache.logging.log4j.core.appender.rolling.DefaultRolloverStrategy.purgeAscending(DefaultRolloverStrategy.java:414)
    at org.apache.logging.log4j.core.appender.rolling.DefaultRolloverStrategy.purge(DefaultRolloverStrategy.java:401)
    at org.apache.logging.log4j.core.appender.rolling.DefaultRolloverStrategy.rollover(DefaultRolloverStrategy.java:530)
    at org.apache.logging.log4j.core.appender.rolling.RollingFileManager.rollover(RollingFileManager.java:502)
    at org.apache.logging.log4j.core.appender.rolling.RollingFileManager.rollover(RollingFileManager.java:392)
    at org.apache.logging.log4j.core.appender.rolling.RollingFileManager.checkRollover(RollingFileManager.java:308)
    at org.apache.logging.log4j.core.appender.RollingFileAppender.append(RollingFileAppender.java:311)
    at org.apache.logging.log4j.core.config.AppenderControl.tryCallAppender(AppenderControl.java:161)
    at org.apache.logging.log4j.core.config.AppenderControl.callAppender0(AppenderControl.java:134)
    at org.apache.logging.log4j.core.config.AppenderControl.callAppenderPreventRecursion(AppenderControl.java:125)
    at org.apache.logging.log4j.core.config.AppenderControl.callAppender(AppenderControl.java:89)
    at org.apache.logging.log4j.core.config.LoggerConfig.callAppenders(LoggerConfig.java:542)
    at org.apache.logging.log4j.core.config.LoggerConfig.processLogEvent(LoggerConfig.java:500)
    at org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:483)
    at org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:417)
    at org.apache.logging.log4j.core.config.AwaitCompletionReliabilityStrategy.log(AwaitCompletionReliabilityStrategy.java:82)
    at org.apache.logging.log4j.core.Logger.log(Logger.java:161)
    at org.apache.logging.log4j.spi.AbstractLogger.tryLogMessage(AbstractLogger.java:2205)
    at org.apache.logging.log4j.spi.AbstractLogger.logMessageTrackRecursion(AbstractLogger.java:2159)
    at org.apache.logging.log4j.spi.AbstractLogger.logMessageSafely(AbstractLogger.java:2142)
    at org.apache.logging.log4j.spi.AbstractLogger.logMessage(AbstractLogger.java:2017)
    at org.apache.logging.log4j.spi.AbstractLogger.logIfEnabled(AbstractLogger.java:1983)
    at org.apache.logging.log4j.spi.AbstractLogger.log(AbstractLogger.java:1652)
    at mcoc.ChampionLogger.addLoggerWithModificationAndLog(ChampionLogger.java:137)
    at mcoc.Test3.main(Test3.java:8)

有什么我能做的吗,在这里有一个替代:字符。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-11 19:13:54

有关更多细节,请阅读布局中美元和百分比模式的Log4j差异。并不是所有的声明在最初的答案都是事实正确的(并可能导致令人惊讶的行为)。

$字符将避开第二个美元字符,并使其成为您输出的文字美元字符。

将日期格式化为%d{...}而不是$${date:...} (您也可以尝试${date:...},注意单美元):

代码语言:javascript
复制
  <RollingFile
      name="LogToRollingFile"
      fileName="logs/app.log"
      filePattern="logs/%d{yyyy-MM-dd-HH-mm}/app_%d{yyyy-MM-dd-HH-mm}_%i.log">

至于为什么文档在一个例子中混合了%d${date:},我不知道。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71832298

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档