Description
While working on a Rust application, I became interested in downcasting a Value
associated with a log record when using the kv
feature of the log
crate. To my surprise, I discovered that this capability was removed when the kv
feature was stabilized:
Lines 1100 to 1107 in 96dbf58
In my view, there are compelling use cases for downcasting log record Value
s: that enables different software components to process them in a loosely coupled way, effectively repurposing log Record
s as a versatile, typed message-passing mechanism.
For instance, imagine integrating an existing codebase that logs anyhow::Error
s with sentry
reporting, with the requirement that generated Sentry events should include the error backtrace. With Value
downcasting, this could be achieved by doing this at the logging site:
log::error!(error = anyhow_error; "Something went wrong");
And then, to emit Sentry events from these log records with the error backtrace, one could simply pass a custom mapper function to a SentryLogger
that retrieves the error
value from the record, downcasts it to an anyhow::Error
, calls the backtrace()
method on it, and attaches that backtrace to the Sentry event.
Without record Value
downcasting, there isn’t an elegant solution for the scenario above. Approaches like using custom serde
serializers or establishing an additional communication channel between log sites and logger implementations may work in certain cases, but they are far from ideal.
On a different codebase, but this time proof of concept and open-source, I've also found downcasting useful for passing along typed status update messages that get formatted in the way most appropriate for the target environment by just switching between custom logger implementations.
I've scoured the repository for any issues or commits explaining the rationale for removing Value
downcasting but couldn’t find anything beyond a suggestion to file an issue if this is a feature "you rely on". Therefore, I’m opening this issue to understand the context of its removal and to inquire if adding it back is feasible. Are there any drawbacks or implementation constraints I might be overlooking?
Edit: after giving it more thought, the Sentry integration example above perhaps could be solved by using the downcast
method available on dyn Error
, as anyhow::Error
s implement the Error
trait... But that's still not helpful for the different codebase example, and not applicable when introspecting Value
s other than Error
s is desired.
Edit 2: nevermind the edit above, anyhow::Error
does not implement std::error::Error
and thus cannot be downcasted like that.