-
Notifications
You must be signed in to change notification settings - Fork 742
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
subscriber: add EnvFilter::builder
, option to disable regex
#2035
Conversation
## Motivation Currently, `EnvFilter` will always interpret all field value filter directives that are not numeric, boolean, or string literals as regular expressions that are matched against a field's `fmt::Debug` output. In many cases, it may not be desirable to use regular expressions in this case, so users may prefer to perform literal matching of `fmt::Debug` output against a string value instead. Currently, this is not possible. ## Solution This branch introduces the ability to control whether an `EnvFilter` interprets field value `fmt::Debug` match filters as regular expressions or as literal strings. When matching literal `fmt::Debug` patterns, the string is matched without requiring a temporary allocation for the formatted representation by implementing `fmt::Write` for a matcher type and "writing" the field's `Debug` output to it. This is similar to the technique already used for matching regular expression patterns. Since there is not currently a nice way to specify configurations prior to parsing an `EnvFilter` from a string or environment variable, I've also added a builder API. This allows setting things like whether field value filters should use strict matching or regular expressions. ## Notes Ideally, I think we would want the filter language to allow specifying whether a field value filter should be interpreted as a regular expression or as a literal string match. Instead of having a global toggle between regular expressions and literal strings, we would introduce new syntax for indicating that a value match pattern is a regular expression. This way, a single filter can have both regular expression and literal string value matchers. The `with_regex(false)` configuration would just return an error any time the regex syntax was used when parsing the filter string. However, this would be a breaking change in behavior. Currently, field value filters are interpreted as regex by default, so changing the parser to only interpret a value filter as a regex if there's additional syntax indicating it's a regex would break existing filter configurations that rely on regex matching. In `tracing-subscriber` 0.4, we should definitely consider introducing new syntax to indicate a match pattern is a regex, and change the `with_regex` method's behavior to disallow the use of that syntax. For now, however, making it a global toggle at least allows users to control whether or not we use regex matching, so this is a significant improvement for v0.3.x.
241042f
to
6b00706
Compare
cc @CAD97 |
Signed-off-by: Eliza Weisman <[email protected]>
No, string "literals" are also interpreted as regex 😅
FWIW, my nextgen sketches do this. Currently it only supports "whole string" literal matches, not substring (requiring regex for substring matches), but this is easily adjustable. Otherwise, LGTM |
Ahahaha, whoops, I thought there was a line here that tries to interpret a quoted string as a literal first: tracing/tracing-subscriber/src/filter/env/field.rs Lines 210 to 213 in a3e7944
Yeah, I think this makes sense for now; we should definitely default to matching whole string literals, and make regex support an opt-in feature (if we add it at all). |
(thanks @CAD97) Signed-off-by: Eliza Weisman <[email protected]>
Co-authored-by: David Barsky <[email protected]>
Signed-off-by: Eliza Weisman <[email protected]>
Signed-off-by: Eliza Weisman <[email protected]>
Signed-off-by: Eliza Weisman <[email protected]>
@davidbarsky I think I've addressed all your suggestions? LMKWYT! |
## Motivation Currently, `EnvFilter` will always interpret all field value filter directives that are not numeric,or boolean literals as regular expressions that are matched against a field's `fmt::Debug` output. In many cases, it may not be desirable to use regular expressions in this case, so users may prefer to perform literal matching of `fmt::Debug` output against a string value instead. Currently, this is not possible. ## Solution This branch introduces the ability to control whether an `EnvFilter` interprets field value `fmt::Debug` match filters as regular expressions or as literal strings. When matching literal `fmt::Debug` patterns, the string is matched without requiring a temporary allocation for the formatted representation by implementing `fmt::Write` for a matcher type and "writing" the field's `Debug` output to it. This is similar to the technique already used for matching regular expression patterns. Since there is not currently a nice way to specify configurations prior to parsing an `EnvFilter` from a string or environment variable, I've also added a builder API. This allows setting things like whether field value filters should use strict matching or regular expressions. ## Notes Ideally, I think we would want the filter language to allow specifying whether a field value filter should be interpreted as a regular expression or as a literal string match. Instead of having a global toggle between regular expressions and literal strings, we would introduce new syntax for indicating that a value match pattern is a regular expression. This way, a single filter can have both regular expression and literal string value matchers. The `with_regex(false)` configuration would just return an error any time the regex syntax was used when parsing the filter string. However, this would be a breaking change in behavior. Currently, field value filters are interpreted as regex by default, so changing the parser to only interpret a value filter as a regex if there's additional syntax indicating it's a regex would break existing filter configurations that rely on regex matching. In `tracing-subscriber` 0.4, we should definitely consider introducing new syntax to indicate a match pattern is a regex, and change the `with_regex` method's behavior to disallow the use of that syntax. For now, however, making it a global toggle at least allows users to control whether or not we use regex matching, so this is a significant improvement for v0.3.x. Signed-off-by: Eliza Weisman <[email protected]>
## Motivation Currently, `EnvFilter` will always interpret all field value filter directives that are not numeric,or boolean literals as regular expressions that are matched against a field's `fmt::Debug` output. In many cases, it may not be desirable to use regular expressions in this case, so users may prefer to perform literal matching of `fmt::Debug` output against a string value instead. Currently, this is not possible. ## Solution This branch introduces the ability to control whether an `EnvFilter` interprets field value `fmt::Debug` match filters as regular expressions or as literal strings. When matching literal `fmt::Debug` patterns, the string is matched without requiring a temporary allocation for the formatted representation by implementing `fmt::Write` for a matcher type and "writing" the field's `Debug` output to it. This is similar to the technique already used for matching regular expression patterns. Since there is not currently a nice way to specify configurations prior to parsing an `EnvFilter` from a string or environment variable, I've also added a builder API. This allows setting things like whether field value filters should use strict matching or regular expressions. ## Notes Ideally, I think we would want the filter language to allow specifying whether a field value filter should be interpreted as a regular expression or as a literal string match. Instead of having a global toggle between regular expressions and literal strings, we would introduce new syntax for indicating that a value match pattern is a regular expression. This way, a single filter can have both regular expression and literal string value matchers. The `with_regex(false)` configuration would just return an error any time the regex syntax was used when parsing the filter string. However, this would be a breaking change in behavior. Currently, field value filters are interpreted as regex by default, so changing the parser to only interpret a value filter as a regex if there's additional syntax indicating it's a regex would break existing filter configurations that rely on regex matching. In `tracing-subscriber` 0.4, we should definitely consider introducing new syntax to indicate a match pattern is a regex, and change the `with_regex` method's behavior to disallow the use of that syntax. For now, however, making it a global toggle at least allows users to control whether or not we use regex matching, so this is a significant improvement for v0.3.x. Signed-off-by: Eliza Weisman <[email protected]>
## Motivation Currently, `EnvFilter` will always interpret all field value filter directives that are not numeric,or boolean literals as regular expressions that are matched against a field's `fmt::Debug` output. In many cases, it may not be desirable to use regular expressions in this case, so users may prefer to perform literal matching of `fmt::Debug` output against a string value instead. Currently, this is not possible. ## Solution This branch introduces the ability to control whether an `EnvFilter` interprets field value `fmt::Debug` match filters as regular expressions or as literal strings. When matching literal `fmt::Debug` patterns, the string is matched without requiring a temporary allocation for the formatted representation by implementing `fmt::Write` for a matcher type and "writing" the field's `Debug` output to it. This is similar to the technique already used for matching regular expression patterns. Since there is not currently a nice way to specify configurations prior to parsing an `EnvFilter` from a string or environment variable, I've also added a builder API. This allows setting things like whether field value filters should use strict matching or regular expressions. ## Notes Ideally, I think we would want the filter language to allow specifying whether a field value filter should be interpreted as a regular expression or as a literal string match. Instead of having a global toggle between regular expressions and literal strings, we would introduce new syntax for indicating that a value match pattern is a regular expression. This way, a single filter can have both regular expression and literal string value matchers. The `with_regex(false)` configuration would just return an error any time the regex syntax was used when parsing the filter string. However, this would be a breaking change in behavior. Currently, field value filters are interpreted as regex by default, so changing the parser to only interpret a value filter as a regex if there's additional syntax indicating it's a regex would break existing filter configurations that rely on regex matching. In `tracing-subscriber` 0.4, we should definitely consider introducing new syntax to indicate a match pattern is a regex, and change the `with_regex` method's behavior to disallow the use of that syntax. For now, however, making it a global toggle at least allows users to control whether or not we use regex matching, so this is a significant improvement for v0.3.x. Signed-off-by: Eliza Weisman <[email protected]>
## Motivation Currently, `EnvFilter` will always interpret all field value filter directives that are not numeric,or boolean literals as regular expressions that are matched against a field's `fmt::Debug` output. In many cases, it may not be desirable to use regular expressions in this case, so users may prefer to perform literal matching of `fmt::Debug` output against a string value instead. Currently, this is not possible. ## Solution This branch introduces the ability to control whether an `EnvFilter` interprets field value `fmt::Debug` match filters as regular expressions or as literal strings. When matching literal `fmt::Debug` patterns, the string is matched without requiring a temporary allocation for the formatted representation by implementing `fmt::Write` for a matcher type and "writing" the field's `Debug` output to it. This is similar to the technique already used for matching regular expression patterns. Since there is not currently a nice way to specify configurations prior to parsing an `EnvFilter` from a string or environment variable, I've also added a builder API. This allows setting things like whether field value filters should use strict matching or regular expressions. ## Notes Ideally, I think we would want the filter language to allow specifying whether a field value filter should be interpreted as a regular expression or as a literal string match. Instead of having a global toggle between regular expressions and literal strings, we would introduce new syntax for indicating that a value match pattern is a regular expression. This way, a single filter can have both regular expression and literal string value matchers. The `with_regex(false)` configuration would just return an error any time the regex syntax was used when parsing the filter string. However, this would be a breaking change in behavior. Currently, field value filters are interpreted as regex by default, so changing the parser to only interpret a value filter as a regex if there's additional syntax indicating it's a regex would break existing filter configurations that rely on regex matching. In `tracing-subscriber` 0.4, we should definitely consider introducing new syntax to indicate a match pattern is a regex, and change the `with_regex` method's behavior to disallow the use of that syntax. For now, however, making it a global toggle at least allows users to control whether or not we use regex matching, so this is a significant improvement for v0.3.x. Signed-off-by: Eliza Weisman <[email protected]>
## Motivation Currently, `EnvFilter` will always interpret all field value filter directives that are not numeric,or boolean literals as regular expressions that are matched against a field's `fmt::Debug` output. In many cases, it may not be desirable to use regular expressions in this case, so users may prefer to perform literal matching of `fmt::Debug` output against a string value instead. Currently, this is not possible. ## Solution This branch introduces the ability to control whether an `EnvFilter` interprets field value `fmt::Debug` match filters as regular expressions or as literal strings. When matching literal `fmt::Debug` patterns, the string is matched without requiring a temporary allocation for the formatted representation by implementing `fmt::Write` for a matcher type and "writing" the field's `Debug` output to it. This is similar to the technique already used for matching regular expression patterns. Since there is not currently a nice way to specify configurations prior to parsing an `EnvFilter` from a string or environment variable, I've also added a builder API. This allows setting things like whether field value filters should use strict matching or regular expressions. ## Notes Ideally, I think we would want the filter language to allow specifying whether a field value filter should be interpreted as a regular expression or as a literal string match. Instead of having a global toggle between regular expressions and literal strings, we would introduce new syntax for indicating that a value match pattern is a regular expression. This way, a single filter can have both regular expression and literal string value matchers. The `with_regex(false)` configuration would just return an error any time the regex syntax was used when parsing the filter string. However, this would be a breaking change in behavior. Currently, field value filters are interpreted as regex by default, so changing the parser to only interpret a value filter as a regex if there's additional syntax indicating it's a regex would break existing filter configurations that rely on regex matching. In `tracing-subscriber` 0.4, we should definitely consider introducing new syntax to indicate a match pattern is a regex, and change the `with_regex` method's behavior to disallow the use of that syntax. For now, however, making it a global toggle at least allows users to control whether or not we use regex matching, so this is a significant improvement for v0.3.x. Signed-off-by: Eliza Weisman <[email protected]>
# 0.3.10 (Apr 1, 2022) This release adds several new features, including a `Filter` implementation and new builder API for `EnvFilter`, support for using a `Vec<L> where L: Layer` as a `Layer`, and a number of smaller API improvements to make working with dynamic and reloadable layers easier. ### Added - **registry**: Implement `Filter` for `EnvFilter`, allowing it to be used with per-layer filtering ([#1983]) - **registry**: `Filter::on_new_span`, `Filter::on_enter`, `Filter::on_exit`, `Filter::on_close` and `Filter::on_record` callbacks to allow `Filter`s to track span states internally ([#1973], [#2017], [#2031]) - **registry**: `Filtered::filter` and `Filtered::filter_mut` accessors ([#1959]) - **registry**: `Filtered::inner` and `Filtered::inner_mut` accessors to borrow the wrapped `Layer` ([#2034]) - **layer**: Implement `Layer` for `Vec<L: Layer>`, to allow composing together a dynamically sized list of `Layer`s ([#2027]) - **layer**: `Layer::boxed` method to make type-erasing `Layer`s easier ([#2026]) - **fmt**: `fmt::Layer::writer` and `fmt::Layer::writer_mut` accessors ([#2034]) - **fmt**: `fmt::Layer::set_ansi` method to allow changing the ANSI formatting configuration at runtime ([#2034]) - **env-filter**: `EnvFilter::builder` to configure a new `EnvFilter` prior to parsing it ([#2035]) - Several documentation fixes and improvements ([#1972], [#1971], [#2023], [#2023]) ### Fixed - **fmt**: `fmt::Layer`'s auto traits no longer depend on the `Subscriber` type parameter's auto traits ([2025]) - **env-filter**: Fixed missing help text when the `ansi` feature is disabled ([#2029]) Thanks to new contributors @TimoFreiberg and @wagenet, as well as @CAD97 for contributing to this release! [#1983]: #1983 [#1973]: #1973 [#2017]: #2017 [#2031]: #2031 [#1959]: #1959 [#2034]: #2034 [#2027]: #2027 [#2026]: #2026 [#2035]: #2035 [#1972]: #1972 [#1971]: #1971 [#2023]: #2023
# 0.3.10 (Apr 1, 2022) This release adds several new features, including a `Filter` implementation and new builder API for `EnvFilter`, support for using a `Vec<L> where L: Layer` as a `Layer`, and a number of smaller API improvements to make working with dynamic and reloadable layers easier. ### Added - **registry**: Implement `Filter` for `EnvFilter`, allowing it to be used with per-layer filtering ([#1983]) - **registry**: `Filter::on_new_span`, `Filter::on_enter`, `Filter::on_exit`, `Filter::on_close` and `Filter::on_record` callbacks to allow `Filter`s to track span states internally ([#1973], [#2017], [#2031]) - **registry**: `Filtered::filter` and `Filtered::filter_mut` accessors ([#1959]) - **registry**: `Filtered::inner` and `Filtered::inner_mut` accessors to borrow the wrapped `Layer` ([#2034]) - **layer**: Implement `Layer` for `Vec<L: Layer>`, to allow composing together a dynamically sized list of `Layer`s ([#2027]) - **layer**: `Layer::boxed` method to make type-erasing `Layer`s easier ([#2026]) - **fmt**: `fmt::Layer::writer` and `fmt::Layer::writer_mut` accessors ([#2034]) - **fmt**: `fmt::Layer::set_ansi` method to allow changing the ANSI formatting configuration at runtime ([#2034]) - **env-filter**: `EnvFilter::builder` to configure a new `EnvFilter` prior to parsing it ([#2035]) - Several documentation fixes and improvements ([#1972], [#1971], [#2023], [#2023]) ### Fixed - **fmt**: `fmt::Layer`'s auto traits no longer depend on the `Subscriber` type parameter's auto traits ([2025]) - **env-filter**: Fixed missing help text when the `ansi` feature is disabled ([#2029]) Thanks to new contributors @TimoFreiberg and @wagenet, as well as @CAD97 for contributing to this release! [#1983]: #1983 [#1973]: #1973 [#2017]: #2017 [#2031]: #2031 [#1959]: #1959 [#2034]: #2034 [#2027]: #2027 [#2026]: #2026 [#2035]: #2035 [#1972]: #1972 [#1971]: #1971 [#2023]: #2023
# 0.3.10 (Apr 1, 2022) This release adds several new features, including a `Filter` implementation and new builder API for `EnvFilter`, support for using a `Vec<L> where L: Layer` as a `Layer`, and a number of smaller API improvements to make working with dynamic and reloadable layers easier. ### Added - **registry**: Implement `Filter` for `EnvFilter`, allowing it to be used with per-layer filtering ([#1983]) - **registry**: `Filter::on_new_span`, `Filter::on_enter`, `Filter::on_exit`, `Filter::on_close` and `Filter::on_record` callbacks to allow `Filter`s to track span states internally ([#1973], [#2017], [#2031]) - **registry**: `Filtered::filter` and `Filtered::filter_mut` accessors ([#1959]) - **registry**: `Filtered::inner` and `Filtered::inner_mut` accessors to borrow the wrapped `Layer` ([#2034]) - **layer**: Implement `Layer` for `Vec<L: Layer>`, to allow composing together a dynamically sized list of `Layer`s ([#2027]) - **layer**: `Layer::boxed` method to make type-erasing `Layer`s easier ([#2026]) - **fmt**: `fmt::Layer::writer` and `fmt::Layer::writer_mut` accessors ([#2034]) - **fmt**: `fmt::Layer::set_ansi` method to allow changing the ANSI formatting configuration at runtime ([#2034]) - **env-filter**: `EnvFilter::builder` to configure a new `EnvFilter` prior to parsing it ([#2035]) - Several documentation fixes and improvements ([#1972], [#1971], [#2023], [#2023]) ### Fixed - **fmt**: `fmt::Layer`'s auto traits no longer depend on the `Subscriber` type parameter's auto traits ([2025]) - **env-filter**: Fixed missing help text when the `ansi` feature is disabled ([#2029]) Thanks to new contributors @TimoFreiberg and @wagenet, as well as @CAD97 for contributing to this release! [#1983]: #1983 [#1973]: #1973 [#2017]: #2017 [#2031]: #2031 [#1959]: #1959 [#2034]: #2034 [#2027]: #2027 [#2026]: #2026 [#2035]: #2035 [#1972]: #1972 [#1971]: #1971 [#2023]: #2023
# 0.3.10 (Apr 1, 2022) This release adds several new features, including a `Filter` implementation and new builder API for `EnvFilter`, support for using a `Vec<L> where L: Layer` as a `Layer`, and a number of smaller API improvements to make working with dynamic and reloadable layers easier. ### Added - **registry**: Implement `Filter` for `EnvFilter`, allowing it to be used with per-layer filtering ([#1983]) - **registry**: `Filter::on_new_span`, `Filter::on_enter`, `Filter::on_exit`, `Filter::on_close` and `Filter::on_record` callbacks to allow `Filter`s to track span states internally ([#1973], [#2017], [#2031]) - **registry**: `Filtered::filter` and `Filtered::filter_mut` accessors ([#1959]) - **registry**: `Filtered::inner` and `Filtered::inner_mut` accessors to borrow the wrapped `Layer` ([#2034]) - **layer**: Implement `Layer` for `Vec<L: Layer>`, to allow composing together a dynamically sized list of `Layer`s ([#2027]) - **layer**: `Layer::boxed` method to make type-erasing `Layer`s easier ([#2026]) - **fmt**: `fmt::Layer::writer` and `fmt::Layer::writer_mut` accessors ([#2034]) - **fmt**: `fmt::Layer::set_ansi` method to allow changing the ANSI formatting configuration at runtime ([#2034]) - **env-filter**: `EnvFilter::builder` to configure a new `EnvFilter` prior to parsing it ([#2035]) - Several documentation fixes and improvements ([#1972], [#1971], [#2023], [#2023]) ### Fixed - **fmt**: `fmt::Layer`'s auto traits no longer depend on the `Subscriber` type parameter's auto traits ([2025]) - **env-filter**: Fixed missing help text when the `ansi` feature is disabled ([#2029]) Thanks to new contributors @TimoFreiberg and @wagenet, as well as @CAD97 for contributing to this release! [#1983]: #1983 [#1973]: #1973 [#2017]: #2017 [#2031]: #2031 [#1959]: #1959 [#2034]: #2034 [#2027]: #2027 [#2026]: #2026 [#2035]: #2035 [#1972]: #1972 [#1971]: #1971 [#2023]: #2023
# 0.3.10 (Apr 1, 2022) This release adds several new features, including a `Filter` implementation and new builder API for `EnvFilter`, support for using a `Vec<L> where L: Layer` as a `Layer`, and a number of smaller API improvements to make working with dynamic and reloadable layers easier. ### Added - **registry**: Implement `Filter` for `EnvFilter`, allowing it to be used with per-layer filtering ([#1983]) - **registry**: `Filter::on_new_span`, `Filter::on_enter`, `Filter::on_exit`, `Filter::on_close` and `Filter::on_record` callbacks to allow `Filter`s to track span states internally ([#1973], [#2017], [#2031]) - **registry**: `Filtered::filter` and `Filtered::filter_mut` accessors ([#1959]) - **registry**: `Filtered::inner` and `Filtered::inner_mut` accessors to borrow the wrapped `Layer` ([#2034]) - **layer**: Implement `Layer` for `Vec<L: Layer>`, to allow composing together a dynamically sized list of `Layer`s ([#2027]) - **layer**: `Layer::boxed` method to make type-erasing `Layer`s easier ([#2026]) - **fmt**: `fmt::Layer::writer` and `fmt::Layer::writer_mut` accessors ([#2034]) - **fmt**: `fmt::Layer::set_ansi` method to allow changing the ANSI formatting configuration at runtime ([#2034]) - **env-filter**: `EnvFilter::builder` to configure a new `EnvFilter` prior to parsing it ([#2035]) - Several documentation fixes and improvements ([#1972], [#1971], [#2023], [#2023]) ### Fixed - **fmt**: `fmt::Layer`'s auto traits no longer depend on the `Subscriber` type parameter's auto traits ([#2025]) - **env-filter**: Fixed missing help text when the `ansi` feature is disabled ([#2029]) Thanks to new contributors @TimoFreiberg and @wagenet, as well as @CAD97 for contributing to this release! [#1983]: #1983 [#1973]: #1973 [#2017]: #2017 [#2031]: #2031 [#1959]: #1959 [#2034]: #2034 [#2027]: #2027 [#2026]: #2026 [#2035]: #2035 [#1972]: #1972 [#1971]: #1971 [#2023]: #2023 [#2025]: #2025 [#2029]: #2029
…#2052) ## Motivation See issue #2046. When using calling [`Builder::parse`] or [`Builder::parse_lossy`] with an empty string an error is produced. This happens for example when `EnvFilter::from_default_env()` is called, but the `RUST_LOG` variable is unset. This regression was introduced by #2035. ## Solution Filter any empty directives. This allows the whole string to be empty, as well as leading and trailing commas. A unit test was added for [`Builder::parse`], but not [`Builder::parse_lossy`] because it (per definition) doesn't produce any side effects visible from tests when erroring. Fixes #2046 [`Builder::parse`]: https://github.com/tokio-rs/tracing/blob/cade7e311848227348c9b3062e4a33db827a0390/tracing-subscriber/src/filter/env/builder.rs#L151= [`Builder::parse_lossy`]: https://github.com/tokio-rs/tracing/blob/cade7e311848227348c9b3062e4a33db827a0390/tracing-subscriber/src/filter/env/builder.rs#L135=
…#2052) ## Motivation See issue #2046. When using calling [`Builder::parse`] or [`Builder::parse_lossy`] with an empty string an error is produced. This happens for example when `EnvFilter::from_default_env()` is called, but the `RUST_LOG` variable is unset. This regression was introduced by #2035. ## Solution Filter any empty directives. This allows the whole string to be empty, as well as leading and trailing commas. A unit test was added for [`Builder::parse`], but not [`Builder::parse_lossy`] because it (per definition) doesn't produce any side effects visible from tests when erroring. Fixes #2046 [`Builder::parse`]: https://github.com/tokio-rs/tracing/blob/cade7e311848227348c9b3062e4a33db827a0390/tracing-subscriber/src/filter/env/builder.rs#L151= [`Builder::parse_lossy`]: https://github.com/tokio-rs/tracing/blob/cade7e311848227348c9b3062e4a33db827a0390/tracing-subscriber/src/filter/env/builder.rs#L135=
…#2052) ## Motivation See issue #2046. When using calling [`Builder::parse`] or [`Builder::parse_lossy`] with an empty string an error is produced. This happens for example when `EnvFilter::from_default_env()` is called, but the `RUST_LOG` variable is unset. This regression was introduced by #2035. ## Solution Filter any empty directives. This allows the whole string to be empty, as well as leading and trailing commas. A unit test was added for [`Builder::parse`], but not [`Builder::parse_lossy`] because it (per definition) doesn't produce any side effects visible from tests when erroring. Fixes #2046 [`Builder::parse`]: https://github.com/tokio-rs/tracing/blob/cade7e311848227348c9b3062e4a33db827a0390/tracing-subscriber/src/filter/env/builder.rs#L151= [`Builder::parse_lossy`]: https://github.com/tokio-rs/tracing/blob/cade7e311848227348c9b3062e4a33db827a0390/tracing-subscriber/src/filter/env/builder.rs#L135=
# 0.3.10 (Apr 1, 2022) This release adds several new features, including a `Filter` implementation and new builder API for `EnvFilter`, support for using a `Vec<L> where L: Layer` as a `Layer`, and a number of smaller API improvements to make working with dynamic and reloadable layers easier. ### Added - **registry**: Implement `Filter` for `EnvFilter`, allowing it to be used with per-layer filtering ([tokio-rs#1983]) - **registry**: `Filter::on_new_span`, `Filter::on_enter`, `Filter::on_exit`, `Filter::on_close` and `Filter::on_record` callbacks to allow `Filter`s to track span states internally ([tokio-rs#1973], [tokio-rs#2017], [tokio-rs#2031]) - **registry**: `Filtered::filter` and `Filtered::filter_mut` accessors ([tokio-rs#1959]) - **registry**: `Filtered::inner` and `Filtered::inner_mut` accessors to borrow the wrapped `Layer` ([tokio-rs#2034]) - **layer**: Implement `Layer` for `Vec<L: Layer>`, to allow composing together a dynamically sized list of `Layer`s ([tokio-rs#2027]) - **layer**: `Layer::boxed` method to make type-erasing `Layer`s easier ([tokio-rs#2026]) - **fmt**: `fmt::Layer::writer` and `fmt::Layer::writer_mut` accessors ([tokio-rs#2034]) - **fmt**: `fmt::Layer::set_ansi` method to allow changing the ANSI formatting configuration at runtime ([tokio-rs#2034]) - **env-filter**: `EnvFilter::builder` to configure a new `EnvFilter` prior to parsing it ([tokio-rs#2035]) - Several documentation fixes and improvements ([tokio-rs#1972], [tokio-rs#1971], [tokio-rs#2023], [tokio-rs#2023]) ### Fixed - **fmt**: `fmt::Layer`'s auto traits no longer depend on the `Subscriber` type parameter's auto traits ([tokio-rs#2025]) - **env-filter**: Fixed missing help text when the `ansi` feature is disabled ([tokio-rs#2029]) Thanks to new contributors @TimoFreiberg and @wagenet, as well as @CAD97 for contributing to this release! [tokio-rs#1983]: tokio-rs#1983 [tokio-rs#1973]: tokio-rs#1973 [tokio-rs#2017]: tokio-rs#2017 [tokio-rs#2031]: tokio-rs#2031 [tokio-rs#1959]: tokio-rs#1959 [tokio-rs#2034]: tokio-rs#2034 [tokio-rs#2027]: tokio-rs#2027 [tokio-rs#2026]: tokio-rs#2026 [tokio-rs#2035]: tokio-rs#2035 [tokio-rs#1972]: tokio-rs#1972 [tokio-rs#1971]: tokio-rs#1971 [tokio-rs#2023]: tokio-rs#2023 [tokio-rs#2025]: tokio-rs#2025 [tokio-rs#2029]: tokio-rs#2029
Motivation
Currently,
EnvFilter
will always interpret all field value filterdirectives that are not numeric,or boolean literals as regular
expressions that are matched against a field's
fmt::Debug
output. Inmany cases, it may not be desirable to use regular expressions in this
case, so users may prefer to perform literal matching of
fmt::Debug
output against a string value instead. Currently, this is not possible.
Solution
This branch introduces the ability to control whether an
EnvFilter
interprets field value
fmt::Debug
match filters as regular expressionsor as literal strings. When matching literal
fmt::Debug
patterns, thestring is matched without requiring a temporary allocation for the
formatted representation by implementing
fmt::Write
for a matcher typeand "writing" the field's
Debug
output to it. This is similar to thetechnique already used for matching regular expression patterns.
Since there is not currently a nice way to specify configurations prior
to parsing an
EnvFilter
from a string or environment variable, I'vealso added a builder API. This allows setting things like whether field
value filters should use strict matching or regular expressions.
Notes
Ideally, I think we would want the filter language to allow specifying
whether a field value filter should be interpreted as a regular
expression or as a literal string match. Instead of having a global
toggle between regular expressions and literal strings, we would
introduce new syntax for indicating that a value match pattern is a
regular expression. This way, a single filter can have both regular
expression and literal string value matchers. The
with_regex(false)
configuration would just return an error any time the regex syntax was
used when parsing the filter string.
However, this would be a breaking change in behavior. Currently, field
value filters are interpreted as regex by default, so changing the
parser to only interpret a value filter as a regex if there's additional
syntax indicating it's a regex would break existing filter
configurations that rely on regex matching.
In
tracing-subscriber
0.4, we should definitely consider introducingnew syntax to indicate a match pattern is a regex, and change the
with_regex
method's behavior to disallow the use of that syntax. Fornow, however, making it a global toggle at least allows users to control
whether or not we use regex matching, so this is a significant
improvement for v0.3.x.