mirror of
https://github.com/comit-network/xmr-btc-swap.git
synced 2024-10-01 05:45:40 +00:00
Merge #397
397: Always log at debug level to file r=rishflab a=rishflab WILL SQUASH DOWN TO 3 COMMITS WHEN APPROVED! Log at debug level to file EnvFilter is applied globally. This means you cannot log at INFO level to the terminal and at DEBUG level to log files. To get a around this limitation I had to implement the layer trait on a new type and filter in the on_event() trait method. Each swap has its own log file denoted by its swap_id. The logger appends to the existing file when resuming a swap. Closes #278 I think the `DebugTerminalPritner` and `InfoTerminalPrinter` could be consolidated with some effort with some generics wizardry. It works for now and I think it can be done later. I wish in general there was a cleaner way to do this. Co-authored-by: rishflab <rishflab@hotmail.com>
This commit is contained in:
commit
2f19222948
23
Cargo.lock
generated
23
Cargo.lock
generated
@ -620,6 +620,7 @@ dependencies = [
|
|||||||
"libc",
|
"libc",
|
||||||
"num-integer",
|
"num-integer",
|
||||||
"num-traits",
|
"num-traits",
|
||||||
|
"time 0.1.43",
|
||||||
"winapi 0.3.9",
|
"winapi 0.3.9",
|
||||||
]
|
]
|
||||||
|
|
||||||
@ -722,6 +723,16 @@ dependencies = [
|
|||||||
"cfg-if 1.0.0",
|
"cfg-if 1.0.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "crossbeam-channel"
|
||||||
|
version = "0.5.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "dca26ee1f8d361640700bde38b2c37d8c22b3ce2d360e1fc1c74ea4b0aa7d775"
|
||||||
|
dependencies = [
|
||||||
|
"cfg-if 1.0.0",
|
||||||
|
"crossbeam-utils",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "crossbeam-epoch"
|
name = "crossbeam-epoch"
|
||||||
version = "0.9.3"
|
version = "0.9.3"
|
||||||
@ -3614,6 +3625,7 @@ dependencies = [
|
|||||||
"tokio-util",
|
"tokio-util",
|
||||||
"toml",
|
"toml",
|
||||||
"tracing",
|
"tracing",
|
||||||
|
"tracing-appender",
|
||||||
"tracing-futures",
|
"tracing-futures",
|
||||||
"tracing-subscriber",
|
"tracing-subscriber",
|
||||||
"url 2.2.1",
|
"url 2.2.1",
|
||||||
@ -3958,6 +3970,17 @@ dependencies = [
|
|||||||
"tracing-core",
|
"tracing-core",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "tracing-appender"
|
||||||
|
version = "0.1.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "9965507e507f12c8901432a33e31131222abac31edd90cabbcf85cf544b7127a"
|
||||||
|
dependencies = [
|
||||||
|
"chrono",
|
||||||
|
"crossbeam-channel",
|
||||||
|
"tracing-subscriber",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tracing-attributes"
|
name = "tracing-attributes"
|
||||||
version = "0.1.15"
|
version = "0.1.15"
|
||||||
|
@ -53,6 +53,7 @@ tokio-tungstenite = { version = "0.14", features = [ "rustls-tls" ] }
|
|||||||
tokio-util = { version = "0.6", features = ["io"] }
|
tokio-util = { version = "0.6", features = ["io"] }
|
||||||
toml = "0.5"
|
toml = "0.5"
|
||||||
tracing = { version = "0.1", features = ["attributes"] }
|
tracing = { version = "0.1", features = ["attributes"] }
|
||||||
|
tracing-appender = "0.1"
|
||||||
tracing-futures = { version = "0.2", features = ["std-future", "futures-03"] }
|
tracing-futures = { version = "0.2", features = ["std-future", "futures-03"] }
|
||||||
tracing-subscriber = { version = "0.2", default-features = false, features = ["fmt", "ansi", "env-filter", "chrono", "tracing-log"] }
|
tracing-subscriber = { version = "0.2", default-features = false, features = ["fmt", "ansi", "env-filter", "chrono", "tracing-log"] }
|
||||||
url = { version = "2", features = ["serde"] }
|
url = { version = "2", features = ["serde"] }
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
pub mod command;
|
pub mod command;
|
||||||
pub mod config;
|
pub mod config;
|
||||||
mod rate;
|
mod rate;
|
||||||
|
pub mod tracing;
|
||||||
|
|
||||||
pub use rate::Rate;
|
pub use rate::Rate;
|
||||||
|
@ -2,7 +2,7 @@ use anyhow::Result;
|
|||||||
use tracing_subscriber::filter::LevelFilter;
|
use tracing_subscriber::filter::LevelFilter;
|
||||||
use tracing_subscriber::FmtSubscriber;
|
use tracing_subscriber::FmtSubscriber;
|
||||||
|
|
||||||
pub fn init_tracing(level: LevelFilter) -> Result<()> {
|
pub fn init(level: LevelFilter) -> Result<()> {
|
||||||
if level == LevelFilter::OFF {
|
if level == LevelFilter::OFF {
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
@ -29,8 +29,7 @@ use swap::network::swarm;
|
|||||||
use swap::protocol::alice::event_loop::KrakenRate;
|
use swap::protocol::alice::event_loop::KrakenRate;
|
||||||
use swap::protocol::alice::{run, Behaviour, EventLoop};
|
use swap::protocol::alice::{run, Behaviour, EventLoop};
|
||||||
use swap::seed::Seed;
|
use swap::seed::Seed;
|
||||||
use swap::trace::init_tracing;
|
use swap::{asb, bitcoin, env, kraken, monero};
|
||||||
use swap::{bitcoin, env, kraken, monero};
|
|
||||||
use tracing::{info, warn};
|
use tracing::{info, warn};
|
||||||
use tracing_subscriber::filter::LevelFilter;
|
use tracing_subscriber::filter::LevelFilter;
|
||||||
|
|
||||||
@ -41,7 +40,7 @@ const DEFAULT_WALLET_NAME: &str = "asb-wallet";
|
|||||||
|
|
||||||
#[tokio::main]
|
#[tokio::main]
|
||||||
async fn main() -> Result<()> {
|
async fn main() -> Result<()> {
|
||||||
init_tracing(LevelFilter::DEBUG).expect("initialize tracing");
|
asb::tracing::init(LevelFilter::DEBUG).expect("initialize tracing");
|
||||||
|
|
||||||
let opt = Arguments::from_args();
|
let opt = Arguments::from_args();
|
||||||
|
|
||||||
|
@ -21,7 +21,7 @@ use std::sync::Arc;
|
|||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
use structopt::StructOpt;
|
use structopt::StructOpt;
|
||||||
use swap::bitcoin::{Amount, TxLock};
|
use swap::bitcoin::{Amount, TxLock};
|
||||||
use swap::cli::command::{Arguments, Command, Data, MoneroParams};
|
use swap::cli::command::{Arguments, Command, MoneroParams};
|
||||||
use swap::database::Database;
|
use swap::database::Database;
|
||||||
use swap::env::{Config, GetConfig};
|
use swap::env::{Config, GetConfig};
|
||||||
use swap::network::quote::BidQuote;
|
use swap::network::quote::BidQuote;
|
||||||
@ -29,9 +29,8 @@ use swap::network::swarm;
|
|||||||
use swap::protocol::bob;
|
use swap::protocol::bob;
|
||||||
use swap::protocol::bob::{Behaviour, Builder, EventLoop};
|
use swap::protocol::bob::{Behaviour, Builder, EventLoop};
|
||||||
use swap::seed::Seed;
|
use swap::seed::Seed;
|
||||||
use swap::{bitcoin, env, monero};
|
use swap::{bitcoin, cli, env, monero};
|
||||||
use tracing::{debug, error, info, warn, Level};
|
use tracing::{debug, error, info, warn};
|
||||||
use tracing_subscriber::FmtSubscriber;
|
|
||||||
use url::Url;
|
use url::Url;
|
||||||
use uuid::Uuid;
|
use uuid::Uuid;
|
||||||
|
|
||||||
@ -40,46 +39,9 @@ extern crate prettytable;
|
|||||||
|
|
||||||
#[tokio::main]
|
#[tokio::main]
|
||||||
async fn main() -> Result<()> {
|
async fn main() -> Result<()> {
|
||||||
let args = Arguments::from_args();
|
let Arguments { data, debug, cmd } = Arguments::from_args();
|
||||||
|
|
||||||
let is_terminal = atty::is(atty::Stream::Stderr);
|
match cmd {
|
||||||
let base_subscriber = |level| {
|
|
||||||
FmtSubscriber::builder()
|
|
||||||
.with_writer(std::io::stderr)
|
|
||||||
.with_ansi(is_terminal)
|
|
||||||
.with_target(false)
|
|
||||||
.with_env_filter(format!("swap={}", level))
|
|
||||||
};
|
|
||||||
|
|
||||||
if args.debug {
|
|
||||||
let subscriber = base_subscriber(Level::DEBUG)
|
|
||||||
.with_timer(tracing_subscriber::fmt::time::ChronoLocal::with_format(
|
|
||||||
"%F %T".to_owned(),
|
|
||||||
))
|
|
||||||
.finish();
|
|
||||||
|
|
||||||
tracing::subscriber::set_global_default(subscriber)?;
|
|
||||||
} else {
|
|
||||||
let subscriber = base_subscriber(Level::INFO)
|
|
||||||
.without_time()
|
|
||||||
.with_level(false)
|
|
||||||
.finish();
|
|
||||||
|
|
||||||
tracing::subscriber::set_global_default(subscriber)?;
|
|
||||||
}
|
|
||||||
|
|
||||||
let data: Data = args.data;
|
|
||||||
let data_dir = data.0;
|
|
||||||
|
|
||||||
let db =
|
|
||||||
Database::open(data_dir.join("database").as_path()).context("Failed to open database")?;
|
|
||||||
|
|
||||||
let seed =
|
|
||||||
Seed::from_file_or_generate(data_dir.as_path()).context("Failed to read in seed file")?;
|
|
||||||
|
|
||||||
let env_config = env::Testnet::get_config();
|
|
||||||
|
|
||||||
match args.cmd {
|
|
||||||
Command::BuyXmr {
|
Command::BuyXmr {
|
||||||
alice_peer_id,
|
alice_peer_id,
|
||||||
alice_multiaddr,
|
alice_multiaddr,
|
||||||
@ -90,6 +52,16 @@ async fn main() -> Result<()> {
|
|||||||
},
|
},
|
||||||
electrum_rpc_url,
|
electrum_rpc_url,
|
||||||
} => {
|
} => {
|
||||||
|
let swap_id = Uuid::new_v4();
|
||||||
|
|
||||||
|
let data_dir = data.0;
|
||||||
|
cli::tracing::init(debug, data_dir.join("logs"), swap_id)?;
|
||||||
|
let db = Database::open(data_dir.join("database").as_path())
|
||||||
|
.context("Failed to open database")?;
|
||||||
|
let seed = Seed::from_file_or_generate(data_dir.as_path())
|
||||||
|
.context("Failed to read in seed file")?;
|
||||||
|
let env_config = env::Testnet::get_config();
|
||||||
|
|
||||||
if receive_monero_address.network != env_config.monero_network {
|
if receive_monero_address.network != env_config.monero_network {
|
||||||
bail!(
|
bail!(
|
||||||
"Given monero address is on network {:?}, expected address on network {:?}",
|
"Given monero address is on network {:?}, expected address on network {:?}",
|
||||||
@ -128,7 +100,6 @@ async fn main() -> Result<()> {
|
|||||||
)
|
)
|
||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
let swap_id = Uuid::new_v4();
|
|
||||||
db.insert_peer_id(swap_id, alice_peer_id).await?;
|
db.insert_peer_id(swap_id, alice_peer_id).await?;
|
||||||
|
|
||||||
let swap = Builder::new(
|
let swap = Builder::new(
|
||||||
@ -154,6 +125,11 @@ async fn main() -> Result<()> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
Command::History => {
|
Command::History => {
|
||||||
|
let data_dir = data.0;
|
||||||
|
|
||||||
|
let db = Database::open(data_dir.join("database").as_path())
|
||||||
|
.context("Failed to open database")?;
|
||||||
|
|
||||||
let mut table = Table::new();
|
let mut table = Table::new();
|
||||||
|
|
||||||
table.add_row(row!["SWAP ID", "STATE"]);
|
table.add_row(row!["SWAP ID", "STATE"]);
|
||||||
@ -175,6 +151,14 @@ async fn main() -> Result<()> {
|
|||||||
},
|
},
|
||||||
electrum_rpc_url,
|
electrum_rpc_url,
|
||||||
} => {
|
} => {
|
||||||
|
let data_dir = data.0;
|
||||||
|
cli::tracing::init(debug, data_dir.join("logs"), swap_id)?;
|
||||||
|
let db = Database::open(data_dir.join("database").as_path())
|
||||||
|
.context("Failed to open database")?;
|
||||||
|
let seed = Seed::from_file_or_generate(data_dir.as_path())
|
||||||
|
.context("Failed to read in seed file")?;
|
||||||
|
let env_config = env::Testnet::get_config();
|
||||||
|
|
||||||
if receive_monero_address.network != env_config.monero_network {
|
if receive_monero_address.network != env_config.monero_network {
|
||||||
bail!("The given monero address is on network {:?}, expected address of network {:?}.", receive_monero_address.network, env_config.monero_network)
|
bail!("The given monero address is on network {:?}, expected address of network {:?}.", receive_monero_address.network, env_config.monero_network)
|
||||||
}
|
}
|
||||||
@ -218,6 +202,14 @@ async fn main() -> Result<()> {
|
|||||||
force,
|
force,
|
||||||
electrum_rpc_url,
|
electrum_rpc_url,
|
||||||
} => {
|
} => {
|
||||||
|
let data_dir = data.0;
|
||||||
|
cli::tracing::init(debug, data_dir.join("logs"), swap_id)?;
|
||||||
|
let db = Database::open(data_dir.join("database").as_path())
|
||||||
|
.context("Failed to open database")?;
|
||||||
|
let seed = Seed::from_file_or_generate(data_dir.as_path())
|
||||||
|
.context("Failed to read in seed file")?;
|
||||||
|
let env_config = env::Testnet::get_config();
|
||||||
|
|
||||||
let bitcoin_wallet =
|
let bitcoin_wallet =
|
||||||
init_bitcoin_wallet(electrum_rpc_url, &seed, data_dir, env_config).await?;
|
init_bitcoin_wallet(electrum_rpc_url, &seed, data_dir, env_config).await?;
|
||||||
|
|
||||||
@ -240,6 +232,14 @@ async fn main() -> Result<()> {
|
|||||||
force,
|
force,
|
||||||
electrum_rpc_url,
|
electrum_rpc_url,
|
||||||
} => {
|
} => {
|
||||||
|
let data_dir = data.0;
|
||||||
|
cli::tracing::init(debug, data_dir.join("logs"), swap_id)?;
|
||||||
|
let db = Database::open(data_dir.join("database").as_path())
|
||||||
|
.context("Failed to open database")?;
|
||||||
|
let seed = Seed::from_file_or_generate(data_dir.as_path())
|
||||||
|
.context("Failed to read in seed file")?;
|
||||||
|
let env_config = env::Testnet::get_config();
|
||||||
|
|
||||||
let bitcoin_wallet =
|
let bitcoin_wallet =
|
||||||
init_bitcoin_wallet(electrum_rpc_url, &seed, data_dir, env_config).await?;
|
init_bitcoin_wallet(electrum_rpc_url, &seed, data_dir, env_config).await?;
|
||||||
|
|
||||||
|
@ -1 +1,2 @@
|
|||||||
pub mod command;
|
pub mod command;
|
||||||
|
pub mod tracing;
|
||||||
|
81
swap/src/cli/tracing.rs
Normal file
81
swap/src/cli/tracing.rs
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
use anyhow::Result;
|
||||||
|
use std::path::Path;
|
||||||
|
use tracing::subscriber::set_global_default;
|
||||||
|
use tracing::{Event, Level, Subscriber};
|
||||||
|
use tracing_subscriber::fmt::format::{DefaultFields, Format};
|
||||||
|
use tracing_subscriber::fmt::time::ChronoLocal;
|
||||||
|
use tracing_subscriber::layer::{Context, SubscriberExt};
|
||||||
|
use tracing_subscriber::{fmt, EnvFilter, Layer, Registry};
|
||||||
|
use uuid::Uuid;
|
||||||
|
|
||||||
|
pub fn init(debug: bool, dir: impl AsRef<Path>, swap_id: Uuid) -> Result<()> {
|
||||||
|
let level_filter = EnvFilter::try_new("swap=debug")?;
|
||||||
|
|
||||||
|
let registry = Registry::default().with(level_filter);
|
||||||
|
|
||||||
|
let appender = tracing_appender::rolling::never(dir, format!("swap-{}.log", swap_id));
|
||||||
|
let (appender, guard) = tracing_appender::non_blocking(appender);
|
||||||
|
|
||||||
|
std::mem::forget(guard);
|
||||||
|
|
||||||
|
let file_logger = fmt::layer()
|
||||||
|
.with_ansi(false)
|
||||||
|
.with_target(false)
|
||||||
|
.with_writer(appender);
|
||||||
|
|
||||||
|
if debug {
|
||||||
|
set_global_default(registry.with(file_logger).with(debug_terminal_printer()))?;
|
||||||
|
} else {
|
||||||
|
set_global_default(registry.with(file_logger).with(info_terminal_printer()))?;
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct StdErrPrinter<L> {
|
||||||
|
inner: L,
|
||||||
|
level: Level,
|
||||||
|
}
|
||||||
|
|
||||||
|
type StdErrLayer<S, T> = tracing_subscriber::fmt::Layer<
|
||||||
|
S,
|
||||||
|
DefaultFields,
|
||||||
|
Format<tracing_subscriber::fmt::format::Full, T>,
|
||||||
|
fn() -> std::io::Stderr,
|
||||||
|
>;
|
||||||
|
|
||||||
|
fn debug_terminal_printer<S>() -> StdErrPrinter<StdErrLayer<S, ChronoLocal>> {
|
||||||
|
let is_terminal = atty::is(atty::Stream::Stderr);
|
||||||
|
StdErrPrinter {
|
||||||
|
inner: fmt::layer()
|
||||||
|
.with_ansi(is_terminal)
|
||||||
|
.with_target(false)
|
||||||
|
.with_timer(ChronoLocal::with_format("%F %T".to_owned()))
|
||||||
|
.with_writer(std::io::stderr),
|
||||||
|
level: Level::DEBUG,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn info_terminal_printer<S>() -> StdErrPrinter<StdErrLayer<S, ()>> {
|
||||||
|
let is_terminal = atty::is(atty::Stream::Stderr);
|
||||||
|
StdErrPrinter {
|
||||||
|
inner: fmt::layer()
|
||||||
|
.with_ansi(is_terminal)
|
||||||
|
.with_target(false)
|
||||||
|
.with_level(false)
|
||||||
|
.without_time()
|
||||||
|
.with_writer(std::io::stderr),
|
||||||
|
level: Level::INFO,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<L, S> Layer<S> for StdErrPrinter<L>
|
||||||
|
where
|
||||||
|
L: 'static + Layer<S>,
|
||||||
|
S: Subscriber + for<'a> tracing_subscriber::registry::LookupSpan<'a>,
|
||||||
|
{
|
||||||
|
fn on_event(&self, event: &Event<'_>, ctx: Context<'_, S>) {
|
||||||
|
if self.level.ge(event.metadata().level()) {
|
||||||
|
self.inner.on_event(event, ctx);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -27,6 +27,5 @@ pub mod monero;
|
|||||||
pub mod network;
|
pub mod network;
|
||||||
pub mod protocol;
|
pub mod protocol;
|
||||||
pub mod seed;
|
pub mod seed;
|
||||||
pub mod trace;
|
|
||||||
|
|
||||||
mod monero_ext;
|
mod monero_ext;
|
||||||
|
Loading…
Reference in New Issue
Block a user