pub struct Formatter {
pub time_format: &'static str,
/* private fields */
}Expand description
Renders a Record into a string according to a pattern.
The pattern is parsed once (at construction) into a list of [Segment]s, so
format does no parsing per call. Patterns mix literal
text with field placeholders of the form %(name) optionally followed by a
format spec (alignment/width), e.g. "[%(level)-8] %(message)".
Fields§
§time_format: &'static strThe chrono strftime format used to render
the timestamp field (e.g. "%Y-%m-%d %H:%M:%S").
Implementations§
Source§impl Formatter
impl Formatter
Sourcepub fn new(pattern: &str) -> Self
pub fn new(pattern: &str) -> Self
Creates a formatter from a pattern string, parsing it into segments now
so that format is allocation-light per call.
Examples found in repository?
36fn main() {
37 // 1. Build a formatter from a pattern.
38 //
39 // `%(name)` is a field placeholder. A trailing spec like `-20` controls
40 // width/alignment: a leading `-` left-aligns, the number is the minimum
41 // width, and an optional `.N` truncates to N characters. So:
42 // %(level)-8 -> left-aligned, padded to 8 ("INFO ")
43 // %(name).12 -> truncated to at most 12 chars
44 let mut formatter = Formatter::new("%(timestamp) [%(level)-8] %(name)-12 | %(message)");
45
46 // 2. Customize the timestamp rendering (chrono's strftime syntax).
47 formatter.set_time_format("%Y-%m-%d %H:%M:%S");
48
49 // 3. Post-process every rendered line (here: add color).
50 formatter.set_transformer(colorize);
51
52 // 4. Configure the ROOT logger once. Every logger created afterwards
53 // inherits a snapshot of root's handlers and level, so you typically
54 // set things up here and then just `Logger::get(...)` everywhere else.
55 let root = Logger::root();
56 root.add_handler(StreamHandler::new(formatter, std::io::stdout()))
57 .expect("root handler lock should not be poisoned at startup");
58 root.set_level(Level::Debug); // emit everything Debug and above
59
60 // 5. Grab a named logger and emit one message per level.
61 let logger = Logger::get("quickstart");
62 logger.debug("a debug message (gray)");
63 logger.info("an info message (blue)");
64 logger.warning("a warning message (yellow)");
65 logger.error("an error message (red)");
66 logger.critical("a critical message (deep red)");
67
68 // 6. Levels below a logger's threshold are dropped cheaply (before
69 // formatting). Raise the bar and show that Debug/Info now vanish.
70 logger.set_level(Level::Warning);
71 logger.debug("you will NOT see this (below threshold)");
72 logger.info("you will NOT see this either");
73 logger.warning("but warnings still get through");
74}Sourcepub fn add_field(&mut self, name: &str, resolve: fn(&str) -> &str) -> &mut Self
pub fn add_field(&mut self, name: &str, resolve: fn(&str) -> &str) -> &mut Self
Registers a transform for a field name. When a %(name) placeholder is
rendered, the raw record value is passed through resolve before
alignment/width is applied. Returns &mut Self for chaining.
Sourcepub fn format(&self, record: &Record<'_>) -> String
pub fn format(&self, record: &Record<'_>) -> String
Renders record into a string, substituting each %(name) placeholder
with the record’s value (or "" if absent), applying any registered
field transform and the placeholder’s spec. A trailing newline is
appended. If a transformer is set, it post-processes the whole line.
Sourcepub fn set_transformer(
&mut self,
transformer: impl Fn(&Record<'_>, &String) -> String + Send + Sync + 'static,
)
pub fn set_transformer( &mut self, transformer: impl Fn(&Record<'_>, &String) -> String + Send + Sync + 'static, )
Installs a post-processing hook that receives the record and the fully rendered line and returns the final string (e.g. to add ANSI colors).
Examples found in repository?
36fn main() {
37 // 1. Build a formatter from a pattern.
38 //
39 // `%(name)` is a field placeholder. A trailing spec like `-20` controls
40 // width/alignment: a leading `-` left-aligns, the number is the minimum
41 // width, and an optional `.N` truncates to N characters. So:
42 // %(level)-8 -> left-aligned, padded to 8 ("INFO ")
43 // %(name).12 -> truncated to at most 12 chars
44 let mut formatter = Formatter::new("%(timestamp) [%(level)-8] %(name)-12 | %(message)");
45
46 // 2. Customize the timestamp rendering (chrono's strftime syntax).
47 formatter.set_time_format("%Y-%m-%d %H:%M:%S");
48
49 // 3. Post-process every rendered line (here: add color).
50 formatter.set_transformer(colorize);
51
52 // 4. Configure the ROOT logger once. Every logger created afterwards
53 // inherits a snapshot of root's handlers and level, so you typically
54 // set things up here and then just `Logger::get(...)` everywhere else.
55 let root = Logger::root();
56 root.add_handler(StreamHandler::new(formatter, std::io::stdout()))
57 .expect("root handler lock should not be poisoned at startup");
58 root.set_level(Level::Debug); // emit everything Debug and above
59
60 // 5. Grab a named logger and emit one message per level.
61 let logger = Logger::get("quickstart");
62 logger.debug("a debug message (gray)");
63 logger.info("an info message (blue)");
64 logger.warning("a warning message (yellow)");
65 logger.error("an error message (red)");
66 logger.critical("a critical message (deep red)");
67
68 // 6. Levels below a logger's threshold are dropped cheaply (before
69 // formatting). Raise the bar and show that Debug/Info now vanish.
70 logger.set_level(Level::Warning);
71 logger.debug("you will NOT see this (below threshold)");
72 logger.info("you will NOT see this either");
73 logger.warning("but warnings still get through");
74}Sourcepub fn set_time_format(&mut self, time_format: &'static str)
pub fn set_time_format(&mut self, time_format: &'static str)
Sets the chrono strftime format used to
render the timestamp field.
Examples found in repository?
36fn main() {
37 // 1. Build a formatter from a pattern.
38 //
39 // `%(name)` is a field placeholder. A trailing spec like `-20` controls
40 // width/alignment: a leading `-` left-aligns, the number is the minimum
41 // width, and an optional `.N` truncates to N characters. So:
42 // %(level)-8 -> left-aligned, padded to 8 ("INFO ")
43 // %(name).12 -> truncated to at most 12 chars
44 let mut formatter = Formatter::new("%(timestamp) [%(level)-8] %(name)-12 | %(message)");
45
46 // 2. Customize the timestamp rendering (chrono's strftime syntax).
47 formatter.set_time_format("%Y-%m-%d %H:%M:%S");
48
49 // 3. Post-process every rendered line (here: add color).
50 formatter.set_transformer(colorize);
51
52 // 4. Configure the ROOT logger once. Every logger created afterwards
53 // inherits a snapshot of root's handlers and level, so you typically
54 // set things up here and then just `Logger::get(...)` everywhere else.
55 let root = Logger::root();
56 root.add_handler(StreamHandler::new(formatter, std::io::stdout()))
57 .expect("root handler lock should not be poisoned at startup");
58 root.set_level(Level::Debug); // emit everything Debug and above
59
60 // 5. Grab a named logger and emit one message per level.
61 let logger = Logger::get("quickstart");
62 logger.debug("a debug message (gray)");
63 logger.info("an info message (blue)");
64 logger.warning("a warning message (yellow)");
65 logger.error("an error message (red)");
66 logger.critical("a critical message (deep red)");
67
68 // 6. Levels below a logger's threshold are dropped cheaply (before
69 // formatting). Raise the bar and show that Debug/Info now vanish.
70 logger.set_level(Level::Warning);
71 logger.debug("you will NOT see this (below threshold)");
72 logger.info("you will NOT see this either");
73 logger.warning("but warnings still get through");
74}