我尝试使用标记的名称作为RollingFileAppender
在 内定义的的文件名RoutingAppender
,类似于此示例,但使用 而<RolingFile>
不是<File>
。这样做的最终目的是每个用户登录应用程序。标记是用户名。
不幸的是,这不起作用。我收到此错误:
2024-12-20T14:59:14.322023700Z userTaskScheduler-2 ERROR Unable to create file \app\logs/${event:Marker}.log java.io.IOException: The filename, directory name, or volume label syntax is incorrect
at java.base/java.io.WinNTFileSystem.canonicalize0(Native Method)
at java.base/java.io.WinNTFileSystem.canonicalize(WinNTFileSystem.java:463)
at java.base/java.io.File.getCanonicalPath(File.java:626)
at java.base/java.io.File.getCanonicalFile(File.java:651)
at org.apache.logging.log4j.core.util.FileUtils.makeParentDirs(FileUtils.java:141)
at org.apache.logging.log4j.core.appender.rolling.RollingFileManager$RollingFileManagerFactory.createManager(RollingFileManager.java:863)
这是 log4j2 设置:
<Properties>
<Property name="basePath" value="\app\logs" />
</Properties>
<Appenders>
<Routing name="ROUTING">
<Routes pattern="$${event:Marker}">
<!--<Route key="DEFAULT" ref="FILE"/>-->
<Route>
<RollingFile
name="${event:Marker}"
fileName="${basePath}/${event:Marker}.log"
filePattern="${basePath}/${event:Marker}_%d{yyyyMMdd}.log.gz"
append="true">
<PatternLayout pattern="%-5p | %d{yyyy-MM-dd HH:mm:ss} | %X{username} | [%marker] | [%t] %C{2} (%F:%L) - %m%n" />
<Policies>
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="10 MB" />
</Policies>
</RollingFile>
</Route>
</Routes>
</Routing>
</Appenders>
以下是 Java 代码:
public class LoggingServiceImpl implements LoggingService {
private Map<String, Marker> monitoredUsersMarkers;
private Marker DEFAULT = MarkerFactory.getMarker("DEFAULT");
// code to populate markers map
@Override
public Marker getMarker(String userId) {
Marker result = monitoredUsersMarkers.getOrDefault(userId, DEFAULT);
return result;
}
我已经研究并查看了以前的问题,但它们并未解决我的问题。