created_at2021-09-07 03:41:05.544523
updated_at2021-09-07 03:41:05.544523
descriptionparser for the env logger filter format
Christopher Durham (CAD97)



Parsing support for a log target filter, as used by env_logger and tracing::EnvFilter.

We always support the extended tracing format, that is


with the following validity rules:

  • All fields are optional, and MAY be omitted
  • All fields MUST NOT contain the syntax characters []{}=,"/
    • This may be relaxed in the future, to allow e.g. matched brackets in value and/or quoting values
  • Unlike env_logger/tracing::EnvFilter, we treat a bare level name as a target, not a level directive
    • Adding this behavior back is simple — check if only a target is set and if so try it as a level

Note that these rules do not trim whitespace; you'll likely want to yourself. If you want further verification, you can add it on after the parse step. This crate is merely intended to pull the directives out of the format, not to ensure that the directives are otherwise well-formed or meaningful.

Features not supported

  • With tracing::EnvFilter, parsing is ad-hoc and can often allow odd edge cases through. We instead opt to be strict and require exactly matching the syntax, rather than sloppy acceptance.
  • Along the same lines, tracing allows (and sometimes expects) using quotes in field filter values. Quotes are currently reserved, such that a quoted syntax that allows syntax characters in filter fields can be added in the future.
  • env_logger supports a global /regex directive to filter messages via a regex. This applies separately and to all other earlier directives, and as such doesn't quite fit the filter iterator design we've taken. However, we have reserved the / character for clarity and such that a filter field can potentially be added with this syntax in the future.
  • tracing::EnvFilter interprets the value of field=value as a regular expression. We explicitly leave that level of interpretation up to the consumer, as this library is just for parsing.
Commit count: 0

cargo fmt