Skip to content

Commit

Permalink
Add support for updating the tracing subscriber in LogPlugin (#10822)
Browse files Browse the repository at this point in the history
# Objective

This PR is heavily inspired by
#7682
It aims to solve the same problem: allowing the user to extend the
tracing subscriber with extra layers.

(in my case, I'd like to use `use
metrics_tracing_context::{MetricsLayer, TracingContextLayer};`)


## Solution

I'm proposing a different api where the user has the opportunity to take
the existing `subscriber` and apply any transformations on it.

---

## Changelog

- Added a `update_subscriber` option on the `LogPlugin` that lets the
user modify the `subscriber` (for example to extend it with more tracing
`Layers`


## Migration Guide

> This section is optional. If there are no breaking changes, you can
delete this section.

- Added a new field `update_subscriber` in the `LogPlugin`

---------

Co-authored-by: Charles Bournhonesque <cbournhonesque@snapchat.com>
  • Loading branch information
cBournhonesque and cbournhonesque-sc authored Jan 15, 2024
1 parent 8a523de commit 8c6d9b8
Show file tree
Hide file tree
Showing 5 changed files with 75 additions and 1 deletion.
10 changes: 10 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -1035,6 +1035,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 @@ -38,8 +38,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 @@ -64,6 +66,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 @@ -100,13 +103,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>,
}

/// 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 @@ -179,7 +190,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 @@ -171,6 +171,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

0 comments on commit 8c6d9b8

Please sign in to comment.