我尝试使用标记的名称作为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;
}
我已经研究并查看了以前的问题,但它们并未解决我的问题。
您的配置未涵盖日志事件没有标记的情况。如果没有标记,
${event:Marker}
占位符不会展开,并导致您看到的错误。为了防止出现此问题,您引用的示例使用具有默认值的占位符
${event:Marker:-main}
,如果不存在标记,则该占位符将扩展为“main”。有关更多详细信息,请参阅属性替换。要解决您的问题,您可以:
${event:Marker}
:$$
以防止扩展: