Java 无法在Log4J2上分离日志文件

Java 无法在Log4J2上分离日志文件,java,log4j,log4j2,Java,Log4j,Log4j2,我想将日志与作为RequestId提供的每个线程分开。 然而,有一个问题我不知道。也许,我弄错了 Unable to create file C:\XXXX\XXXXXX\XXXX\logs\${ctx:RequestId}.log java.io.IOException: The filename, directory name, or volume label syntax is incorrect at java.io.WinNTFileSystem.canonicalize0(Nati

我想将日志与作为RequestId提供的每个线程分开。 然而,有一个问题我不知道。也许,我弄错了

 Unable to create file C:\XXXX\XXXXXX\XXXX\logs\${ctx:RequestId}.log java.io.IOException: The filename, directory name, or volume label syntax is incorrect
at java.io.WinNTFileSystem.canonicalize0(Native Method)
at java.io.WinNTFileSystem.canonicalize(WinNTFileSystem.java:428)
at java.io.File.getCanonicalPath(File.java:618)
at java.io.File.getCanonicalFile(File.java:643)
at org.apache.logging.log4j.core.util.FileUtils.makeParentDirs(FileUtils.java:142)
这是我的log4j.xml

<?xml version="1.0" encoding="UTF-8"?>
<Configuration  status="debug" >
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="" />
        </Console>
        <Routing name="Routing">
            <Routes pattern="$${ctx:RequestId}">
                <Route>
                    <RollingFile  name="Rolling-${ctx:RequestId}" fileName="C:\XXXXX\XXXXXX\Desktop\logs\${ctx:RequestId}.log"
                                  filePattern="C:\XXXXX\XXXXX\Desktop\logs\${ctx:RequestId}.%i.log.gz">
                        <PatternLayout>
                            <pattern></pattern>
                        </PatternLayout>
                        <Policies>
                            <OnStartupTriggeringPolicy />
                        </Policies>
                    </RollingFile>
                </Route>
                <Route key="${ctx:RequestId}" ref="Console" />
            </Routes>
        </Routing>
    </Appenders>
    <Loggers>
        <Logger level="INFO" name="TRY_ME">
            <AppenderRef ref="Routing"/>
        </Logger>
        <Root level="INFO">
            <AppenderRef ref="Console" />
        </Root>
    </Loggers>
</Configuration>

log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Appenders>
        <Routing name="RoutingAppender">
            <Routes pattern="${ctx:logFileName}">
                <Route>
                    <RollingFile name="Rolling-${ctx:logFileName}"
                                 fileName="./logs/${ctx:logFileName}.log"
                                 filePattern="./logs/${ctx:logFileName}.%i.log.gz">
                        <PatternLayout pattern="%d{HH:mm:ss.SSS} [%-5level] %logger{36} - %msg%n"/>
                        <SizeBasedTriggeringPolicy size="512" />
                    </RollingFile>
                </Route>
            </Routes>
        </Routing>
    </Appenders>

    <Loggers>
        <Root level="all">
            <AppenderRef ref="RoutingAppender" />
        </Root>
    </Loggers>
</Configuration>
输出:testFile1.log

16:27:51.868 [INFO ] com.test.Log4j2Test- log printed! - testFile1
输出:testFile2.log

16:27:51.897 [INFO ] com.test.Log4j2Test- log printed! - testFile2

终于找到了解决办法。我希望它会有用

  <Routing name="RoutingAppender">
        <Routes pattern="$${ctx:RequestId}">
            <Route>
                <RollingFile name="Rolling-${ctx:RequestId}" fileName="C:\XXX\a58086\XXXX\logs\${ctx:RequestId}.log"
                             filePattern="C:\XXXX\XXXX\Desktop\logs\$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">
                    <PatternLayout pattern="%d{ABSOLUTE} %level{length=5} [%thread] %logger{1} - %msg%n"/>
                    <SizeBasedTriggeringPolicy size="512" />
                </RollingFile>
            </Route>

            <Route ref="Console" key="${ctx:RequestId}"/>
        </Routes>
    </Routing>


我需要使用requestId滚动appender。问题出在Windows或任何操作系统上。我需要一个log4j2中的解决方案,这个例子是@HasanBirol,我知道你想要什么,所以我改变了我的回答。你能再检查一下我的评论吗?
  <Routing name="RoutingAppender">
        <Routes pattern="$${ctx:RequestId}">
            <Route>
                <RollingFile name="Rolling-${ctx:RequestId}" fileName="C:\XXX\a58086\XXXX\logs\${ctx:RequestId}.log"
                             filePattern="C:\XXXX\XXXX\Desktop\logs\$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">
                    <PatternLayout pattern="%d{ABSOLUTE} %level{length=5} [%thread] %logger{1} - %msg%n"/>
                    <SizeBasedTriggeringPolicy size="512" />
                </RollingFile>
            </Route>

            <Route ref="Console" key="${ctx:RequestId}"/>
        </Routes>
    </Routing>