| 124 | } |
| 125 | |
| 126 | fn log(&self, record: &log::Record) { |
| 127 | if !self.enabled(record.metadata()) { |
| 128 | return; |
| 129 | } |
| 130 | |
| 131 | let duration_s = Instant::now().duration_since(self.start).as_secs_f32(); |
| 132 | let mut out = self.output.lock().unwrap(); |
| 133 | for token in &self.tokens { |
| 134 | let _ = match token { |
| 135 | Token::Literal(s) => out.write_all(s.as_bytes()), |
| 136 | // 10: 6 decimal places + sep => whole seconds in range `0..=999` properly aligned |
| 137 | Token::BootTime => write!(&mut *out, "{duration_s:>10.6?}"), |
| 138 | Token::WallClock => { |
| 139 | write!(out, "{:.6}", jiff::Timestamp::now()) |
| 140 | } |
| 141 | Token::Pid => write!(&mut *out, "{}", self.pid), |
| 142 | // SAFETY: gettid(2) always succeeds |
| 143 | Token::Tid => write!(&mut *out, "{}", unsafe { libc::gettid() }), |
| 144 | Token::Thread => write!( |
| 145 | &mut *out, |
| 146 | "{}", |
| 147 | std::thread::current().name().unwrap_or("anonymous") |
| 148 | ), |
| 149 | Token::Level => write!(&mut *out, "{}", record.level()), |
| 150 | Token::Location => match (record.file(), record.line()) { |
| 151 | (Some(file), Some(line)) => write!(&mut *out, "{file}:{line}"), |
| 152 | _ => write!(&mut *out, "{}", record.target()), |
| 153 | }, |
| 154 | Token::Msg => write!(&mut *out, "{}", record.args()), |
| 155 | }; |
| 156 | } |
| 157 | let _ = out.write_all(b"\r\n"); |
| 158 | } |
| 159 | |
| 160 | fn flush(&self) {} |
| 161 | } |