Log4j2日志文件无法创建问题排查及带时间戳日志配置咨询
先看一下你提供的原始Log4j2配置:
status = trace name= properties_configuration #请根据需要修改日志文件路径 property.filename = C:\Users\xxxxx\IdeaProjects\Logs\rd.log filters = threshold filter.threshold.type = ThresholdFilter filter.threshold.level = debug appenders = rolling appender.rolling.type = RollingFile appender.rolling.name = RollingFile appender.rolling.fileName = ${filename} appender.rolling.filePattern = debug-backup-%d{MM-dd-yy-HH-mm-ss}-%i.log.gz appender.rolling.layout.type = PatternLayout appender.rolling.layout.pattern = %d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n appender.rolling.policies.type = Policies appender.rolling.policies.time.type = TimeBasedTriggeringPolicy appender.rolling.policies.time.interval = 1 appender.rolling.policies.time.modulate = true appender.rolling.policies.size.type = SizeBasedTriggeringPolicy appender.rolling.policies.size.size=10MB appender.rolling.strategy.type = DefaultRolloverStrategy appender.rolling.strategy.max = 20 logger.rolling.name = com.rightdata.web loggers = rolling logger.rolling.level = debug logger.rolling.additivity = false logger.rolling.appenderRef.rolling.ref = RollingFile #此包或其子包下的类将使用ConsoleAppender和RollingFileAppender进行日志记录 logger.appLogger.name = com.rightdata.web logger.appLogger.level = debug logger.appLogger.additivity = false logger.appLogger.appenderRef.rolling.ref = appLoggerAppender logger.appLogger.appenderRef.console.ref = consoleLoggerAppender rootLogger.level = info rootLogger.appenderRef.stdout.ref = consoleLoggerAppender
针对你遇到的两个问题,逐个给出修改方案:
问题1:无法在Logs目录创建日志文件
这个问题大概率是路径解析错误或者权限/目录不存在导致的,重点修改以下配置:
修正日志路径的转义字符:
在Java properties文件中,反斜杠\是转义字符,单个反斜杠会被解析为特殊字符(比如\U会被识别为Unicode转义的开头),导致路径无法正确识别。你需要把路径中的单个反斜杠改成双反斜杠,或者直接用正斜杠:# 方案1:双反斜杠转义 property.filename = C:\\Users\\xxxxx\\IdeaProjects\\Logs\\rd.log # 方案2:使用正斜杠(Java会自动识别Windows路径) property.filename = C:/Users/xxxxx/IdeaProjects/Logs/rd.log确认目录权限与存在性:
手动检查C:\Users\xxxxx\IdeaProjects\Logs目录是否存在,如果不存在请手动创建;同时确保运行中间件的用户对该目录有读写权限(比如Windows下右键目录→属性→安全,确认当前用户有修改、写入权限)。
问题2:生成带有时间戳的日志文件
你的配置中已经为备份日志设置了时间戳,但如果需要主日志文件也带时间戳,或者优化备份文件的时间戳格式,可以做以下修改:
场景A:主日志文件带时间戳(每次启动生成新的主文件)
修改property.filename,在文件名中加入时间戳格式:
# 主文件名带年月日时分秒,比如 rd-2024-05-20-14-30-00.log property.filename = C:/Users/xxxxx/IdeaProjects/Logs/rd-%d{yyyy-MM-dd-HH-mm-ss}.log
场景B:优化备份日志的时间戳(当前配置已生效,解决问题1后即可生成)
你当前的filePattern已经配置了时间戳:
appender.rolling.filePattern = debug-backup-%d{MM-dd-yy-HH-mm-ss}-%i.log.gz
解决问题1后,当日志文件达到10MB或者每小时(interval=1)时,会自动生成带时间戳和序号的压缩备份文件,比如debug-backup-05-20-24-14-30-00-1.log.gz。如果需要调整时间戳格式,直接修改%d{}中的格式即可(比如改成%d{yyyy-MM-dd-HH-mm-ss}更清晰)。
另外,注意你配置中存在一个小问题:logger.appLogger.appenderRef.rolling.ref = appLoggerAppender,但你的appenders列表里并没有定义名为appLoggerAppender的Appender,这会导致该Logger无法正确输出到文件,建议把这个Ref改成你定义的RollingFile:
logger.appLogger.appenderRef.rolling.ref = RollingFile
内容的提问来源于stack exchange,提问作者Myn m

