@smbcloud / cli / commits / 951c489

Add log level

Seto Elkahfi committed Feb 19, 2023 at 16:33 UTC 951c489eb333aaeb656c8b95303136f8ecf3d85c
5 files changed +257 -2
.gitignore
+1
@@ -1 +1,2 @@
1 /target
2 +*.log
\ No newline at end of file
Cargo.lock
+198
@@ -2,6 +2,18 @@
2 # It is not intended for manual editing.
3 version = 3
4
5 +[[package]]
6 +name = "ahash"
7 +version = "0.8.3"
8 +source = "registry+https://github.com/rust-lang/crates.io-index"
9 +checksum = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f"
10 +dependencies = [
11 + "cfg-if",
12 + "getrandom",
13 + "once_cell",
14 + "version_check",
15 +]
16 +
17 [[package]]
18 name = "anyhow"
19 version = "1.0.69"
@@ -230,6 +242,27 @@ dependencies = [
242 "pin-utils",
243 ]
244
245 +[[package]]
246 +name = "gethostname"
247 +version = "0.2.3"
248 +source = "registry+https://github.com/rust-lang/crates.io-index"
249 +checksum = "c1ebd34e35c46e00bb73e81363248d627782724609fe1b6396f553f68fe3862e"
250 +dependencies = [
251 + "libc",
252 + "winapi",
253 +]
254 +
255 +[[package]]
256 +name = "getrandom"
257 +version = "0.2.8"
258 +source = "registry+https://github.com/rust-lang/crates.io-index"
259 +checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31"
260 +dependencies = [
261 + "cfg-if",
262 + "libc",
263 + "wasi",
264 +]
265 +
266 [[package]]
267 name = "h2"
268 version = "0.3.15"
@@ -456,6 +489,15 @@ dependencies = [
489 "cfg-if",
490 ]
491
492 +[[package]]
493 +name = "matchers"
494 +version = "0.1.0"
495 +source = "registry+https://github.com/rust-lang/crates.io-index"
496 +checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558"
497 +dependencies = [
498 + "regex-automata",
499 +]
500 +
501 [[package]]
502 name = "memchr"
503 version = "2.5.0"
@@ -498,6 +540,16 @@ dependencies = [
540 "tempfile",
541 ]
542
543 +[[package]]
544 +name = "nu-ansi-term"
545 +version = "0.46.0"
546 +source = "registry+https://github.com/rust-lang/crates.io-index"
547 +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84"
548 +dependencies = [
549 + "overload",
550 + "winapi",
551 +]
552 +
553 [[package]]
554 name = "num_cpus"
555 version = "1.15.0"
@@ -565,6 +617,12 @@ version = "6.4.1"
617 source = "registry+https://github.com/rust-lang/crates.io-index"
618 checksum = "9b7820b9daea5457c9f21c69448905d723fbd21136ccf521748f23fd49e723ee"
619
620 +[[package]]
621 +name = "overload"
622 +version = "0.1.1"
623 +source = "registry+https://github.com/rust-lang/crates.io-index"
624 +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39"
625 +
626 [[package]]
627 name = "parking_lot"
628 version = "0.12.1"
@@ -663,6 +721,30 @@ dependencies = [
721 "bitflags",
722 ]
723
724 +[[package]]
725 +name = "regex"
726 +version = "1.7.1"
727 +source = "registry+https://github.com/rust-lang/crates.io-index"
728 +checksum = "48aaa5748ba571fb95cd2c85c09f629215d3a6ece942baa100950af03a34f733"
729 +dependencies = [
730 + "regex-syntax",
731 +]
732 +
733 +[[package]]
734 +name = "regex-automata"
735 +version = "0.1.10"
736 +source = "registry+https://github.com/rust-lang/crates.io-index"
737 +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132"
738 +dependencies = [
739 + "regex-syntax",
740 +]
741 +
742 +[[package]]
743 +name = "regex-syntax"
744 +version = "0.6.28"
745 +source = "registry+https://github.com/rust-lang/crates.io-index"
746 +checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848"
747 +
748 [[package]]
749 name = "remove_dir_all"
750 version = "0.5.3"
@@ -810,6 +892,15 @@ dependencies = [
892 "serde",
893 ]
894
895 +[[package]]
896 +name = "sharded-slab"
897 +version = "0.1.4"
898 +source = "registry+https://github.com/rust-lang/crates.io-index"
899 +checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31"
900 +dependencies = [
901 + "lazy_static",
902 +]
903 +
904 [[package]]
905 name = "signal-hook-registry"
906 version = "1.4.1"
@@ -844,6 +935,9 @@ dependencies = [
935 "reqwest",
936 "serde",
937 "tokio",
938 + "tracing",
939 + "tracing-bunyan-formatter",
940 + "tracing-subscriber",
941 ]
942
943 [[package]]
@@ -896,6 +990,43 @@ dependencies = [
990 "winapi-util",
991 ]
992
993 +[[package]]
994 +name = "thread_local"
995 +version = "1.1.7"
996 +source = "registry+https://github.com/rust-lang/crates.io-index"
997 +checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152"
998 +dependencies = [
999 + "cfg-if",
1000 + "once_cell",
1001 +]
1002 +
1003 +[[package]]
1004 +name = "time"
1005 +version = "0.3.19"
1006 +source = "registry+https://github.com/rust-lang/crates.io-index"
1007 +checksum = "53250a3b3fed8ff8fd988587d8925d26a83ac3845d9e03b220b37f34c2b8d6c2"
1008 +dependencies = [
1009 + "itoa",
1010 + "serde",
1011 + "time-core",
1012 + "time-macros",
1013 +]
1014 +
1015 +[[package]]
1016 +name = "time-core"
1017 +version = "0.1.0"
1018 +source = "registry+https://github.com/rust-lang/crates.io-index"
1019 +checksum = "2e153e1f1acaef8acc537e68b44906d2db6436e2b35ac2c6b42640fff91f00fd"
1020 +
1021 +[[package]]
1022 +name = "time-macros"
1023 +version = "0.2.7"
1024 +source = "registry+https://github.com/rust-lang/crates.io-index"
1025 +checksum = "a460aeb8de6dcb0f381e1ee05f1cd56fcf5a5f6eb8187ff3d8f0b11078d38b7c"
1026 +dependencies = [
1027 + "time-core",
1028 +]
1029 +
1030 [[package]]
1031 name = "tinyvec"
1032 version = "1.6.0"
@@ -979,8 +1110,39 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
1110 checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8"
1111 dependencies = [
1112 "cfg-if",
1113 + "log",
1114 "pin-project-lite",
1115 + "tracing-attributes",
1116 + "tracing-core",
1117 +]
1118 +
1119 +[[package]]
1120 +name = "tracing-attributes"
1121 +version = "0.1.23"
1122 +source = "registry+https://github.com/rust-lang/crates.io-index"
1123 +checksum = "4017f8f45139870ca7e672686113917c71c7a6e02d4924eda67186083c03081a"
1124 +dependencies = [
1125 + "proc-macro2",
1126 + "quote",
1127 + "syn",
1128 +]
1129 +
1130 +[[package]]
1131 +name = "tracing-bunyan-formatter"
1132 +version = "0.3.6"
1133 +source = "registry+https://github.com/rust-lang/crates.io-index"
1134 +checksum = "78fa7c4b548e5c79a0300396f36f175da001e9933dfb5960b326db25fddbaee7"
1135 +dependencies = [
1136 + "ahash",
1137 + "gethostname",
1138 + "log",
1139 + "serde",
1140 + "serde_json",
1141 + "time",
1142 + "tracing",
1143 "tracing-core",
1144 + "tracing-log",
1145 + "tracing-subscriber",
1146 ]
1147
1148 [[package]]
@@ -990,6 +1152,36 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
1152 checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a"
1153 dependencies = [
1154 "once_cell",
1155 + "valuable",
1156 +]
1157 +
1158 +[[package]]
1159 +name = "tracing-log"
1160 +version = "0.1.3"
1161 +source = "registry+https://github.com/rust-lang/crates.io-index"
1162 +checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922"
1163 +dependencies = [
1164 + "lazy_static",
1165 + "log",
1166 + "tracing-core",
1167 +]
1168 +
1169 +[[package]]
1170 +name = "tracing-subscriber"
1171 +version = "0.3.16"
1172 +source = "registry+https://github.com/rust-lang/crates.io-index"
1173 +checksum = "a6176eae26dd70d0c919749377897b54a9276bd7061339665dd68777926b5a70"
1174 +dependencies = [
1175 + "matchers",
1176 + "nu-ansi-term",
1177 + "once_cell",
1178 + "regex",
1179 + "sharded-slab",
1180 + "smallvec",
1181 + "thread_local",
1182 + "tracing",
1183 + "tracing-core",
1184 + "tracing-log",
1185 ]
1186
1187 [[package]]
@@ -1036,6 +1228,12 @@ dependencies = [
1228 "percent-encoding",
1229 ]
1230
1231 +[[package]]
1232 +name = "valuable"
1233 +version = "0.1.0"
1234 +source = "registry+https://github.com/rust-lang/crates.io-index"
1235 +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d"
1236 +
1237 [[package]]
1238 name = "vcpkg"
1239 version = "0.2.15"
Cargo.toml
+4 -1
@@ -19,4 +19,7 @@ clap = { version = "4.1.6", features = ["derive"] }
19 console = "0.15.0"
20 reqwest = { version = "0.11", features = ["json"] }
21 serde = { version = "1", features = ["derive"] }
22 -tokio = { version = "1.14.1", features = ["full"] }
\ No newline at end of file
22 +tokio = { version = "1.14.1", features = ["full"] }
23 +tracing = { version = "0.1.35", features = ["log"] }
24 +tracing-bunyan-formatter = "0.3.3"
25 +tracing-subscriber = { version = "0.3.14", features = ["registry", "env-filter"] }
\ No newline at end of file
src/cli/mod.rs
+4
@@ -3,6 +3,10 @@ use clap::{Parser, Subcommand};
3 #[derive(Parser)]
4 #[clap(author, version, about)]
5 pub struct Cli {
6 + /// Log level: trace, debug, info, warn, error, off
7 + #[clap(short, long, global = true)]
8 + pub log_level: Option<String>,
9 +
10 #[clap(subcommand)]
11 pub command: Commands,
12 }
src/main.rs
+50 -1
@@ -1,9 +1,42 @@
1 -use anyhow::Result;
1 +use std::{fs::OpenOptions, path::PathBuf, str::FromStr};
2 +
3 +use anyhow::{anyhow, Result};
4 use clap::Parser;
5 use smbpndk_cli::{
6 cli::{Cli, Commands},
7 login::{process_login, LoginArgs},
8 };
9 +use tracing::subscriber::set_global_default;
10 +use tracing_bunyan_formatter::{BunyanFormattingLayer, JsonStorageLayer};
11 +use tracing_subscriber::{filter::LevelFilter, prelude::*, EnvFilter};
12 +
13 +fn setup_logging(level: Option<EnvFilter>) -> Result<()> {
14 + // Log in the current directory
15 + let log_path = PathBuf::from("smbpndk-cli.log");
16 +
17 + let file = OpenOptions::new()
18 + .create(true)
19 + .write(true)
20 + .open(log_path)
21 + .unwrap();
22 +
23 + let env_filter = if let Some(filter) = level {
24 + filter
25 + } else {
26 + EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new("trace"))
27 + };
28 +
29 + let formatting_layer = BunyanFormattingLayer::new("smb".into(), file);
30 + let level_filter = LevelFilter::from_str(&env_filter.to_string())?;
31 +
32 + let subscriber = tracing_subscriber::registry()
33 + .with(formatting_layer.with_filter(level_filter))
34 + .with(JsonStorageLayer);
35 +
36 + set_global_default(subscriber).expect("Failed to set global default subscriber");
37 +
38 + Ok(())
39 +}
40
41 #[tokio::main]
42 async fn main() {
@@ -20,6 +53,22 @@ async fn main() {
53
54 async fn run() -> Result<()> {
55 let cli = Cli::parse();
56 +
57 + let log_level_error: Result<()> = Err(anyhow!(
58 + "Invalid log level: {:?}.\n Valid levels are: trace, debug, info, warn, and error.",
59 + cli.log_level
60 + ));
61 +
62 + if let Some(user_filter) = cli.log_level {
63 + let filter = match EnvFilter::from_str(&user_filter) {
64 + Ok(filter) => filter,
65 + Err(_) => return log_level_error,
66 + };
67 + setup_logging(Some(filter))?;
68 + } else {
69 + setup_logging(None)?;
70 + }
71 +
72 match cli.command {
73 Commands::Login { username, password } => {
74 println!("Login: {}, {}", username, password);