mirror of
https://github.com/LukeMathWalker/zero-to-production.git
synced 2024-12-12 19:16:32 +00:00
Update to use once_cell instead of lazy_static.
Use a custom sink instead of different log levels to silence logs in tests.
This commit is contained in:
parent
02563384a5
commit
8584ce6891
5 changed files with 24 additions and 14 deletions
6
Cargo.lock
generated
6
Cargo.lock
generated
|
@ -1172,9 +1172,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"
|
||||||
|
@ -2508,7 +2508,7 @@ dependencies = [
|
||||||
"actix-web",
|
"actix-web",
|
||||||
"chrono",
|
"chrono",
|
||||||
"config",
|
"config",
|
||||||
"lazy_static",
|
"once_cell",
|
||||||
"reqwest",
|
"reqwest",
|
||||||
"serde",
|
"serde",
|
||||||
"sqlx",
|
"sqlx",
|
||||||
|
|
|
@ -28,6 +28,6 @@ tracing-actix-web = "0.3.0-beta.2"
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
reqwest = { version = "0.11", features = ["json"] }
|
reqwest = { version = "0.11", features = ["json"] }
|
||||||
lazy_static = "1.4.0"
|
|
||||||
actix-rt = "2"
|
actix-rt = "2"
|
||||||
tokio = "1"
|
tokio = "1"
|
||||||
|
once_cell = "1.7.2"
|
||||||
|
|
|
@ -6,7 +6,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.");
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
use once_cell::sync::Lazy;
|
||||||
use sqlx::{Connection, Executor, PgConnection, PgPool};
|
use sqlx::{Connection, Executor, PgConnection, PgPool};
|
||||||
use std::net::TcpListener;
|
use std::net::TcpListener;
|
||||||
use uuid::Uuid;
|
use uuid::Uuid;
|
||||||
|
@ -5,14 +6,18 @@ use zero2prod::configuration::{get_configuration, DatabaseSettings};
|
||||||
use zero2prod::startup::run;
|
use zero2prod::startup::run;
|
||||||
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,
|
||||||
|
@ -22,7 +27,7 @@ pub struct TestApp {
|
||||||
async fn spawn_app() -> TestApp {
|
async fn spawn_app() -> TestApp {
|
||||||
// The first time `initialize` is invoked the code in `TRACING` is executed.
|
// The first time `initialize` is invoked the code in `TRACING` is executed.
|
||||||
// All other invocations will instead skip execution.
|
// All other invocations will instead skip execution.
|
||||||
lazy_static::initialize(&TRACING);
|
Lazy::force(&TRACING);
|
||||||
|
|
||||||
let listener = TcpListener::bind("127.0.0.1:0").expect("Failed to bind random port");
|
let listener = TcpListener::bind("127.0.0.1:0").expect("Failed to bind random port");
|
||||||
// We retrieve the port assigned to us by the OS
|
// We retrieve the port assigned to us by the OS
|
||||||
|
|
Loading…
Reference in a new issue