bevy icon indicating copy to clipboard operation
bevy copied to clipboard

Improve tracing layer customization

Open cBournhonesque opened this issue 2 months ago • 0 comments

Objective

  • Fixes https://github.com/bevyengine/bevy/issues/12597

The current tracing customization option (the update_subscriber field) was basically unusable because it provides a dyn Subscriber and most layers require a Subscriber that also implements for<'a> LookupSpan<'a, Data=Data<'a>>, so it was impossible to add a layer on top of the dyn Subscriber.

This PR provides an alternative way of adding additional tracing layers to the LogPlugin by instead creating an Option<Layer>.

This is enough for most situations because Option<Layer> and Vec<Layer> both implement Layer.

Solution

  • Replace the update_subscriber field of LogPlugin with a custom_layer field which is function pointer returning an Option<BoxedLayer>
  • Update the examples to showcase that this works:
    • with multiple additional layers
    • with Layers that were previously problematic, such as bevy::log::tracing_subscriber::fmt::layer().with_file(true) (mentioned in the issue)

Note that in the example this results in duplicate logs, since we have our own layer on top of the default fmt_layer added in the LogPlugin; maybe in the future we might want to provide a single one? Or to let the user customize the default fmt_layer ? I still think this change is an improvement upon the previous solution, which was basically broken.


Changelog

This section is optional. If this was a trivial fix, or has no externally-visible impact, you can delete this section.

  • The LogPlugin's update_subscriber field has been replaced with custom_layer to allow the user to flexibly add a tracing::Layer to the layer stack

Migration Guide

  • The LogPlugin's update_subscriber field has been replaced with custom_layer

cBournhonesque avatar May 01 '24 14:05 cBournhonesque