Skip to content

Commit 6601402

Browse files
committed
Review fixes - to be continued
1 parent 74d3655 commit 6601402

File tree

6 files changed

+89
-77
lines changed

6 files changed

+89
-77
lines changed

tracing-appender/Cargo.toml

+3-3
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@ keywords = ["logging", "tracing", "file-appender", "non-blocking-writer"]
2020
edition = "2018"
2121
rust-version = "1.51.0"
2222

23+
[features]
24+
compression = ["flate2"]
25+
2326
[dependencies]
2427
crossbeam-channel = "0.5.0"
2528
time = { version = "0.3", default-features = false, features = ["formatting"] }
@@ -36,6 +39,3 @@ features = ["fmt", "std"]
3639
tracing = { path = "../tracing", version = "0.2" }
3740
time = { version = "0.3", default-features = false, features = ["formatting", "parsing"] }
3841
tempfile = "3"
39-
40-
[features]
41-
compression = ["flate2"]

tracing-appender/src/builder.rs

+22-37
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use std::path::Path;
12
use crate::rolling::{create_writer_file, Inner, RollingFileAppender, Rotation};
23
use crate::sync::RwLock;
34
use std::sync::atomic::AtomicUsize;
@@ -8,69 +9,53 @@ use crate::compression::CompressionConfig;
89

910
use crate::writer::WriterChannel;
1011

12+
13+
#[derive(Debug)]
1114
pub struct RollingFileAppenderBuilder {
12-
log_directory: Option<String>,
13-
log_filename_prefix: Option<String>,
15+
log_directory: String,
16+
log_filename_prefix: String,
1417
rotation: Option<Rotation>,
15-
next_date: Option<AtomicUsize>,
1618
#[cfg(feature = "compression")]
1719
compression: Option<CompressionConfig>,
1820
}
1921

