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

按文档实现log4rs写入日志文件时遇NotFound错误求助

解决log4rs的NotFound错误及日志写入问题

首先看你遇到的NotFound错误,原因很简单:程序运行的工作目录和你的文件位置不匹配。当你用cargo run启动程序时,默认的工作目录是你的Rust项目根目录(也就是和src文件夹同级的那个目录),但你把log4rs.yml和requests.log都放在了src文件夹里,程序自然找不到这些文件。

第一步:修复文件找不到的错误

你有两种选择:

选项1:移动文件位置

把log4rs.yml和requests.log从src文件夹里移出来,放到项目根目录(和src同级)。这样不用改任何代码和配置,程序就能正常找到配置文件,也能正确写入日志到requests.log。

选项2:修改路径配置

如果你想保留文件在src里,需要修改两处:

  1. 修改main.rs里的初始化代码,指定配置文件的正确路径:
    log4rs::init_file("src/log4rs.yml", Default::default()).unwrap();
    
  2. 修改log4rs.yml里的requests appender路径:
    requests:
      kind: file
      path: "src/requests.log"
      encoder:
        pattern: "{d} - {m}{n}"
    

第二步:让info!("INFO")写入requests.log

解决了文件问题后,你会发现info!("INFO")还是不会写入requests.log——因为你的log4rs配置里,只有app::requests这个命名空间下的日志才会路由到requests appender,而你的info!调用是在根模块(main.rs里),属于根logger的范围,而根logger的级别是warn,并且只绑定了stdout appender。

要实现你的目标,你可以选下面一种方式:

方式1:调整根logger配置

把根logger的级别改成info,并把requests appender添加到根logger里:

root:
  level: info
  appenders:
    - stdout
    - requests

这样所有级别≥info的日志,都会同时输出到控制台和requests.log。

方式2:把日志放到指定命名空间下

修改main.rs,把代码放到app::requests模块里:

#[macro_use] extern crate log;
extern crate log4rs;

mod app {
    pub mod requests {
        pub fn log_info() {
            info!("INFO");
        }
    }
}

fn main() {
    println!("Hello, world!");
    log4rs::init_file("log4rs.yml", Default::default()).unwrap();
    app::requests::log_info();
}

这样info!调用就属于app::requests命名空间,会被你的配置里的app::requestslogger捕获,写入requests.log,并且不会输出到控制台(因为你设置了additive: false)。

最后验证

做完上面的修改后,运行cargo run,你应该能看到Hello, world!输出到控制台,同时requests.log里会出现类似2024-05-20T12:34:56.789 - INFO的日志内容。

内容的提问来源于stack exchange,提问作者somesingsomsing

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:05:21