Logback无法写入文件求助:控制台输出正常但无文件日志
Logback无法写入文件排查求助
控制台能正常输出所有日志消息,但指定文件无任何内容。尝试过移除property配置、硬编码路径、调整配置文件位置等操作,均未解决问题。
初始logback.xml配置
<?xml version="1.0" encoding="UTF-8"?> <Configuration debug="true"> <property name="LOG_DIR" value="${application.home}}/src/main/resources/Logging" /> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <layout class="ch.qos.logback.classic.PatternLayout"> <Pattern>%d{"yyyy-MM-dd HH:mm:ss"} %-5level %file:%line - %msg%n</Pattern> </layout> </appender> <appender name="FILE" class="ch.qos.logback.core.FileAppender"> <file>"${LOG_DIR}/jLoggerFX.log"</file> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <Pattern>%d{"yyyy-MM-dd HH:mm:ss"} %-5level %file:%line - %msg%n</Pattern> </encoder> </appender> <root level="TRACE"> <appender-ref ref="FILE" /> </root> <root level="INFO"> <appender-ref ref="FILE" /> </root> <root level="DEBUG"> <appender-ref ref="FILE" /> </root> <root level="WARN"> <appender-ref ref="FILE" /> </root> <root level="ERROR"> <appender-ref ref="FILE" /> </root> <logger name="default" level="INFO" additivity="true"> <appender-ref ref="FILE"/> </logger> <logger name="mainlogger" level="INFO" additivity="true"> <appender-ref ref="FILE"/> </logger> <logger name="maplogger" level="INFO" additivity="true"> <appender-ref ref="FILE"/> </logger> </Configuration>
日志调用代码(MainController.java)
import org.slf4j.Logger; import org.slf4j.LoggerFactory; . . . private Logger mainlogger; . . . mainlogger = ((Logger) LoggerFactory.getLogger(MainController.class)); ... String msg; msg = "MainController::initialize 296: err="; msg += e.getMessage(); mainlogger.info(msg);
环境信息
- JAVAFX SDK 17 (Zulu)
- 项目:NetBeans 19 MAVEN
- 操作系统:Linux Mint LMDE 6
更新后的配置文件
将配置文件移至项目根目录(与pom.xml、ini文件同目录),内容如下:
<?xml version="1.0" encoding="UTF-8"?> <configuration> <variable> name="FILE_NAME value="/home/ken/bin/logs/jLoggerFX.log" </variable> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <!-- encoders are assigned the type ch.qos.logback.classic.encoder.PatternLayoutEncoder by default --> <encoder> <pattern> %level %d{HH:mm:ss.SSS} %logger{36} -%kvp- %msg%n </pattern> </encoder> </appender> <appender name="FILEOUT" class="ch.qos.logback.core.FileAppender"> <file>${FILE_NAME}</file> <encoder> <pattern> %level %d{"yyyy-MM-dd HH:mm:ss"} %file:%line -%kvp- %msg%n </pattern> </encoder> </appender> <logger name="com" level="ALL" additivity="true"> <appender-ref ref="FILEOUT"/> </logger> <logger name="com.ad5xj" level="ALL" additivity="true"> <appender-ref ref="FILEOUT"/> </logger> <logger name="com.ad5xj.JLoggerFX" level="ALL" additivity="true"> <appender-ref ref="FILEOUT"/> </logger> <logger name="com.ad5xj.GUI.MapViewController" level="ALL" additivity="true"> <appender-ref ref="FILEOUT"/> </logger> <root level="DEBUG"> <appender-ref ref="STDOUT" /> </root> </configuration>
排查步骤及解决方案
修复配置文件语法错误
更新后的配置里<variable>标签存在两处错误:一是Logback定义变量用<property>而非<variable>;二是name="FILE_NAME缺少闭合引号。正确写法:<property name="FILE_NAME" value="/home/ken/bin/logs/jLoggerFX.log" />语法错误会直接导致配置加载失败,文件路径无法解析。
检查文件路径权限与存在性
确认/home/ken/bin/logs/目录存在,且运行程序的用户拥有读写权限。Linux下可执行命令快速创建并授权:mkdir -p /home/ken/bin/logs && chmod 755 /home/ken/bin/logs修正初始配置中的路径问题
- 初始配置里
${application.home}}多了一个闭合大括号,应改为${application.home}; src/main/resources/是源码目录,运行时程序不建议往该目录写文件,建议改用项目根目录下的日志目录:<property name="LOG_DIR" value="${user.dir}/logs" />;<file>"${LOG_DIR}/jLoggerFX.log"</file>中的引号要移除,Logback会自动处理路径,带引号会生成无效路径。
- 初始配置里
简化Logger配置
- 不要重复定义多个
<root>标签,Logback仅会生效最后一个,正确写法是在单个root标签内添加多个appender:<root level="TRACE"> <appender-ref ref="CONSOLE" /> <appender-ref ref="FILE" /> </root> - Logger名称要对应实际类的包路径,比如
MainController属于com.ad5xj.JLoggerFX.GUI包,无需单独定义mainlogger这类自定义名称的Logger,SLF4J会自动匹配包路径对应的配置。
- 不要重复定义多个
开启Logback调试模式
在<configuration>标签添加debug="true",启动程序时会输出Logback加载日志,可查看配置是否加载成功、文件路径是否正确、appender是否初始化等关键信息,快速定位问题。确保配置文件在类路径中
Maven项目默认将src/main/resources下的文件打包到类路径,若将配置文件放在项目根目录,需在pom.xml中添加资源目录配置:<build> <resources> <resource> <directory>${project.basedir}</directory> <includes> <include>logback.xml</include> </includes> </resource> </resources> </build>
内容的提问来源于stack exchange,提问作者AD5XJ
相关产品推荐
相关产品推荐

