Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add support for updating the tracing subscriber in LogPlugin #10822

Merged
merged 5 commits into from
Jan 15, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -1013,6 +1013,16 @@ description = "Illustrate how to use generate log output"
category = "Application"
wasm = true

[[example]]
name = "log_layers"
path = "examples/app/log_layers.rs"

[package.metadata.example.log_layers]
name = "Log layers"
description = "Illustrate how to add custom log layers"
category = "Application"
wasm = false

[[example]]
name = "plugin"
path = "examples/app/plugin.rs"
Expand Down
17 changes: 16 additions & 1 deletion crates/bevy_log/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,10 @@ pub use bevy_utils::tracing::{
debug, debug_span, error, error_span, info, info_span, trace, trace_span, warn, warn_span,
Level,
};
pub use tracing_subscriber;

use bevy_app::{App, Plugin};
use bevy_utils::tracing::Subscriber;
use tracing_log::LogTracer;
#[cfg(feature = "tracing-chrome")]
use tracing_subscriber::fmt::{format::DefaultFields, FormattedFields};
Expand All @@ -60,6 +62,7 @@ use tracing_subscriber::{prelude::*, registry::Registry, EnvFilter};
/// .add_plugins(DefaultPlugins.set(LogPlugin {
/// level: Level::DEBUG,
/// filter: "wgpu=error,bevy_render=info,bevy_ecs=trace".to_string(),
/// update_subscriber: None,
/// }))
/// .run();
/// }
Expand Down Expand Up @@ -96,13 +99,21 @@ pub struct LogPlugin {
/// Filters out logs that are "less than" the given level.
/// This can be further filtered using the `filter` setting.
pub level: Level,

/// Optionally apply extra transformations to the tracing subscriber.
/// For example add [`Layers`](tracing_subscriber::layer::Layer)
pub update_subscriber: Option<fn(BoxedSubscriber) -> BoxedSubscriber>,
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not the biggest fan of this naming, but this work. Not a strict blocker.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe extend_tracing_subscriber_fn?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe configure/configure_callback

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The current name makes sense to me.configure_subscriber maybe?

}

/// Alias for a boxed [`Subscriber`].
pub type BoxedSubscriber = Box<dyn Subscriber + Send + Sync + 'static>;

impl Default for LogPlugin {
fn default() -> Self {
Self {
filter: "wgpu=error,naga=warn".to_string(),
level: Level::INFO,
update_subscriber: None,
}
}
}
Expand Down Expand Up @@ -175,7 +186,11 @@ impl Plugin for LogPlugin {
#[cfg(feature = "tracing-tracy")]
let subscriber = subscriber.with(tracy_layer);

finished_subscriber = subscriber;
if let Some(update_subscriber) = self.update_subscriber {
finished_subscriber = update_subscriber(Box::new(subscriber));
} else {
finished_subscriber = Box::new(subscriber);
}
}

#[cfg(target_arch = "wasm32")]
Expand Down
1 change: 1 addition & 0 deletions examples/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -169,6 +169,7 @@ Example | Description
[Empty](../examples/app/empty.rs) | An empty application (does nothing)
[Empty with Defaults](../examples/app/empty_defaults.rs) | An empty application with default plugins
[Headless](../examples/app/headless.rs) | An application that runs without default plugins
[Log layers](../examples/app/log_layers.rs) | Illustrate how to add custom log layers
[Logs](../examples/app/logs.rs) | Illustrate how to use generate log output
[No Renderer](../examples/app/no_renderer.rs) | An application that runs with default plugins and displays an empty window, but without an actual renderer
[Plugin](../examples/app/plugin.rs) | Demonstrates the creation and registration of a custom plugin
Expand Down
47 changes: 47 additions & 0 deletions examples/app/log_layers.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
//! This example illustrates how to add custom log layers in bevy.

use bevy::{
log::tracing_subscriber::{layer::SubscriberExt, Layer},
log::BoxedSubscriber,
prelude::*,
utils::tracing::Subscriber,
};

struct CustomLayer;

impl<S: Subscriber> Layer<S> for CustomLayer {
fn on_event(
&self,
event: &bevy::utils::tracing::Event<'_>,
_ctx: bevy::log::tracing_subscriber::layer::Context<'_, S>,
) {
println!("Got event!");
println!(" level={:?}", event.metadata().level());
println!(" target={:?}", event.metadata().target());
println!(" name={:?}", event.metadata().name());
}
}

fn update_subscriber(subscriber: BoxedSubscriber) -> BoxedSubscriber {
Box::new(subscriber.with(CustomLayer))
}

fn main() {
App::new()
.add_plugins(DefaultPlugins.set(bevy::log::LogPlugin {
update_subscriber: Some(update_subscriber),
..default()
}))
.add_systems(Update, log_system)
.run();
}

fn log_system() {
// here is how you write new logs at each "log level" (in "most import" to
// "least important" order)
error!("something failed");
warn!("something bad happened that isn't a failure, but thats worth calling out");
info!("helpful information that is worth printing by default");
debug!("helpful for debugging");
trace!("very noisy");
}
1 change: 1 addition & 0 deletions examples/ecs/system_piping.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ fn main() {
.add_plugins(LogPlugin {
level: Level::TRACE,
filter: "".to_string(),
..default()
})
.add_systems(
Update,
Expand Down
Loading