NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
crates.io · #2029 most downloaded on crates.io
An easy-to-configure and flexible logger that writes logs to stderr or stdout and/or to files. It allows custom logline formats, and it allows changing the log specification at runtime. It also allows defining additional log streams, e.g. for alert or security messages.
Last release 2 months ago
07 Aug 2026
Release timing varies
gaps range from 8 days to 4 months
Nearly every release is documented
notes for 60 of the last 60 stable releases
8 versions withdrawn
withdrawn after publishing
11 years old
152 releases · first in 2015
Allow tests to run even when the current directory is not writable, by switching to std::temp_dir() (modified PR #206, kudos to sudipm-mukherjee).
Allow tests to run even when the current directory is not writable,
by switching to std::env::temp_dir()
(modified PR #206,
kudos to sudipm-mukherjee).
Fix bug #205) in FileSpec::default_basename, and add a test.
Fix bug #205 in FileSpec::default_basename,
and add a test.
Code maintenance: update dependencies, add semver check to qualify.rs, fix new clippy.
One column per quarter.
Add option to bind background threads to a specific cpu core. See WriteMode::AsyncPinnedWith.
Add option to bind background threads to a specific cpu core. See WriteMode::AsyncPinnedWith.
Bump minimal supported rust version to 1.83.0, due to updated dependencies.
Provide the hostname also for syslog messages of type RFC 3164 (see PR #201). Kudos goes to julienjpk-withings.
Provide the hostname also for syslog messages of type RFC 3164 (see PR #201). Kudos goes to julienjpk-withings.
Make sure that tracing does not get confused with blanks that are normally printed into LogSpecification's Display String (issue #200), by providing a
Make sure that tracing does not get confused with blanks that are normally printed into
LogSpecification's Display String (issue #200),
by providing a dedicated method.
Kudos goes to samantehrani.
Fix issue #198. Kudos goes to hasezoey.
Fix issue #198. Kudos goes to hasezoey.
Add variant Cleanup::KeepForDays(usize) to have log files being deleted after a given number of days. Kudos goes to Tunglies.
Add variant Cleanup::KeepForDays(usize) to have log files being deleted after a given number of days.
Kudos goes to Tunglies.
Yanked.
Yanked.
Add syslog-call based SyslogWriter connection (kudos to AlexTMjugador).
Add syslog-call based SyslogWriter connection
(kudos to AlexTMjugador).
Improve input qualification in FileSpec::try_from (fixes #194).
Improve input qualification in FileSpec::try_from (fixes #194).
Add format configuration capabilities to flexi_logger::setup_tracing (this is realized in a breaking change, so we do a version bump).
Add format configuration capabilities to flexi_logger::trc::setup_tracing
(this is realized in a breaking change, so we do a version bump).
to read the current log specification from LoggerHandle,
Add abilities
(kudos to Venus Xeon-Blonde).
Fix some clippies.
Bump minimal supported rust version to 1.82.0, due to updated dependencies.
Fix endless loop if a single log message is bigger than buffer_writer's overall limit.
Fix endless loop if a single log message is bigger than buffer_writer's overall limit.
Added non-default feature 'buffer_writer', which adds an in-memory log target with limited size and FIFO-logic.
Added non-default feature 'buffer_writer', which adds an in-memory log target with limited size and FIFO-logic.
Adds as additional requirement that LogWriter implementations must be 'static.
Most usages don't use own LogWriter implementations, and most of those which do will not have to
adapt their code. Own LogWriter implementations that really contain a non-static reference
will not work anymore, but that's hard to imagine anyway. LogWriter implementations that use
generics might have to adapt their requirements to the supported types
(as an example, see
examples/write_writer.rs).
Bump minimal supported rust version to 1.81.0.
Fix issue #185.
Fix issue #185.
Bump minimal supported rust version to 1.72.0.
Allow for custom process names when using the syslog writer (PR #182, kudos to Julien JPK).
Allow for custom process names when using the syslog writer (PR #182, kudos to Julien JPK).
Increase stack sizes for flusher threads from very minimal 128 to 1024 bytes.
Fix issue #181.
Increase stack sizes for flusher threads from very minimal 128 to 1024 bytes.
Add badge for OpenSSF Best Practices.
Fix issue #179 that in rotation with custom time format the custom time format was not applied properly (kudos to alboyer).
Fix issue #179 that in rotation with custom time format the custom time format was not applied properly (kudos to alboyer).
Remove the RwLock around the color palette.
Removed dependency to glob by implementing the necessary file searches explicitly, to fix issue-173.
Removed dependency to glob by implementing the necessary file searches explicitly,
to fix issue-173.
Fix a regression (issue #178) introduced with [0.29.1].
Fix a regression (issue #178) introduced with [0.29.1].
Fix error with rotation & append & explicit directory & Naming::Timestamps.
Fix issue #176: leading underscore in log file name if only the infix is used (no basename, no start time, no discriminant).
Fix issue #176: leading underscore in log file name if only the infix is used (no basename, no start time, no discriminant).
chore: Release flexi_logger version 0.29.0
chore: Release flexi_logger version 0.29.0
Revised SyslogWriter (-> version bump): introduced builder pattern,
added a configuration option for the message format
(resolves issue #168, kudos to krims0n32).
LoggerHandle::existing_log_files now also returns a meaningful result
if file rotation is not used. Kudos to drdo for
discussion 170.
Remove unnecessary dependency to is-terminal.
Remove unnecessary dependency to is-terminal.
Add impl From<LevelFilter> for LogSpecification.
Kudos to Oakchris1955.
Fix issue #162 (FileLogWriter does not follow its max_level), kudos to JoeWildfong.
Fix issue #162 (FileLogWriter does not follow its max_level), kudos to JoeWildfong.
Add special handling for empty current infix to Naming::TimestampsCustomFormat (issue #161).
Add special handling for empty current infix to Naming::TimestampsCustomFormat
(issue #161).
Add variant Naming::TimestampsCustomFormat (issue #158), kudos to jb-alvarado.
Add variant Naming::TimestampsCustomFormat (issue #158),
kudos to jb-alvarado.
Introduce flexi_logger::init() as super-minimal entry usage.
Introduce flexi_logger::init() as super-minimal entry usage.
Update dependencies.
Detach from lazy_static, use std::OnceLock instead.
Detach from lazy_static, use std::sync::OnceLock instead.
Bump minimal supported rust version to 1.70.
If flexi_logger runs into issues itself, it will try to write error messages into the configured
error output channel. By default, flexi_logger panics if writing to the error output channel fails.
It is now possible to gracefully "swallow" the error messages and continue
(see panic_if_error_channel_is_broken).
The new feature kv allows making use of the kv feature of log together with flexi_loggers
format functions, and adds a dependency to log/kv_serde.
The new feature json adds a format function json_format and dependencies to serde_json,
serde and serde_derive.
Add ability to omit the basename cleanly, without leading underscore (issue #153, kudos to krystejj).
Add ability to omit the basename cleanly, without leading underscore (issue #153, kudos to krystejj).
Fix issue #152.
Fix issue #152.
Fix wrong timestamp handling for the second rotation (second part of issue #150).
Fix wrong timestamp handling for the second rotation (second part of issue #150).
Fix issues with sub-second rotations and with cleanup when all logfiles should be compressed (issue #150).
Fix issues with sub-second rotations and with cleanup when all logfiles should be compressed (issue #150).
Revise, and modify the signature of, LoggerHande::existing_log_files() (version bump).
Revise, and modify the signature of, LoggerHande::existing_log_files() (version bump).
Extend the trait LogWriter with an optional method rotate.
Extend impact of LoggerHande::trigger_rotation() to all configured writers.
Introduce new naming variants that work without _rCURRENT files: Naming::TimestampsDirect and Naming::NumbersDirect (delivers #127).
Introduce new naming variants that work without _rCURRENT files: Naming::TimestampsDirect
and Naming::NumbersDirect (delivers #127).
Improve documentation of filename handling.
Introduce LoggerHandle.trigger_rotation() (delivers #147).
Re-open output also for other writers (delivers #143).
Re-open output also for other writers (delivers #143).
Rename method to re-open output from LoggerHandle (leads to version bump).
Use dep: in Cargo.toml for references to most dependencies, in order to avoid implicit "features".
Fix #145 (minor internal optimization).
Add methods LoggerHandle::adapt_duplication_to_stderr and LoggerHandle::adapt_duplication_to_stdout (realizes issue #142).
Add methods
LoggerHandle::adapt_duplication_to_stderr and LoggerHandle::adapt_duplication_to_stdout
(realizes issue #142).
Extend docu on providing custom format.
Use rust-script instead of cargo-script for qualification scripts.
Update dependencies.
Use display (rather than debug) formatting for thread names (kudos to mpalmer).
Use display (rather than debug) formatting for thread names (kudos to mpalmer).
Add LoggerHandle::existing_log_files().
Add LoggerHandle::existing_log_files().
Introduce additional WriteMode variant SupportCapture.
Introduce additional WriteMode variant SupportCapture.
Replace dependency atty with is-terminal, due to RUSTSEC-2021-0145.
Replace dependency atty with is-terminal, due to
RUSTSEC-2021-0145.
Use chrono's support for rfc3339. Improve tests for DeferredNow.
Use chrono's support for rfc3339. Improve tests for DeferredNow.
Bump MSRV to 1.60, because toml needs it now.
Fix issues #132 and #133.
Update dependencies.
Bump MSRV to 1.60, because toml needs it now.
Improve documentation of feature dependencies.
Minor stuff.
Move from unmaintained ansi_term to nu-ansi-term.
Move from unmaintained ansi_term to nu-ansi-term.
Fix new clippies.
Some improvements in respect to use_utc:
Some improvements in respect to use_utc:
Revert back to using chrono, since chrono is now fortunately maintained again and its timezone handling is fixed meanwhile
Revert back to using chrono, since chrono is now fortunately maintained again and its timezone
handling is fixed meanwhile
DeferredNowuse_chrono_for_offset became obsolete and is removedOn linux and Mac, improve the logic that handles the issue described again in issue-122.
Re-introduce LoggerHandle::clone().
Re-introduce LoggerHandle::clone().
Fix security advisory (see #117) by replacing the dependency from notify 4.0 with notify-debouncer-mini 0.2 (which depends on notify 5.0). As a side-e
Fix security advisory (see #117) by replacing the dependency from notify 4.0 with
notify-debouncer-mini 0.2 (which depends on notify 5.0). As a side-effect,
the thread flexi_logger-specfile-watcher is replaced with notify-rs debouncer loop.
Adapt and simplify the submodule trc a bit.
Fix a panic that can happen if Naming::Timestamps and FileSpec::o_suffix(None) are used and rotation happens within a second (issue-116).
Fix a panic that can happen if Naming::Timestamps and FileSpec::o_suffix(None) are used and
rotation happens within a second (issue-116).
Bump MSRV to 1.59 (because the time crate did this).
Switch to edition 2021, use latest patch of time version "0.3", bump minimal supported rust version to "1.57.0".
Switch to edition 2021, use latest patch of time version "0.3",
bump minimal supported rust version to "1.57.0".
Add interconversions between log::LevelFilter and flexi_logger::Duplicate (kudos to rlee287).
Add interconversions between log::LevelFilter and flexi_logger::Duplicate (kudos to rlee287).
Only depend on the parts of crossbeam that are used (kudos to bsilver8192).
Only depend on the parts of crossbeam that are used (kudos to bsilver8192).
Add support for Rfc3164 to SyslogWriter (kudos to mbodmer).
Add support for Rfc3164 to SyslogWriter (kudos to mbodmer).
Add Clone and Copy implementations to enum Duplicate (kudos to
ComplexSpaces).
Code maintenance: remove the feature "external_rotation".
Code maintenance: remove the feature "external_rotation".
Bump minimal version of time crate to "0.3.7".
Add LoggerHandle::reopen_outputfile and deprecate feature external_rotation.
Add LoggerHandle::reopen_outputfile and deprecate feature external_rotation.
Enable symlink on all unix platforms, not just linux.
Enable symlink on all unix platforms, not just linux.
Rework the optional syslog writer (kudos to ObsceneGiraffe):
SyslogConnector::TcpAdd method LoggerHandle::flw_config (kudos to Ivan Azoyan).
Reduce the used feature-list of the optional dependency chrono (to get rid of an indirect dependency to an old time version).
Add feature external_rotation.
Improve the option to use UTC for all timestamps (in filenames and log lines) ( ) such that the error message regarding a failed offset detection is n
Improve the option to use UTC for all timestamps (in filenames and log lines) (https://docs.rs/flexi_logger/latest/flexi_logger/struct.Logger.html#method.use_utc) such that the error message regarding a failed offset detection is not provoked if UTC is enforced.
The API modification done in 0.21.0 to DeferredNow is reverted.
Add option to use UTC for all timestamps (in filenames and log lines).
Add option to use UTC for all timestamps (in filenames and log lines).
Add the optional feature use_chrono_for_offset as a workaround for the current behavior of time on unix.
Add the optional feature use_chrono_for_offset as a workaround for the current behavior
of time on unix.
Add an option to configure the error output channel.
Switch to time 0.3.5, and retrieve the UTC offset while flexi_logger is initialized. See also time's CHANGELOG.
Switch to time 0.3.5, and retrieve the UTC offset while flexi_logger is initialized.
See also time's CHANGELOG.
Reason for the version bump:
The inner representation of DeferredNow has changed from chrono::DateTime<Local>
to time::OffsetDateTime, and this is visible e.g. to implementors of format functions.
Your coding agent can read these notes before it upgrades. Set up the MCP server →