Logging 删除Rust中的调试宏
我正在编写一个应用程序,它在执行过程中使用slog记录多个事件。因此,我广泛使用Logging 删除Rust中的调试宏,logging,rust,rust-cargo,Logging,Rust,Rust Cargo,我正在编写一个应用程序,它在执行过程中使用slog记录多个事件。因此,我广泛使用信息,错误,警告和调试宏 然而,正如预期的那样,调试调用帮助我调试应用程序,我不希望这些调用在实际使用应用程序时污染日志 我一直试图把它们汇编起来,但没有成功。这是我正在使用的一行:RUSTFLAGS=“$RUSTFLAGS-C debug assertions”cargo build--release 编译进行得很顺利,但在执行时我看到了所有调试调用 以下是我的问题的工作示例: Cargo.toml: [depen
信息代码>,错误代码>,警告代码>和调试代码>宏
然而,正如预期的那样,调试代码>调用帮助我调试应用程序,我不希望这些调用在实际使用应用程序时污染日志
我一直试图把它们汇编起来,但没有成功。这是我正在使用的一行:RUSTFLAGS=“$RUSTFLAGS-C debug assertions”cargo build--release
编译进行得很顺利,但在执行时我看到了所有调试调用
以下是我的问题的工作示例:
Cargo.toml:
[dependencies]
slog = { version = "1.5", features = ["max_level_trace", "release_max_level_warn"] }
slog-stream = "1.2.0"
slog-term = "1.5.0"
slog-json = "1.2.1"
slog-stdlog = "1.1.0"
log = "0.3.7"
main.rs:
#[macro_use]
extern crate slog;
extern crate slog_stream;
extern crate slog_term;
extern crate slog_json;
extern crate slog_stdlog;
#[macro_use]
extern crate log;
use std::path::Path;
use std::fs::OpenOptions;
use slog::DrainExt;
fn init_logger(work_dir : &Path) {
let mut log_dir_buf = work_dir.to_path_buf();
log_dir_buf.push("log");
if !log_dir_buf.exists() {
std::fs::create_dir(log_dir_buf.as_path()).unwrap();
}
log_dir_buf.push("the_log_file.log");
let log_file_name = log_dir_buf.to_str().unwrap();
let log_file = OpenOptions::new()
.create(true)
.write(true)
.truncate(true)
.open(log_file_name).unwrap();
let console_drain = slog_term::streamer().build();
let file_drain = slog_stream::stream(log_file, slog_json::default());
let logger = slog::Logger::root(slog::duplicate(console_drain, file_drain).fuse(), o!());
slog_stdlog::set_logger(logger).unwrap();
}
fn main() {
init_logger(Path::new("."));
info!("This is an info message");
warn!("This is a warn message");
error!("This is an error message");
debug!("This is a debug message");
}
现在,如上所述构建发布版本并运行二进制文件,我得到以下输出:
Jan 23 17:20:56.640 INFO This is an info message
Jan 23 17:20:56.641 WARN This is a warn message
Jan 23 17:20:56.641 ERRO This is an error message
Jan 23 17:20:56.641 DEBG This is a debug message
最后,生锈版本:
rustc 1.31.0(abe02cefd 2018-12-04)
我知道我使用的slog版本很旧,但是升级依赖项目前不是优先考虑的。然而,正如@shepmaster在中所描述的,日志过滤应该是可能的,这似乎对我不起作用。我遗漏了什么?可能对你的情况有所帮助
根据上面链接的文件
调用debug代码>和跟踪只有在config.toml
您是否检查了config.toml文件以查看debug assertions
是否设置为yes?使用slog
cratecodegen选项来区分“发布”版本和“调试”版本。因此,通过启用debug断言
(通过RUSTFLAGS
将-C debug断言
传递给编译器),slog
不考虑release\u max\u level.*
特性标志
调试断言
在发布版本中默认是禁用的,因此如果您不是有意启用调试断言
,请不要将该标志传递给编译器。另外请注意,您可以通过inCargo.toml
启用或禁用调试断言,为了简化问题,我使用当前版本的slog(2.4.1)制作了另一个工作示例,该版本设置了一个全局范围记录器,问题仍然会重现。以下是代码示例:
extern crate slog;
extern crate slog_async;
extern crate slog_json;
extern crate slog_term;
extern crate slog_scope;
extern crate slog_stdlog;
#[macro_use]
extern crate log;
fn complex_logging() -> Result<(), log::SetLoggerError> {
//Create the output file
let log_path = "your_log_file_path.log";
let file = OpenOptions::new()
.create(true)
.write(true)
.truncate(true)
.open(log_path)
.unwrap();
//Create the terminal drain
let decorator = slog_term::TermDecorator::new().build();
let d1 = slog_term::FullFormat::new(decorator).build().fuse();
let d1 = slog_async::Async::new(d1).build().fuse();
//Create the file drain
let d2 = slog_json::Json::new(file)
.add_default_keys()
.build()
.fuse();
let d2 = slog_async::Async::new(d2).build().fuse();
//Fuse the drains and create the logger
let logger = slog::Logger::root(slog::Duplicate::new(d1, d2).fuse(), o!());
let _guard = slog_scope::set_global_logger(logger);
//register slog_stdlog as the log handler with the log crate
slog_stdlog::init().unwrap();
trace!("logging a trace message");
debug!("debug values \"x\" => 1, \"y\" => -1");
info!("some interesting info; where => right here");
warn!("be cautious!; why => you never know...");
error!("wrong, foobar; type => unknown");
Ok(())
}
fn main() {
let _res = complex_logging();
}
然而,一个新的例子解决了这个问题。以下是工作示例:
#[macro_use]
extern crate slog;
extern crate slog_async;
extern crate slog_json;
extern crate slog_term;
extern crate slog_scope;
extern crate slog_stdlog;
use slog::Drain;
use std::fs::OpenOptions;
use std::io;
use std::sync::Mutex;
fn duplicate_log() {
let plain = slog_term::PlainSyncDecorator::new(std::io::stdout());
let d1 = slog_term::FullFormat::new(plain).build().fuse();
let d2 = Mutex::new(slog_json::Json::default(io::stdout())).fuse();
let log = slog::Logger::root(slog::Duplicate::new(d1, d2).fuse(), o!("version" => env!("CARGO_PKG_VERSION")));
trace!(log, "logging a trace message");
debug!(log, "debug values"; "x" => 1, "y" => -1);
info!(log, "some interesting info"; "where" => "right here");
warn!(log, "be cautious!"; "why" => "you never know...");
error!(log, "wrong {}", "foobar"; "type" => "unknown");
crit!(log, "abandoning test");
}
fn main() {
duplicate_log();
}
运行工作示例会产生以下结果:
Jan 30 13:56:30.839信息一些有趣的信息,其中:就在这里,版本:0.1.0
{“msg”:“一些有趣的信息”,“级别”:“信息”,“ts”:“2019-01-30T13:56:30.839762+00:00”,“版本”:“0.1.0”,“位置”:“就在这里”}
1月30日13:56:30.839警告小心!,原因:你永远不知道…,版本:0.1.0
{“msg”:“小心!”,“级别”:“警告”,“ts”:“2019-01-30T13:56:30.839787+00:00”,“版本”:“0.1.0”,“原因”:“你永远不知道…”
Jan 30 13:56:30.839错误的foobar,类型:未知,版本:0.1.0
{“msg”:“错误的foobar”,“级别”:“ERRO”,“ts”:“2019-01-30T13:56:30.839802+00:00”,“版本”:“0.1.0”,“类型”:“未知”}
一月30日13:56:30.839爆击放弃测试,版本:0.1.0
{“msg”:“放弃测试”,“等级”:“CRIT”,“ts”:“2019-01-30T13:56:30.839815+00:00”,“版本”:“0.1.0”}
如果您遇到与我类似的问题,我的问题是设置全局范围记录器。传阅记录者解决了这个问题。感谢@PeterHall链接的可能副本。尝试了提供的解决方案,但仍然不起作用。编辑了我的问题并提供了更多详细信息。谢谢您的回答。我认为这在本例中没有帮助,因为这与我观察到的行为相反(我希望调试调用消失),而且本指南专门针对rustc编译器。事实上,config.toml
特定于rustc的构建系统。谢谢你的回答,@Francis。我以前也试过不通过这个标志,只是货物构建-发布
。调试消息仍然显示。