message: fmt: Filter fields and values
  This adds the ability to filter fields and values by matching exactly their output as seen in the log line produced from fmt.
  * fmt: Filter fields and values
  * Update tokio-trace-fmt/src/filter.rs
  * Add more tests for field directives
diff: @@ -153,11 +153,23 @@ impl<N> Filter<N> for EnvFilter {
  let in_span = ctx
  .visit_spans(|_, span| {
  if span.name() == desired {
  + // If there are no fields, then let's exit.
  + // if there are fields and none of them match
  + // try the next span
  + if directive.fields.is_empty()
  + || directive
  + .fields
  + .iter()
  + .any(|field| span.fields().contains(field))
  + {
  // Return `Err` to short-circuit the span visitation.
  Err(())
  } else {
  Ok(())
  }
  + } else {
  + Ok(())
  + }
  })
  .is_err();
  @@ -356,6 +368,86 @@ mod tests {
  assert!(interest.is_always());
  }
  + #[test]
  + fn callsite_enabled_includes_span_directive_field() {
  + let filter = EnvFilter::from("app[mySpan{field=\"value\"}]=debug");
  + let store = Store::with_capacity(1);
  + let ctx = Context::new(&store, &NewRecorder);
  + let meta = Metadata::new(
  + "mySpan",
  + "app",
  + Level::TRACE,
  + None,
  + None,
  + None,
  + &["field=\"value\""],
  + &Cs,
  + );
  +
  + let interest = filter.callsite_enabled(&meta, &ctx);
  + assert!(interest.is_always());
  + }
  +
  + #[test]
  + fn callsite_disabled_includes_directive_field() {
  + let filter = EnvFilter::from("app[{field=\"novalue\"}]=debug");
  + let store = Store::with_capacity(1);
  + let ctx = Context::new(&store, &NewRecorder);
  + let meta = Metadata::new(
  + "mySpan",
  + "app",
  + Level::TRACE,
  + None,
  + None,
  + None,
  + &["field=\"value\""],
  + &Cs,
  + );
  +
  + let interest = filter.callsite_enabled(&meta, &ctx);
  + assert!(interest.is_never());
  + }
  +
  + #[test]
  + fn callsite_disabled_includes_directive_field_no_value() {
  + let filter = EnvFilter::from("app[mySpan{field}]=debug");
  + let store = Store::with_capacity(1);
  + let ctx = Context::new(&store, &NewRecorder);
  + let meta = Metadata::new(
  + "mySpan",
  + "app",
  + Level::TRACE,
  + None,
  + None,
  + None,
  + &["field=\"value\""],
  + &Cs,
  + );
  +
  + let interest = filter.callsite_enabled(&meta, &ctx);
  + assert!(interest.is_always());
  + }
  +
  + #[test]
  + fn callsite_enabled_includes_span_directive_multiple_fields() {
  + let filter = EnvFilter::from("app[mySpan{field=\"value\" field2=2}]=debug");
  + let store = Store::with_capacity(1);
  + let ctx = Context::new(&store, &NewRecorder);
  + let meta = Metadata::new(
  + "mySpan",
  + "app",
  + Level::TRACE,
  + None,
  + None,
  + None,
  + &["field=\"value\""],
  + &Cs,
  + );
  +
  + let interest = filter.callsite_enabled(&meta, &ctx);
  + assert!(interest.is_always());
  + }
  +
  #[test]
  fn parse_directives_valid() {
  let dirs = parse_directives("crate1::mod1=error,crate1::mod2,crate2=debug");
  