按文档实现log4rs写入日志文件时遇NotFound错误求助
首先看你遇到的NotFound错误,原因很简单:程序运行的工作目录和你的文件位置不匹配。当你用cargo run启动程序时,默认的工作目录是你的Rust项目根目录(也就是和src文件夹同级的那个目录),但你把log4rs.yml和requests.log都放在了src文件夹里,程序自然找不到这些文件。
第一步:修复文件找不到的错误
你有两种选择:
选项1:移动文件位置
把log4rs.yml和requests.log从src文件夹里移出来,放到项目根目录(和src同级)。这样不用改任何代码和配置,程序就能正常找到配置文件,也能正确写入日志到requests.log。
选项2:修改路径配置
如果你想保留文件在src里,需要修改两处:
- 修改
main.rs里的初始化代码,指定配置文件的正确路径:log4rs::init_file("src/log4rs.yml", Default::default()).unwrap(); - 修改
log4rs.yml里的requestsappender路径: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

