Estou tentando usar o nome do marcador como o nome de arquivo de um RollingFileAppender
, definido dentro de um RoutingAppender
, similar a este exemplo , exceto com <RolingFile>
em vez de <File>
. O propósito eventual disto é o login por usuário no aplicativo. O marcador é o nome de usuário.
Infelizmente, isso não funciona. Recebo este erro:
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)
Aqui está a configuração do 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>
Aqui está o código 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;
}
Pesquisei e analisei perguntas anteriores, mas elas não resolveram meu problema.
Sua configuração não cobre o caso, quando um evento de log não tem marcador. Se nenhum marcador estiver presente, o
${event:Marker}
placeholder não é expandido e causa o erro que você está vendo.Para evitar esse problema, o exemplo que você está citando usa um placeholder com um valor padrão
${event:Marker:-main}
, que se expande para "main" se nenhum marcador estiver presente. Veja Substituição de Propriedade para mais detalhes.Para resolver seu problema, você pode:
${event:Marker}
das expansões:$$
para evitar expansão: