Skip to content

Commit c4df94d

Browse files
authored
refactor!: Append::flush is now fallible (#117)
Signed-off-by: tison <[email protected]>
1 parent 1e45875 commit c4df94d

File tree

8 files changed

+55
-26
lines changed

8 files changed

+55
-26
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ All notable changes to this project will be documented in this file.
77
### Breaking changes
88

99
* `Diagnosic` is now a trait. `Visitor`'s method signature is simplified.
10+
* `Append::flush` is now fallible.
1011

1112
### New features
1213

src/append/fastrace.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,9 @@ impl Append for FastraceEvent {
6666
Ok(())
6767
}
6868

69-
fn flush(&self) {
69+
fn flush(&self) -> anyhow::Result<()> {
7070
fastrace::flush();
71+
Ok(())
7172
}
7273
}
7374

src/append/mod.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,11 @@ pub trait Append: fmt::Debug + Send + Sync + 'static {
5757
) -> anyhow::Result<()>;
5858

5959
/// Flushes any buffered records.
60-
fn flush(&self) {}
60+
///
61+
/// Default to a no-op.
62+
fn flush(&self) -> anyhow::Result<()> {
63+
Ok(())
64+
}
6165
}
6266

6367
impl<T: Append> From<T> for Box<dyn Append> {

src/append/opentelemetry.rs

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -200,10 +200,9 @@ impl OpentelemetryLogBuilder {
200200
.with_resource(resource)
201201
.build();
202202

203-
let library = InstrumentationScope::builder(name.clone()).build();
203+
let library = InstrumentationScope::builder(name).build();
204204
let logger = provider.logger_with_scope(library);
205205
Ok(OpentelemetryLog {
206-
name,
207206
layout,
208207
logger,
209208
provider,
@@ -228,7 +227,6 @@ impl OpentelemetryLogBuilder {
228227
/// ```
229228
#[derive(Debug)]
230229
pub struct OpentelemetryLog {
231-
name: String,
232230
layout: Option<Box<dyn Layout>>,
233231
logger: opentelemetry_sdk::logs::SdkLogger,
234232
provider: SdkLoggerProvider,
@@ -268,10 +266,9 @@ impl Append for OpentelemetryLog {
268266
Ok(())
269267
}
270268

271-
fn flush(&self) {
272-
if let Err(err) = self.provider.force_flush() {
273-
eprintln!("failed to flush logger {}: {}", self.name, err);
274-
}
269+
fn flush(&self) -> anyhow::Result<()> {
270+
self.provider.force_flush()?;
271+
Ok(())
275272
}
276273
}
277274

src/append/rolling_file/append.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -58,11 +58,10 @@ impl Append for BlockingRollingFile {
5858
Ok(())
5959
}
6060

61-
fn flush(&self) {
61+
fn flush(&self) -> anyhow::Result<()> {
6262
let mut writer = self.writer.lock().unwrap_or_else(|e| e.into_inner());
63-
if let Err(err) = Write::flush(&mut *writer) {
64-
eprintln!("failed to flush writer: {err}");
65-
}
63+
Write::flush(&mut *writer)?;
64+
Ok(())
6665
}
6766
}
6867

src/append/stdio.rs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,9 @@ impl Append for Stdout {
6868
Ok(())
6969
}
7070

71-
fn flush(&self) {
72-
let _ = std::io::stdout().flush();
71+
fn flush(&self) -> anyhow::Result<()> {
72+
std::io::stdout().flush()?;
73+
Ok(())
7374
}
7475
}
7576

@@ -120,7 +121,8 @@ impl Append for Stderr {
120121
Ok(())
121122
}
122123

123-
fn flush(&self) {
124-
let _ = std::io::stderr().flush();
124+
fn flush(&self) -> anyhow::Result<()> {
125+
std::io::stderr().flush()?;
126+
Ok(())
125127
}
126128
}

src/append/syslog.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -162,11 +162,10 @@ impl Append for BlockingSyslog {
162162
Ok(())
163163
}
164164

165-
fn flush(&self) {
165+
fn flush(&self) -> anyhow::Result<()> {
166166
let mut writer = self.writer.lock().unwrap_or_else(|e| e.into_inner());
167-
if let Err(err) = writer.flush() {
168-
eprintln!("failed to flush writer: {err}");
169-
}
167+
writer.flush()?;
168+
Ok(())
170169
}
171170
}
172171

src/logger/log_impl.rs

Lines changed: 31 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -47,14 +47,16 @@ impl log::Log for Logger {
4747
fn log(&self, record: &Record) {
4848
for dispatch in &self.dispatches {
4949
if let Err(err) = dispatch.log(record) {
50-
handle_error(record, err);
50+
handle_log_error(record, err);
5151
}
5252
}
5353
}
5454

5555
fn flush(&self) {
5656
for dispatch in &self.dispatches {
57-
dispatch.flush();
57+
if let Err(err) = dispatch.flush() {
58+
handle_flush_error(err);
59+
}
5860
}
5961
}
6062
}
@@ -119,14 +121,15 @@ impl Dispatch {
119121
Ok(())
120122
}
121123

122-
fn flush(&self) {
124+
fn flush(&self) -> anyhow::Result<()> {
123125
for append in &self.appends {
124-
append.flush();
126+
append.flush()?;
125127
}
128+
Ok(())
126129
}
127130
}
128131

129-
fn handle_error(record: &Record, error: anyhow::Error) {
132+
fn handle_log_error(record: &Record, error: anyhow::Error) {
130133
let Err(fallback_error) = write!(
131134
std::io::stderr(),
132135
r###"
@@ -156,3 +159,26 @@ Error performing stderr logging after error occurred during regular logging.
156159
fallback_error = fallback_error,
157160
);
158161
}
162+
163+
fn handle_flush_error(error: anyhow::Error) {
164+
let Err(fallback_error) = write!(
165+
std::io::stderr(),
166+
r###"
167+
Error perform flush.
168+
Error: {error:?}
169+
"###,
170+
error = error,
171+
) else {
172+
return;
173+
};
174+
175+
panic!(
176+
r###"
177+
Error performing stderr logging after error occurred during regular flush.
178+
Error: {error:?}
179+
Fallback error: {fallback_error}
180+
"###,
181+
error = error,
182+
fallback_error = fallback_error,
183+
);
184+
}

0 commit comments

Comments
 (0)