Use once_cell instead of lazy_static for tracing. Use custom sinks instead of filters to disable logging.

This commit is contained in:
LukeMathWalker 2021-05-01 15:51:06 +01:00
parent f6bc77a3c6
commit 1caa47a383
5 changed files with 25 additions and 13 deletions

6
Cargo.lock generated
View file

@ -1282,9 +1282,9 @@ dependencies = [
[[package]] [[package]]
name = "once_cell" name = "once_cell"
version = "1.5.2" version = "1.7.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "13bd41f508810a131401606d54ac32a467c97172d74ba7662562ebba5ad07fa0" checksum = "af8b08b04175473088b46763e51ee54da5f9a164bc162f615b91bc179dbf15a3"
[[package]] [[package]]
name = "opaque-debug" name = "opaque-debug"
@ -2619,7 +2619,7 @@ dependencies = [
"claim", "claim",
"config", "config",
"fake", "fake",
"lazy_static", "once_cell",
"quickcheck", "quickcheck",
"quickcheck_macros", "quickcheck_macros",
"reqwest", "reqwest",

View file

@ -31,7 +31,7 @@ unicode-segmentation = "1.7.1"
validator = "0.12.0" validator = "0.12.0"
[dev-dependencies] [dev-dependencies]
lazy_static = "1.4.0" once_cell = "1.7.2"
claim = "0.4.0" claim = "0.4.0"
quickcheck = "0.9.2" quickcheck = "0.9.2"
quickcheck_macros = "0.9.1" quickcheck_macros = "0.9.1"

View file

@ -4,7 +4,7 @@ use zero2prod::telemetry::{get_subscriber, init_subscriber};
#[actix_web::main] #[actix_web::main]
async fn main() -> std::io::Result<()> { async fn main() -> std::io::Result<()> {
let subscriber = get_subscriber("zero2prod".into(), "info".into()); let subscriber = get_subscriber("zero2prod".into(), "info".into(), std::io::stdout);
init_subscriber(subscriber); init_subscriber(subscriber);
let configuration = get_configuration().expect("Failed to read configuration."); let configuration = get_configuration().expect("Failed to read configuration.");

View file

@ -2,6 +2,7 @@ use tracing::subscriber::set_global_default;
use tracing::Subscriber; use tracing::Subscriber;
use tracing_bunyan_formatter::{BunyanFormattingLayer, JsonStorageLayer}; use tracing_bunyan_formatter::{BunyanFormattingLayer, JsonStorageLayer};
use tracing_log::LogTracer; use tracing_log::LogTracer;
use tracing_subscriber::fmt::MakeWriter;
use tracing_subscriber::{layer::SubscriberExt, EnvFilter, Registry}; use tracing_subscriber::{layer::SubscriberExt, EnvFilter, Registry};
/// Compose multiple layers into a `tracing`'s subscriber. /// Compose multiple layers into a `tracing`'s subscriber.
@ -10,10 +11,14 @@ use tracing_subscriber::{layer::SubscriberExt, EnvFilter, Registry};
/// ///
/// We are using `impl Subscriber` as return type to avoid having to spell out the actual /// We are using `impl Subscriber` as return type to avoid having to spell out the actual
/// type of the returned subscriber, which is indeed quite complex. /// type of the returned subscriber, which is indeed quite complex.
pub fn get_subscriber(name: String, env_filter: String) -> impl Subscriber + Sync + Send { pub fn get_subscriber(
name: String,
env_filter: String,
sink: impl MakeWriter + Send + Sync + 'static,
) -> impl Subscriber + Sync + Send {
let env_filter = let env_filter =
EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new(env_filter)); EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new(env_filter));
let formatting_layer = BunyanFormattingLayer::new(name, std::io::stdout); let formatting_layer = BunyanFormattingLayer::new(name, sink);
Registry::default() Registry::default()
.with(env_filter) .with(env_filter)
.with(JsonStorageLayer) .with(JsonStorageLayer)

View file

@ -1,17 +1,22 @@
use once_cell::sync::Lazy;
use sqlx::{Connection, Executor, PgConnection, PgPool}; use sqlx::{Connection, Executor, PgConnection, PgPool};
use uuid::Uuid; use uuid::Uuid;
use zero2prod::configuration::{get_configuration, DatabaseSettings}; use zero2prod::configuration::{get_configuration, DatabaseSettings};
use zero2prod::startup::{get_connection_pool, Application}; use zero2prod::startup::{get_connection_pool, Application};
use zero2prod::telemetry::{get_subscriber, init_subscriber}; use zero2prod::telemetry::{get_subscriber, init_subscriber};
// Ensure that the `tracing` stack is only initialised once using `lazy_static` // Ensure that the `tracing` stack is only initialised once using `once_cell`
lazy_static::lazy_static! { static TRACING: Lazy<()> = Lazy::new(|| {
static ref TRACING: () = { let default_filter_level = "info".to_string();
let filter = if std::env::var("TEST_LOG").is_ok() { "debug" } else { "" }; let subscriber_name = "test".to_string();
let subscriber = get_subscriber("test".into(), filter.into()); if std::env::var("TEST_LOG").is_ok() {
let subscriber = get_subscriber(subscriber_name, default_filter_level, std::io::stdout);
init_subscriber(subscriber);
} else {
let subscriber = get_subscriber(subscriber_name, default_filter_level, std::io::sink);
init_subscriber(subscriber); init_subscriber(subscriber);
}; };
} });
pub struct TestApp { pub struct TestApp {
pub address: String, pub address: String,
@ -31,6 +36,8 @@ impl TestApp {
} }
pub async fn spawn_app() -> TestApp { pub async fn spawn_app() -> TestApp {
Lazy::force(&TRACING);
// Randomise configuration to ensure test isolation // Randomise configuration to ensure test isolation
let configuration = { let configuration = {
let mut c = get_configuration().expect("Failed to read configuration."); let mut c = get_configuration().expect("Failed to read configuration.");