You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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>

排查步骤及解决方案

  1. 修复配置文件语法错误
    更新后的配置里<variable>标签存在两处错误:一是Logback定义变量用<property>而非<variable>;二是name="FILE_NAME缺少闭合引号。正确写法:

    <property name="FILE_NAME" value="/home/ken/bin/logs/jLoggerFX.log" />
    

    语法错误会直接导致配置加载失败,文件路径无法解析。

  2. 检查文件路径权限与存在性
    确认/home/ken/bin/logs/目录存在,且运行程序的用户拥有读写权限。Linux下可执行命令快速创建并授权:

    mkdir -p /home/ken/bin/logs && chmod 755 /home/ken/bin/logs
    
  3. 修正初始配置中的路径问题

    • 初始配置里${application.home}}多了一个闭合大括号,应改为${application.home};
    • src/main/resources/是源码目录,运行时程序不建议往该目录写文件,建议改用项目根目录下的日志目录:<property name="LOG_DIR" value="${user.dir}/logs" />;
    • <file>"${LOG_DIR}/jLoggerFX.log"</file>中的引号要移除,Logback会自动处理路径,带引号会生成无效路径。
  4. 简化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会自动匹配包路径对应的配置。
  5. 开启Logback调试模式
    在<configuration>标签添加debug="true",启动程序时会输出Logback加载日志,可查看配置是否加载成功、文件路径是否正确、appender是否初始化等关键信息,快速定位问题。

  6. 确保配置文件在类路径中
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 05:29:51