summaryrefslogtreecommitdiffstats
path: root/examples
diff options
context:
space:
mode:
Diffstat (limited to 'examples')
-rw-r--r--examples/Cargo.toml4
-rw-r--r--examples/chat.rs36
2 files changed, 32 insertions, 8 deletions
diff --git a/examples/Cargo.toml b/examples/Cargo.toml
index c3dc6091..fe3c90f9 100644
--- a/examples/Cargo.toml
+++ b/examples/Cargo.toml
@@ -7,7 +7,9 @@ edition = "2018"
# If you copy one of the examples into a new project, you should be using
# [dependencies] instead.
[dev-dependencies]
-tokio = { version = "0.2.0", path = "../tokio", features = ["full"] }
+tokio = { version = "0.2.0", path = "../tokio", features = ["full", "tracing"] }
+tracing = "0.1"
+tracing-subscriber = { version = "0.2.7", default-features = false, features = ["fmt", "ansi", "env-filter", "chrono", "tracing-log"] }
tokio-util = { version = "0.3.0", path = "../tokio-util", features = ["full"] }
bytes = "0.5"
futures = "0.3.0"
diff --git a/examples/chat.rs b/examples/chat.rs
index b3fb727a..c4b8c6a2 100644
--- a/examples/chat.rs
+++ b/examples/chat.rs
@@ -43,6 +43,26 @@ use std::task::{Context, Poll};
#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
+ use tracing_subscriber::{fmt::format::FmtSpan, EnvFilter};
+ // Configure a `tracing` subscriber that logs traces emitted by the chat
+ // server.
+ tracing_subscriber::fmt()
+ // Filter what traces are displayed based on the RUST_LOG environment
+ // variable.
+ //
+ // Traces emitted by the example code will always be displayed. You
+ // can set `RUST_LOG=tokio=trace` to enable additional traces emitted by
+ // Tokio itself.
+ .with_env_filter(EnvFilter::from_default_env().add_directive("chat=info".parse()?))
+ // Log events when `tracing` spans are created, entered, exited, or
+ // closed. When Tokio's internal tracing support is enabled (as
+ // described above), this can be used to track the lifecycle of spawned
+ // tasks on the Tokio runtime.
+ .with_span_events(FmtSpan::FULL)
+ // Set this subscriber as the default, to collect all traces emitted by
+ // the program.
+ .init();
+
// Create the shared state. This is how all the peers communicate.
//
// The server task will hold a handle to this. For every new client, the
@@ -59,7 +79,7 @@ async fn main() -> Result<(), Box<dyn Error>> {
// Note that this is the Tokio TcpListener, which is fully async.
let mut listener = TcpListener::bind(&addr).await?;
- println!("server running on {}", addr);
+ tracing::info!("server running on {}", addr);
loop {
// Asynchronously wait for an inbound TcpStream.
@@ -70,8 +90,9 @@ async fn main() -> Result<(), Box<dyn Error>> {
// Spawn our handler to be run asynchronously.
tokio::spawn(async move {
+ tracing::debug!("accepted connection");
if let Err(e) = process(state, stream, addr).await {
- println!("an error occurred; error = {:?}", e);
+ tracing::info!("an error occurred; error = {:?}", e);
}
});
}
@@ -200,7 +221,7 @@ async fn process(
Some(Ok(line)) => line,
// We didn't get a line so we return early here.
_ => {
- println!("Failed to get username from {}. Client disconnected.", addr);
+ tracing::error!("Failed to get username from {}. Client disconnected.", addr);
return Ok(());
}
};
@@ -212,7 +233,7 @@ async fn process(
{
let mut state = state.lock().await;
let msg = format!("{} has joined the chat", username);
- println!("{}", msg);
+ tracing::info!("{}", msg);
state.broadcast(addr, &msg).await;
}
@@ -233,9 +254,10 @@ async fn process(
peer.lines.send(&msg).await?;
}
Err(e) => {
- println!(
+ tracing::error!(
"an error occurred while processing messages for {}; error = {:?}",
- username, e
+ username,
+ e
);
}
}
@@ -248,7 +270,7 @@ async fn process(
state.peers.remove(&addr);
let msg = format!("{} has left the chat", username);
- println!("{}", msg);
+ tracing::info!("{}", msg);
state.broadcast(addr, &msg).await;
}