- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写一个应用程序,它在执行期间使用 slog 记录多项内容。因此,我广泛使用了 info!
、error!
、warn!
和 debug!
宏。
但是,正如预期的那样,debug!
调用可以帮助我调试应用程序,我不希望这些调用在实际使用应用程序时污染日志。
我一直在尝试编译它们,但没有成功。这是我正在使用的行: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"
主要.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
最后,rust 版本:rustc 1.31.0 (abe02cefd 2018-12-04)
我知道我使用的 slog 版本很旧,但目前升级依赖不是当务之急。然而,version's documentation指出日志过滤应该是可能的,正如@shepmaster 在 linked answer 中描述的那样,它似乎对我不起作用。我错过了什么?
最佳答案
为了简化问题,我使用当前版本的 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();
}
在构建发布后运行上面的示例会产生以下结果:
Jan 30 13:53:52.398 TRCE logging a trace message
Jan 30 13:53:52.399 DEBG debug values "x" => 1, "y" => -1
Jan 30 13:53:52.399 INFO some interesting info; where => right here
Jan 30 13:53:52.399 WARN be cautious!; why => you never know...
Jan 30 13:53:52.399 ERRO wrong, foobar; type => unknown
但是,一个传递记录器的新示例解决了这个问题。这是工作示例:
#[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 INFO some interesting info, where: right here, version: 0.1.0
{"msg":"some interesting info","level":"INFO","ts":"2019-01-30T13:56:30.839762+00:00","version":"0.1.0","where":"right here"}
Jan 30 13:56:30.839 WARN be cautious!, why: you never know..., version: 0.1.0
{"msg":"be cautious!","level":"WARN","ts":"2019-01-30T13:56:30.839787+00:00","version":"0.1.0","why":"you never know..."}
Jan 30 13:56:30.839 ERRO wrong foobar, type: unknown, version: 0.1.0
{"msg":"wrong foobar","level":"ERRO","ts":"2019-01-30T13:56:30.839802+00:00","version":"0.1.0","type":"unknown"}
Jan 30 13:56:30.839 CRIT abandoning test, version: 0.1.0
{"msg":"abandoning test","level":"CRIT","ts":"2019-01-30T13:56:30.839815+00:00","version":"0.1.0"}
如果您遇到与我类似的问题,我的问题是设置全局范围记录器。传递记录器解决了这个问题。
关于logging - 在 Rust 中删除调试宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54330249/
不同的 LogCat 方法是: Log.v(); // Verbose Log.d(); // Debug Log.i(); // Info Log.w(); // Warning Log.e();
在android群里,经常会有人问我,android log是怎么用的,今天我就把从网上以及sdk里东拼西凑过来,让大家先一睹为快,希望对大家入门android log有一定的帮助. android
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 4 年前。 社区 12
我正在尝试使用 sonarlint 检查代码质量.上面的问题概要,我不明白为什么它要说要大写。但是 this discussion与上述建议相反。哪一个应该被认为是正确的? 最佳答案 这没有正确答案,
随着 n 变大,log*(log n) 和 log(log* n) 这两个函数会更快吗? 这里,log* 函数是迭代对数,定义如下: 我怀疑它们是相同的,只是写法不同,但它们之间有什么区别吗? 最佳答
作为家庭作业,我被要求在 O(log(n)) 中编写一个算法,我可以计算出我编写的算法的复杂度为 O(log(n) + log(n/2) + log(n/4) + log(n/8) + ... + l
我正在使用 Tomee。日志文件夹包含这样的文件 localhost_access_log.2016-12-02.txt localhost.2016-12-02.log catalina.2016-
Android Log.v、Log.d、Log.i、Log.e 等的 ios 等效项是什么?同样在 android 上,我使用 Android 设备监视器和 logcat 来访问我的手机日志,我需要在
我认为下面的代码是 O(log log n) 因为它里面有 i*i 但我对 log n 感到困惑> 和 log (log n)。 for (i=2; i*i<=number; i++) { if
我正在修改 kvm 模块,并在内核代码中添加了 printk 语句。运行虚拟机后,printk 为我提供了错误地址和有关 guest 操作系统的其他信息。 我需要从这个信息中生成统计信息。当我使用 d
我有一个部署为 Windows Azure Web 角色的 WCF 服务。 我正在使用 Enterprise Library 进行异常处理,并且在我的本地 Development Fabric 中,似
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 9 年前。 Improv
在 Go 的生产中使用 log.SetFlags(log.LstdFlags | log.Lshortfile) 是好的做法(至少是一般做法)吗?我想知道在生产中这样做是否存在性能或安全问题。因为它不
我想知道什么更快: double value = Math.log(a) - Math.log(b); 或 double value = Math.log(a/b); 我计算值的方式是否会对性能产生影
我有数百个子例程使用 log.Println() 写入日志文件 我正在使用 log.Println 写入 error.log 文件。 func main() { e, err := os.Open
我将 Nuxt 与 SSR 一起使用,并希望有类似于 apaches 的 access.log 和 error.log 的东西 我特别感兴趣的是每次调用的响应时间。 我在 nuxt 文档中找不到任何内
我知道以前有人问过这个问题,但我相信这是一个不同的问题。 Nginx 在 www-data 下运行: $ ps -eo "%U %G %a" | grep nginx root root
我在我的日志文件中发现了一个非常奇怪的条目 Jan 29 01:35:30 vs-proj-handy sshd[5316]: Received disconnect from 130.207.203
对于我正在开发的应用程序,我希望在开发过程中和发布时简化故障排除。我希望能够检索到对 Log 的调用,以了解在 USB 调试中没有连接手机的情况下运行应用程序时的调用,以便可以检索并发送给我。例如,当
我试图捕获 panic 并记录错误: func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloRep
我是一名优秀的程序员,十分优秀!