Skip to content
Merged
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
32 changes: 26 additions & 6 deletions src/logger.rs
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,13 @@ impl<'boot> log::Log for Logger {
fn log(&self, record: &log::Record) {
if let Some(mut ptr) = self.writer {
let writer = unsafe { ptr.as_mut() };
let result = DecoratedLog::write(writer, record.level(), record.args());
let result = DecoratedLog::write(
writer,
record.level(),
record.args(),
record.file().unwrap_or("<unknown file>"),
record.line().unwrap_or(0),
);

// Some UEFI implementations, such as the one used by VirtualBox,
// may intermittently drop out some text from SimpleTextOutput and
Expand Down Expand Up @@ -97,25 +103,35 @@ unsafe impl Send for Logger {}
///
/// Therefore, we need to inject ourselves in the middle of the fmt::Write
/// machinery and intercept the strings that it sends to the Writer.
struct DecoratedLog<'writer, W: fmt::Write> {
struct DecoratedLog<'writer, 'a, W: fmt::Write> {
writer: &'writer mut W,
log_level: log::Level,
at_line_start: bool,
file: &'a str,
line: u32,
}

impl<'writer, W: fmt::Write> DecoratedLog<'writer, W> {
impl<'writer, 'a, W: fmt::Write> DecoratedLog<'writer, 'a, W> {
// Call this method to print a level-annotated log
fn write(writer: &'writer mut W, log_level: log::Level, args: &fmt::Arguments) -> fmt::Result {
fn write(
writer: &'writer mut W,
log_level: log::Level,
args: &fmt::Arguments,
file: &'a str,
line: u32,
) -> fmt::Result {
let mut decorated_writer = Self {
writer,
log_level,
at_line_start: true,
file,
line,
};
writeln!(decorated_writer, "{}", *args)
}
}

impl<'writer, W: fmt::Write> fmt::Write for DecoratedLog<'writer, W> {
impl<'writer, 'a, W: fmt::Write> fmt::Write for DecoratedLog<'writer, 'a, W> {
fn write_str(&mut self, s: &str) -> fmt::Result {
// Split the input string into lines
let mut lines = s.lines();
Expand All @@ -125,7 +141,11 @@ impl<'writer, W: fmt::Write> fmt::Write for DecoratedLog<'writer, W> {
// beginning of a line of output.
let first = lines.next().unwrap_or("");
if self.at_line_start {
write!(self.writer, "{}: ", self.log_level)?;
write!(
self.writer,
"[{:>5}]: {:>12}@{:03}: ",
self.log_level, self.file, self.line
)?;
self.at_line_start = false;
}
write!(self.writer, "{}", first)?;
Expand Down