win_dbg_logger
in the readme.log!
macros so they work in expression context (this regressed in 0.4.9
, which has been yanked).This release bumps the minimum compiler version to 1.31.0
. This was mainly needed for cfg-if
, but between 1.16.0
and 1.31.0
there are a lot of language and library improvements we now take advantage of.
log!
macrosRecord
fields as static strings.kv_unstable
feature gate. This new API doesn't affect existing users and may change in future patches (so those changes may not appear in the changelog until it stabilizes).log
with the 2018 edition.log_enabled!
macro.log
's internal helper macros less likely to conflict with user-defined macros.The changes in this release include cleanup of some obscure functionality and a more robust public API designed to support bridges to other logging systems, and provide more flexibility to new features in the future.
Vast portions of the Rust ecosystem use the 0.3.x release series of log, and we don't want to force the community to go through the pain of upgrading every crate to 0.4.x at the exact same time. Along with 0.4.0, we've published a new 0.3.9 release which acts as a "shim" over 0.4.0. This will allow crates using either version to coexist without losing messages from one side or the other.
There is one caveat - a log message generated by a crate using 0.4.x but consumed by a logging implementation using 0.3.x will not have a file name or module path. Applications affected by this can upgrade their logging implementations to one using 0.4.x to avoid losing this information. The other direction does not lose any information, fortunately!
TL;DR Libraries should feel comfortable upgrading to 0.4.0 without treating that as a breaking change. Applications may need to update their logging implementation (e.g. env-logger) to a newer version using log 0.4.x to avoid losing module and file information.
no_std
by default.Level
and LevelFilter
now implement Serialize
and Deserialize
when the serde
feature is enabled.Record
and Metadata
types can now be constructed by third-party code via a builder API.logger
free function returns a reference to the logger implementation. This, along with the ability to construct Record
s, makes it possible to bridge from another logging framework to this one without digging into the private internals of the crate. The standard error!
warn!
, etc, macros now exclusively use the public API of the crate rather than "secret" internal APIs.Log::flush
has been added to allow crates to tell the logging implementation to ensure that all "in flight" log events have been persisted. This can be used, for example, just before an application exits to ensure that asynchronous log sinks finish their work.shutdown
and shutdown_raw
functions have been removed. Supporting shutdown significantly complicated the implementation and imposed a performance cost on each logging operation.log_panics
function and its associated nightly
Cargo feature have been removed. Use the log-panics instead.Log
prefix has been removed from type names. For example, LogLevelFilter
is now LevelFilter
, and LogRecord
is now Record
.MaxLogLevelFilter
object has been removed in favor of a set_max_level
free function.set_logger
free functions have been restructured. The logger is now directly passed to the functions rather than a closure which returns the logger. set_logger
now takes a &'static Log
and is usable in no_std
contexts in place of the old set_logger_raw
. set_boxed_logger
is a convenience function which takes a Box<Log>
but otherwise acts like set_logger
. It requires the std
feature.file
and module_path
values in Record
no longer have the 'static
lifetime to support integration with other logging frameworks that don't provide a 'static
lifetime for the equivalent values.file
, line
, and module_path
values in Record
are now Option
s to support integration with other logging frameworks that don't provide those values.Look at the release tags for information about older releases.