J'écris une application qui utilise slog pour enregistrer plusieurs choses lors de son exécution. En tant que tel, j'utilise largement les macros info!
, error!
, warn!
et debug!
.
Cependant, comme prévu, les appels debug!
sont là pour m'aider à déboguer les applications et je ne veux pas que ces appels polluent les journaux lors de l'utilisation réelle de l'application.
J'ai essayé de les compiler sans succès. Voici la ligne que j'utilise: RUSTFLAGS = "$ RUSTFLAGS -C debug-assertions" cargo build --release
La compilation se déroule bien, mais à l'exécution je vois tous les appels de débogage.
Ce qui suit est un exemple fonctionnel de mon problème:
Cargo.toml:
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
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"); }
Maintenant, en construisant une version finale comme indiqué ci-dessus et en exécutant le binaire, j'obtiens la sortie suivante:
[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"
Enfin, version rouille:
rustc 1.31.0 (abe02cefd 2018-12-04)
Je sais que la version de slog que j'utilise est ancienne, mais la mise à jour de la dépendance n'est pas une priorité pour le moment . Cependant, la documentation de la version indique que le filtrage des journaux devrait être possible car @shepmaster décrit dans le réponse liée , cela ne semble tout simplement pas fonctionner pour moi. Que me manque-t-il?
3 Réponses :
Ce lien peut être utile dans votre situation.
Selon la documentation liée ci-dessus,
les appels à
debug!
ettrace!
ne sont inclus dans le programme que sidebug-assertions = yes
est activé dans config.toml
Avez-vous vérifié votre fichier config.toml pour voir si debug-assertions
est défini sur yes?
Merci pour votre réponse. Je pense que cela n'est pas utile dans ce cas, car c'est le contraire du comportement que j'observe (je veux que les appels de débogage disparaissent), et ce guide est spécifique à la contribution au compilateur rustc.
En effet, config.toml
est spécifique au système de construction de rustc.
Le slog
crate s'appuie sur l'option codegen debug-assertions
pour faire la distinction entre les versions" release "et" debug ". Ainsi, en activant debug-assertions
(en passant -C debug-assertions
au compilateur via RUSTFLAGS
), slog code > ne prend pas en compte les indicateurs de fonctionnalité
release_max_level_ *
.
Les debug-assertions
sont désactivées par défaut dans les versions de version, donc si vous ne vouliez pas activer debug-assertions
, ne passez simplement pas cet indicateur au compilateur. Notez également que vous pouvez activer ou désactiver les debug-assertions
via les [profile. *]
sections dans Cargo.toml
.
Merci pour votre réponse, @Francis. J'ai également essayé de ne pas passer le drapeau avant, juste cargo build --release
. Le message de débogage
s'affiche toujours.
Afin de simplifier le problème, j'ai créé un autre exemple de travail avec la version actuelle de slog (2.4.1) qui définissait un enregistreur de portée globale et le problème toujours reproduit. Voici l'exemple de code:
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"}
L'exécution de l'exemple ci-dessus après la construction pour la publication donne ce résultat:
#[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(); }
Cependant, un nouvel exemple qui passe les bûcherons corrige le problème. Voici l'exemple de travail:
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
L'exécution de l'exemple de travail donne le résultat suivant:
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(); }
Si vous rencontrez un problème similaire à celui que j'ai fait, mon problème était de configurer un enregistreur global de portée . Faire circuler les enregistreurs résout ce problème.
Le double possible de est est-il possible de modifier le niveau de journalisation d'une application au moment de la compilation?
Merci pour le lien @PeterHall. J'ai essayé la solution fournie et cela ne fonctionne toujours pas. J'ai édité ma question avec plus de détails.