diff --git a/Cargo.lock b/Cargo.lock index f258f58e..15fe4367 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2605,6 +2605,7 @@ dependencies = [ "hex", "hkdf", "lazy_static", + "log", "once_cell", "rand 0.9.2", "regex", diff --git a/Cargo.toml b/Cargo.toml index 402f9c6a..27277a30 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -98,6 +98,7 @@ rgb-strict-encoding = { version = "=1.0.0", default-features = false, features = "bitcoin", ] } rgb-strict-types = { version = "=1.0.0", default-features = false } +log = "0.4.29" [dev-dependencies] copy_dir = { version = "0.1.3", default-features = false } diff --git a/src/lib.rs b/src/lib.rs index 57d1f1eb..6f5faf2d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -287,7 +287,7 @@ use crate::{ DumbResolver, LOG_FILE, RgbRuntime, adjust_canonicalization, beneficiary_from_script_buf, from_str_or_number_mandatory, from_str_or_number_optional, get_account_xpubs, get_descriptors, get_descriptors_from_xpubs, load_rgb_runtime, now, parse_address_str, - setup_logger, str_to_xpub, + setup_logger, setup_stdout_logger, str_to_xpub, }, wallet::{ Balance, NUM_KNOWN_SCHEMAS, Outpoint, SCHEMA_ID_CFA, SCHEMA_ID_IFA, SCHEMA_ID_NIA, diff --git a/src/utils.rs b/src/utils.rs index efd67a05..edaf15b3 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -648,6 +648,17 @@ pub(crate) fn setup_logger>( Ok((logger, async_guard)) } +pub(crate) fn setup_stdout_logger() -> Result<(Logger, AsyncGuard), Error> { + let decorator = PlainDecorator::new(std::io::stdout()); + let drain = FullFormat::new(decorator) + .use_custom_timestamp(log_timestamp) + .use_file_location(); + let (drain, async_guard) = slog_async::Async::new(drain.build().fuse()).build_with_guard(); + let logger = Logger::root(drain.fuse(), o!()); + + Ok((logger, async_guard)) +} + pub(crate) fn now() -> OffsetDateTime { OffsetDateTime::now_utc() } diff --git a/src/wallet/offline.rs b/src/wallet/offline.rs index e2b09f95..e1c5bd5a 100644 --- a/src/wallet/offline.rs +++ b/src/wallet/offline.rs @@ -1006,7 +1006,7 @@ pub struct BlockTime { } /// The type of a transaction. -#[derive(Clone, Debug, Deserialize, Serialize)] +#[derive(Clone, Debug, Deserialize, Serialize, Eq, PartialEq, PartialOrd, Ord)] pub enum TransactionType { /// Transaction used to perform an RGB send RgbSend, @@ -1225,6 +1225,9 @@ pub struct WalletData { /// List of schemas the wallet should support (when issuing, sending and receiving). Empty list /// means the wallet should support all the schemas rgb-lib supports. pub supported_schemas: Vec, + /// Turn off writing logs to the file. + #[serde(default)] + pub disable_file_log: bool, } /// An RGB wallet. @@ -1287,7 +1290,13 @@ impl Wallet { fs::create_dir(wallet_dir.join(ASSETS_DIR))?; fs::create_dir(wallet_dir.join(MEDIA_DIR))?; } - let (logger, _logger_guard) = setup_logger(&wallet_dir, None)?; + + let (logger, _logger_guard) = if wallet_data.disable_file_log { + setup_logger(&wallet_dir, None)? + } else { + setup_stdout_logger()? + }; + info!(logger.clone(), "New wallet in '{:?}'", wallet_dir); let panic_logger = logger.clone(); let prev_hook = panic::take_hook(); @@ -1369,7 +1378,9 @@ impl Wallet { .min_connections(0) .connect_timeout(Duration::from_secs(8)) .idle_timeout(Duration::from_secs(8)) - .max_lifetime(Duration::from_secs(8)); + .max_lifetime(Duration::from_secs(8)) + .sqlx_logging(true) + .sqlx_logging_level(log::LevelFilter::Debug); let db_cnn = block_on(Database::connect(opt)); let connection = db_cnn.map_err(InternalError::from)?; block_on(Migrator::up(&connection, None)).map_err(InternalError::from)?; diff --git a/src/wallet/test/get_wallet_data.rs b/src/wallet/test/get_wallet_data.rs index f320f4c6..f7392e55 100644 --- a/src/wallet/test/get_wallet_data.rs +++ b/src/wallet/test/get_wallet_data.rs @@ -19,6 +19,7 @@ fn success() { master_fingerprint: keys.master_fingerprint.clone(), vanilla_keychain: Some(2), supported_schemas: AssetSchema::VALUES.to_vec(), + disable_file_log: false, }) .unwrap(); @@ -50,6 +51,7 @@ fn success() { master_fingerprint: keys.master_fingerprint.clone(), vanilla_keychain: None, supported_schemas: AssetSchema::VALUES.to_vec(), + disable_file_log: false, }) .unwrap(); let wallet_2_data = test_get_wallet_data(&wallet_2); diff --git a/src/wallet/test/inflate.rs b/src/wallet/test/inflate.rs index 1c63ce4c..81fdbdd8 100644 --- a/src/wallet/test/inflate.rs +++ b/src/wallet/test/inflate.rs @@ -376,6 +376,7 @@ fn fail() { master_fingerprint: keys.master_fingerprint.clone(), vanilla_keychain: None, supported_schemas: vec![AssetSchema::Nia, AssetSchema::Ifa], + disable_file_log: false, }) .unwrap(); let online_nia = wallet_nia @@ -419,6 +420,7 @@ fn fail() { master_fingerprint: keys.master_fingerprint.clone(), vanilla_keychain: None, supported_schemas: vec![AssetSchema::Nia], + disable_file_log: false, }) .unwrap(); let online_nia = wallet_nia diff --git a/src/wallet/test/new.rs b/src/wallet/test/new.rs index 6d483492..8f840d69 100644 --- a/src/wallet/test/new.rs +++ b/src/wallet/test/new.rs @@ -78,6 +78,7 @@ fn success() { master_fingerprint: keys.master_fingerprint, vanilla_keychain, supported_schemas: AssetSchema::VALUES.to_vec(), + disable_file_log: false, }) .unwrap(); check_wallet(&wallet, bitcoin_network, vanilla_keychain); @@ -167,6 +168,7 @@ fn mainnet_esplora_success() { master_fingerprint: keys.master_fingerprint.clone(), vanilla_keychain: None, supported_schemas: vec![AssetSchema::Cfa, AssetSchema::Nia, AssetSchema::Uda], + disable_file_log: false, }) .unwrap(); @@ -198,6 +200,7 @@ fn mainnet_electrum_success() { master_fingerprint: keys.master_fingerprint.clone(), vanilla_keychain: None, supported_schemas: vec![AssetSchema::Cfa, AssetSchema::Nia, AssetSchema::Uda], + disable_file_log: false, }) .unwrap(); @@ -366,6 +369,7 @@ fn watch_only_success() { master_fingerprint: keys.master_fingerprint.clone(), vanilla_keychain: None, supported_schemas: AssetSchema::VALUES.to_vec(), + disable_file_log: false, }) .unwrap(); let online_watch = wallet_watch @@ -384,6 +388,7 @@ fn watch_only_success() { master_fingerprint: keys.master_fingerprint.clone(), vanilla_keychain: None, supported_schemas: AssetSchema::VALUES.to_vec(), + disable_file_log: false, }) .unwrap(); @@ -438,6 +443,7 @@ fn watch_only_fail() { master_fingerprint: s!("invalid"), vanilla_keychain: None, supported_schemas: AssetSchema::VALUES.to_vec(), + disable_file_log: false, }); assert!(matches!(result, Err(Error::InvalidFingerprint))); } @@ -481,6 +487,7 @@ fn supported_schemas() { master_fingerprint: keys.master_fingerprint.clone(), vanilla_keychain: None, supported_schemas: vec![AssetSchema::Nia], + disable_file_log: false, }) .unwrap(); let online_nia = wallet_nia @@ -514,6 +521,7 @@ fn supported_schemas() { master_fingerprint: keys_rcv.master_fingerprint, vanilla_keychain: None, supported_schemas: vec![AssetSchema::Uda], + disable_file_log: false, }) .unwrap(); let rcv_online_uda = rcv_wallet_uda @@ -560,6 +568,7 @@ fn supported_schemas() { master_fingerprint: keys.master_fingerprint.clone(), vanilla_keychain: None, supported_schemas: vec![AssetSchema::Cfa], + disable_file_log: false, }) .unwrap(); let online_cfa = wallet_cfa @@ -592,6 +601,7 @@ fn supported_schemas() { master_fingerprint: keys.master_fingerprint, vanilla_keychain: None, supported_schemas: vec![], + disable_file_log: false, }); assert!(result.is_err()); if let Err(e) = result { @@ -612,6 +622,7 @@ fn supported_schemas() { master_fingerprint: keys_mainnet.master_fingerprint, vanilla_keychain: None, supported_schemas: vec![AssetSchema::Nia, AssetSchema::Ifa], + disable_file_log: false, }); // IFA on mainnet not allowed assert!(result.is_err()); diff --git a/src/wallet/test/utils/helpers.rs b/src/wallet/test/utils/helpers.rs index 8b42021e..fa460671 100644 --- a/src/wallet/test/utils/helpers.rs +++ b/src/wallet/test/utils/helpers.rs @@ -70,6 +70,7 @@ pub(crate) fn get_test_wallet_data( master_fingerprint: fingerprint.to_string(), vanilla_keychain: None, supported_schemas: AssetSchema::VALUES.to_vec(), + disable_file_log: false, } } @@ -97,6 +98,7 @@ pub(crate) fn get_test_wallet_with_net( master_fingerprint: keys.master_fingerprint, vanilla_keychain: None, supported_schemas: AssetSchema::VALUES.to_vec(), + disable_file_log: false, }) .unwrap(); println!("wallet directory: {:?}", test_get_wallet_dir(&wallet));