Skip to content

Commit 3848aa1

Browse files
Better logger that includes filename and line (#246)
Co-authored-by: Gabriel Majeri <gabriel.majeri6@gmail.com>
1 parent 49a20ee commit 3848aa1

File tree

1 file changed

+26
-6
lines changed

1 file changed

+26
-6
lines changed

src/logger.rs

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,13 @@ impl<'boot> log::Log for Logger {
5656
fn log(&self, record: &log::Record) {
5757
if let Some(mut ptr) = self.writer {
5858
let writer = unsafe { ptr.as_mut() };
59-
let result = DecoratedLog::write(writer, record.level(), record.args());
59+
let result = DecoratedLog::write(
60+
writer,
61+
record.level(),
62+
record.args(),
63+
record.file().unwrap_or("<unknown file>"),
64+
record.line().unwrap_or(0),
65+
);
6066

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

106-
impl<'writer, W: fmt::Write> DecoratedLog<'writer, W> {
114+
impl<'writer, 'a, W: fmt::Write> DecoratedLog<'writer, 'a, W> {
107115
// Call this method to print a level-annotated log
108-
fn write(writer: &'writer mut W, log_level: log::Level, args: &fmt::Arguments) -> fmt::Result {
116+
fn write(
117+
writer: &'writer mut W,
118+
log_level: log::Level,
119+
args: &fmt::Arguments,
120+
file: &'a str,
121+
line: u32,
122+
) -> fmt::Result {
109123
let mut decorated_writer = Self {
110124
writer,
111125
log_level,
112126
at_line_start: true,
127+
file,
128+
line,
113129
};
114130
writeln!(decorated_writer, "{}", *args)
115131
}
116132
}
117133

118-
impl<'writer, W: fmt::Write> fmt::Write for DecoratedLog<'writer, W> {
134+
impl<'writer, 'a, W: fmt::Write> fmt::Write for DecoratedLog<'writer, 'a, W> {
119135
fn write_str(&mut self, s: &str) -> fmt::Result {
120136
// Split the input string into lines
121137
let mut lines = s.lines();
@@ -125,7 +141,11 @@ impl<'writer, W: fmt::Write> fmt::Write for DecoratedLog<'writer, W> {
125141
// beginning of a line of output.
126142
let first = lines.next().unwrap_or("");
127143
if self.at_line_start {
128-
write!(self.writer, "{}: ", self.log_level)?;
144+
write!(
145+
self.writer,
146+
"[{:>5}]: {:>12}@{:03}: ",
147+
self.log_level, self.file, self.line
148+
)?;
129149
self.at_line_start = false;
130150
}
131151
write!(self.writer, "{}", first)?;

0 commit comments

Comments
 (0)