Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

A logger that prints all messages with a readable output format.

The output format is based on the format used by [Supervisord](https://github.com/Supervisor/supervisor), with timestamps in [RFC 3339](https://datatracker.ietf.org/doc/html/rfc3339) format.
The output format is based on the format used by [Supervisord](https://github.com/Supervisor/supervisor), with timestamps in default [RFC 3339](https://datatracker.ietf.org/doc/html/rfc3339) format and custom format.

* [Source on GitHub](https://github.com/borntyping/rust-simple_logger)
* [Packages on Crates.io](https://crates.io/crates/simple_logger)
Expand Down
12 changes: 12 additions & 0 deletions examples/timestamps_format.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
use simple_logger::SimpleLogger;
use time::macros::format_description;

fn main() {
SimpleLogger::new()
.env()
.with_custom_timestamps(format_description!("[year]-[month]-[day] [hour]:[minute]:[second]"))
.init()
.unwrap();

log::warn!("This is an example message with custom timestamp format.");
}
41 changes: 38 additions & 3 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,8 @@ pub struct SimpleLogger {
/// This field is only available if the `timestamps` feature is enabled.
#[cfg(feature = "timestamps")]
timestamps: Timestamps,
#[cfg(feature = "timestamps")]
timeformat: &'static [FormatItem<'static>],

/// Whether to use color output or not.
///
Expand Down Expand Up @@ -111,6 +113,8 @@ impl SimpleLogger {

#[cfg(feature = "timestamps")]
timestamps: Timestamps::Utc,
#[cfg(feature = "timestamps")]
timeformat: time::macros::format_description!(""),

#[cfg(feature = "colored")]
colors: true,
Expand Down Expand Up @@ -265,6 +269,26 @@ impl SimpleLogger {
self
}

/// Custom timestamps format
///
/// The syntax for the format_description macro can be found in the
/// [`time` crate book](https://time-rs.github.io/book/api/format-description.html).
///
/// ```
/// simple_logger::SimpleLogger::new()
/// .with_level(log::LevelFilter::Debug)
/// .env()
/// .with_custom_timestamps(time::macros::format_description!("[year]-[month]-[day] [hour]:[minute]:[second]"))
/// .init()
/// .unwrap();
/// ```
#[must_use = "You must call init() to begin logging"]
#[cfg(feature = "timestamps")]
pub fn with_custom_timestamps(mut self, timeformat: &'static [FormatItem<'static>]) -> SimpleLogger {
self.timeformat = timeformat;
self
}

/// Don't display any timestamps.
///
/// This method is only available if the `timestamps` feature is enabled.
Expand Down Expand Up @@ -321,6 +345,17 @@ impl SimpleLogger {
#[cfg(all(windows, feature = "colored"))]
set_up_color_terminal();

// Set default timestamp format
#[cfg(feature = "timestamps")]
if self.timeformat.len() <= 0 {
self.timeformat = match self.timestamps {
Timestamps::Local => TIMESTAMP_FORMAT_OFFSET,
Timestamps::Utc => TIMESTAMP_FORMAT_UTC,
Timestamps::UtcOffset(_) => TIMESTAMP_FORMAT_OFFSET,
_ => self.timeformat,
};
}

/* Sort all module levels from most specific to least specific. The length of the module
* name is used instead of its actual depth to avoid module name parsing.
*/
Expand Down Expand Up @@ -426,15 +461,15 @@ impl Log for SimpleLogger {
"behaviour. See the time crate's documentation for more information. ",
"(https://time-rs.github.io/internal-api/time/index.html#feature-flags)"
))
.format(&TIMESTAMP_FORMAT_OFFSET)
.format(&self.timeformat)
.unwrap()
),
Timestamps::Utc => format!("{} ", OffsetDateTime::now_utc().format(&TIMESTAMP_FORMAT_UTC).unwrap()),
Timestamps::Utc => format!("{} ", OffsetDateTime::now_utc().format(&self.timeformat).unwrap()),
Timestamps::UtcOffset(offset) => format!(
"{} ",
OffsetDateTime::now_utc()
.to_offset(offset)
.format(&TIMESTAMP_FORMAT_OFFSET)
.format(&self.timeformat)
.unwrap()
),
}
Expand Down