2022
impl RollingFileAppenderBuilder {
21-
pub fn new() -> Self {
23+
/// Creates an instance of RollingFileAppnderBuilder
24+
pub fn new(log_directory: impl AsRef<Path>,
25+
log_filename_prefix: impl AsRef<Path>) -> Self {
26+
let log_directory = log_directory.as_ref().to_str().expect("Cannot convert log_directory Path to str").to_string();
27+
let log_filename_prefix = log_filename_prefix.as_ref().to_str().expect("Cannot convert log_filename_prefix Path to str").to_string();
2228
RollingFileAppenderBuilder {
23-
log_directory: None,
24-
log_filename_prefix: None,
29+
log_directory,
30+
log_filename_prefix,
2531
rotation: None,
26-
next_date: None,
2732
#[cfg(feature = "compression")]
33+
#[cfg_attr(docsrs, doc(cfg(feature = "compression")))]
2834
compression: None,
2935
}
3036
}
3137

32-
pub fn log_directory(mut self, log_directory: String) -> Self {
33-
self.log_directory = Some(log_directory);
34-
self
35-
}
36-
37-
pub fn log_filename_prefix(mut self, log_filename_prefix: String) -> Self {
38-
self.log_filename_prefix = Some(log_filename_prefix);
39-
self
40-
}
41-
38+
/// Sets Rotation
4239
pub fn rotation(mut self, rotation: Rotation) -> Self {
4340
self.rotation = Some(rotation);
4441
self
4542
}
4643

47-
pub fn next_date(mut self, next_date: AtomicUsize) -> Self {
48-
self.next_date = Some(next_date);
49-
self
50-
}
51-
5244
#[cfg(feature = "compression")]
45+
#[cfg_attr(docsrs, doc(cfg(feature = "compression")))]
5346
pub fn compression(mut self, compression: CompressionConfig) -> Self {
5447
self.compression = Some(compression);
5548
self
5649
}
5750

5851
pub fn build(self) -> RollingFileAppender {
5952
let now = OffsetDateTime::now_utc();
60-
let log_directory = self
61-
.log_directory
62-
.expect("log_directory is required to build RollingFileAppender");
63-
let log_filename_prefix = self
64-
.log_filename_prefix
65-
.expect("log_filename_prefix is required to build RollingFileAppender");
66-
let rotation = self
67-
.rotation
68-
.expect("rotation is required to build RollingFileAppender");
69-
70-
let filename = rotation.join_date(log_filename_prefix.as_str(), &now, false);
53+
let rotation = self.rotation.unwrap_or(Rotation::NEVER);
54+
let filename = rotation.join_date(self.log_filename_prefix.as_str(), &now, false);
7155
let next_date = rotation.next_date(&now);
56+
7257
let writer = RwLock::new(WriterChannel::File(
73-
create_writer_file(log_directory.as_str(), &filename)
58+
create_writer_file(self.log_directory.as_str(), &filename)
7459
.expect("failed to create appender"),
7560
));
7661

@@ -82,10 +67,10 @@ impl RollingFileAppenderBuilder {
8267

8368
RollingFileAppender {
8469
state: Inner {
85-
log_directory,
86-
log_filename_prefix,
70+
log_directory: self.log_directory,
71+
log_filename_prefix: self.log_filename_prefix,
8772
next_date,
88-
rotation,
73+
rotation: rotation,
8974
#[cfg(feature = "compression")]
9075
compression: self.compression,
9176
},

tracing-appender/src/compression.rs

+27-11
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
use flate2::Compression;
22

3+
#[derive(Debug, Clone)]
34
pub enum GzipCompressionLevelLiteral {
45
None,
56
Fast,
67
Best,
78
}
89

10+
#[derive(Debug, Clone)]
911
pub enum GzipCompressionLevelNumerical {
1012
Level0,
1113
Level1,
@@ -19,44 +21,58 @@ pub enum GzipCompressionLevelNumerical {
1921
Level9,
2022
}
2123

24+
#[derive(Debug, Clone)]
2225
pub enum GzipCompressionLevel {
2326
Literal(GzipCompressionLevelLiteral),
2427
Numerical(GzipCompressionLevelNumerical),
2528
}
2629

2730
impl Into<Compression> for GzipCompressionLevel {
2831
fn into(self) -> Compression {
29-
match GzipCompressionLevel {
32+
match self {
3033
GzipCompressionLevel::Literal(lit) => match lit {
3134
GzipCompressionLevelLiteral::None => Compression::none(),
3235
GzipCompressionLevelLiteral::Fast => Compression::fast(),
3336
GzipCompressionLevelLiteral::Best => Compression::best(),
3437
},
3538
GzipCompressionLevel::Numerical(num) => match num {
36-
GzipCompressionLevelNumerical::Level0 => Compression(0),
37-
GzipCompressionLevelNumerical::Level1 => Compression(1),
38-
GzipCompressionLevelNumerical::Level2 => Compression(2),
39-
GzipCompressionLevelNumerical::Level3 => Compression(3),
40-
GzipCompressionLevelNumerical::Level4 => Compression(4),
41-
GzipCompressionLevelNumerical::Level5 => Compression(5),
42-
GzipCompressionLevelNumerical::Level6 => Compression(6),
43-
GzipCompressionLevelNumerical::Level7 => Compression(7),
44-
GzipCompressionLevelNumerical::Level8 => Compression(8),
45-
GzipCompressionLevelNumerical::Level9 => Compression(9),
39+
GzipCompressionLevelNumerical::Level0 => Compression::new(0),
40+
GzipCompressionLevelNumerical::Level1 => Compression::new(1),
41+
GzipCompressionLevelNumerical::Level2 => Compression::new(2),
42+
GzipCompressionLevelNumerical::Level3 => Compression::new(3),
43+
GzipCompressionLevelNumerical::Level4 => Compression::new(4),
44+
GzipCompressionLevelNumerical::Level5 => Compression::new(5),
45+
GzipCompressionLevelNumerical::Level6 => Compression::new(6),
46+
GzipCompressionLevelNumerical::Level7 => Compression::new(7),
47+
GzipCompressionLevelNumerical::Level8 => Compression::new(8),
48+
GzipCompressionLevelNumerical::Level9 => Compression::new(9),
4649
},
4750
}
4851
}
4952
}
5053

54+
#[derive(Debug, Clone)]
5155
pub struct GzipCompression {
5256
pub level: GzipCompressionLevel,
5357
}
5458

5559
/// Data structure to pass compression parameters
60+
#[derive(Debug, Clone)]
5661
pub enum CompressionConfig {
5762
Gzip(GzipCompression),
5863
}
5964

65+
impl CompressionConfig {
66+
pub(crate) fn gz_compress_level(&self) -> Compression {
67+
match self {
68+
CompressionConfig::Gzip(gz) => {
69+
let level = gz.level.into();
70+
level
71+
}
72+
}
73+
}
74+
}
75+
6076
mod compression_options {
6177
use super::*;
6278
pub const GZIP_NONE: CompressionConfig = CompressionConfig::Gzip(GzipCompression {

tracing-appender/src/lib.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ mod writer;
166166
#[cfg(feature = "compression")]
167167
mod compression;
168168

169-
mod builder;
169+
pub mod builder;
170170

171171
/// Convenience function for creating a non-blocking, off-thread writer.
172172
///

tracing-appender/src/rolling.rs

+11-12
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ use std::{
3939
sync::atomic::{AtomicUsize, Ordering},
4040
};
4141
use time::{format_description, Duration, OffsetDateTime, Time};
42+
use tracing_subscriber::fmt::format::Writer;
4243

4344
/// A file appender with the ability to rotate log files at a fixed schedule.
4445
///
@@ -88,6 +89,8 @@ use time::{format_description, Duration, OffsetDateTime, Time};
8889
pub struct RollingFileAppender {
8990
pub(crate) state: Inner,
9091
pub(crate) writer: RwLock<WriterChannel>,
92+
#[cfg(features = "compression")]
93+
pub(crate) compression: Option<CompressionConfig>,
9194
}
9295

9396
/// A [writer] that writes to a rolling log file.
@@ -140,10 +143,8 @@ impl RollingFileAppender {
140143
directory: impl AsRef<Path>,
141144
file_name_prefix: impl AsRef<Path>,
142145
) -> RollingFileAppender {
143-
RollingFileAppenderBuilder::new()
146+
RollingFileAppenderBuilder::new(directory, file_name_prefix)
144147
.rotation(rotation)
145-
.log_directory(directory.as_ref().to_str().unwrap().to_string())
146-
.log_filename_prefix(file_name_prefix.as_ref().to_str().unwrap().to_string())
147148
.build()
148149
}
149150
}
@@ -478,20 +479,18 @@ impl io::Write for RollingWriter<'_> {
478479

479480
impl Inner {
480481
#[cfg(feature = "compression")]
481-
fn refresh_writer(
482-
&self,
483-
now: OffsetDateTime,
484-
file: &mut WriterChannel,
485-
compression: CompressionConfig,
486-
) {
482+
fn refresh_writer(&self, now: OffsetDateTime, file: &mut WriterChannel) {
487483
debug_assert!(self.should_rollover(now));
488484

489485
let filename = self
490486
.rotation
491487
.join_date(&self.log_filename_prefix, &now, false);
492488

493-
let writer =
494-
WriterChannel::new_with_compression(&self.log_directory, &filename, compression);
489+
let writer = if let Some(compression) = self.compression.clone() {
490+
WriterChannel::new_with_compression(&self.log_directory, &filename, compression)
491+
} else {
492+
WriterChannel::new_without_compression(&self.log_directory, &filename)
493+
};
495494

496495
Self::refresh_writer_channel(file, writer);
497496
}
@@ -547,7 +546,7 @@ impl Inner {
547546
}
548547
}
549548

550-
pub fn create_writer_file(directory: &str, filename: &str) -> io::Result<File> {
549+
pub(crate) fn create_writer_file(directory: &str, filename: &str) -> io::Result<File> {
551550
let path = Path::new(directory).join(filename);
552551
let mut open_options = OpenOptions::new();
553552
open_options.append(true).create(true);

tracing-appender/src/writer.rs

+25-13
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,37 @@
1-
#[cfg(feature = "compression")]
2-
use crate::compression::CompressionConfig;
31
use crate::rolling::create_writer_file;
42
use crate::sync::RwLock;
5-
#[cfg(feature = "compression")]
6-
use flate2::write::GzEncoder;
7-
use std::borrow::BorrowMut;
3+
use std::borrow::{Borrow, BorrowMut};
84
use std::fs::{File, OpenOptions};
95
use std::io::{BufWriter, Write};
106
use std::ops::{Deref, DerefMut};
117
use std::path::Path;
128
use std::{fs, io};
139

10+
#[cfg(feature = "compression")]
11+
use flate2::write::GzEncoder;
12+
13+
#[cfg(feature = "compression")]
14+
use crate::compression::CompressionConfig;
15+
16+
#[derive(Debug)]
17+
struct CompressedGzip {
18+
compression: CompressionConfig,
19+
buffer: BufWriter<GzEncoder<BufWriter<File>>>,
20+
}
21+
1422
#[derive(Debug)]
1523
pub enum WriterChannel {
1624
File(File),
1725
#[cfg(feature = "compression")]
18-
CompressedFileGzip(BufWriter<GzEncoder<BufWriter<File>>>),
26+
CompressedFileGzip(CompressedGzip),
1927
}
2028

2129
impl WriterChannel {
2230
#[cfg(feature = "compression")]
2331
pub fn new(
2432
directory: &str,
2533
filename: &str,
26-
#[cfg(feature = "compression")] compression: CompressionConfig,
34+
#[cfg(feature = "compression")] compression: Option<CompressionConfig>,
2735
) -> io::Result<Self> {
2836
if let Some(compression) = compression {
2937
Self::new_with_compression(directory, filename, compression)
@@ -50,9 +58,13 @@ impl WriterChannel {
5058
) -> io::Result<Self> {
5159
let file = create_writer_file(directory, filename)?;
5260
let buf = BufWriter::new(file);
53-
let gzfile = GzEncoder::new(buf, compression.into());
61+
let gzfile = GzEncoder::new(buf, compression.gz_compress_level());
5462
let writer = BufWriter::new(gzfile);
55-
Ok(WriterChannel::CompressedFileGzip(writer))
63+
let compressed_gz = CompressedGzip {
64+
compression: compression.clone(),
65+
buffer: writer,
66+
};
67+
Ok(WriterChannel::CompressedFileGzip(compressed_gz))
5668
}
5769
}
5870

@@ -61,15 +73,15 @@ impl io::Write for WriterChannel {
6173
match self {
6274
WriterChannel::File(f) => f.write(buf),
6375
#[cfg(feature = "compression")]
64-
WriterChannel::CompressedFileGzip(buf) => f.write(buf),
76+
WriterChannel::CompressedFileGzip(gz) => gz.buffer.write(buf),
6577
}
6678
}
6779

6880
fn flush(&mut self) -> io::Result<()> {
6981
match self {
7082
WriterChannel::File(f) => f.flush(),
7183
#[cfg(feature = "compression")]
72-
WriterChannel::CompressedFileGzip(buf) => buf.flush(),
84+
WriterChannel::CompressedFileGzip(gz) => gz.buffer.flush(),
7385
}
7486
}
7587
}
@@ -79,15 +91,15 @@ impl io::Write for &WriterChannel {
7991
match self {
8092
WriterChannel::File(f) => (&*f).write(buf),
8193
#[cfg(feature = "compression")]
82-
WriterChannel::CompressedFileGzip(buf) => f.write(buf),
94+
WriterChannel::CompressedFileGzip(gz) => gz.buffer.write(buf),
8395
}
8496
}
8597

8698
fn flush(&mut self) -> io::Result<()> {
8799
match self {
88100
WriterChannel::File(f) => (&*f).flush(),
89101
#[cfg(feature = "compression")]
90-
WriterChannel::CompressedFileGzip(buf) => buf.flush(),
102+
WriterChannel::CompressedFileGzip(gz) => gz.buffer.flush(),
91103
}
92104
}
93105
}

0 commit comments

Comments
 (0)