Skip to content

Commit 9a0e1c1

Browse files
committed
add file rotation
1 parent c96a6b4 commit 9a0e1c1

File tree

2 files changed

+49
-47
lines changed

2 files changed

+49
-47
lines changed

src/logger.rs

Lines changed: 40 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,12 @@ use std::sync::Mutex;
2424
///
2525
/// See `slog` at https://github.com/slog-rs/slog
2626
/// See `log` at https://github.com/rust-lang/log
27-
///
27+
///
2828
29-
fn create_file<S:Storage>(storage:&S,dp_path:&str,timestamp:i64) -> Result<S::F> {
30-
let new_path = generate_filename(dp_path, FileType::OldInfoLog, timestamp as u64);
31-
storage.rename(dp_path, new_path.as_str())?;
32-
storage.create(dp_path)
33-
29+
fn create_file<S: Storage>(storage: &S, dp_path: &str, timestamp: i64) -> Result<S::F> {
30+
let new_path = generate_filename(dp_path, FileType::OldInfoLog, timestamp as u64);
31+
storage.rename(dp_path, new_path.as_str())?;
32+
storage.create(dp_path)
3433
}
3534

3635
pub struct Logger {
@@ -45,10 +44,10 @@ impl Logger {
4544
/// If `inner` is `None`
4645
/// - In dev mode, use a std output
4746
/// - In release mode, use a storage specific file with name `LOG`
48-
pub fn new<S:Storage+Clone+'static>(
47+
pub fn new<S: Storage + Clone + 'static>(
4948
inner: Option<slog::Logger>,
5049
level: LevelFilter,
51-
storage:S,
50+
storage: S,
5251
db_path: String,
5352
) -> Self {
5453
let inner = match inner {
@@ -62,12 +61,13 @@ impl Logger {
6261
} else {
6362
// Use a file `Log` to record all logs
6463
// TODO: add file rotation
65-
let file = create_file(&storage, db_path.as_str(), Local::now().timestamp()).unwrap();
66-
let file_fn = move|path:String| {create_file(&storage,
67-
path.as_str(),Local::now().timestamp())};
68-
let drain =FileBasedDrain::new(file,db_path.clone(),
69-
file_fn)
70-
.add_rotator(RotatedFileBySize::new(0));
64+
let file =
65+
create_file(&storage, db_path.as_str(), Local::now().timestamp()).unwrap();
66+
let file_fn = move |path: String| {
67+
create_file(&storage, path.as_str(), Local::now().timestamp())
68+
};
69+
let drain = FileBasedDrain::new(file, db_path, file_fn)
70+
.add_rotator(RotatedFileBySize::new(0));
7171
let drain = slog_async::Async::new(drain).build().fuse();
7272
slog::Logger::root(drain, o!())
7373
}
@@ -128,36 +128,37 @@ fn log_to_slog_level(level: log::Level) -> Level {
128128
}
129129
}
130130

131-
struct FileBasedDrain<F: File> {
131+
struct FileBasedDrain<F: File> {
132132
inner: Mutex<F>,
133133
rotators: Vec<Box<dyn Rotator>>,
134-
dp_path:String,
135-
new_file:Box<dyn Send+Fn(String)->Result<F>>
134+
dp_path: String,
135+
new_file: Box<dyn Send + Fn(String) -> Result<F>>,
136136
}
137137

138-
impl<F: File> FileBasedDrain<F> {
139-
fn new<H>(f:F,path:String,new_file: H) -> Self
140-
where H:'static+Send+Fn(String)->Result<F>
141-
{
138+
impl<F: File> FileBasedDrain<F> {
139+
fn new<H>(f: F, path: String, new_file: H) -> Self
140+
where
141+
H: 'static + Send + Fn(String) -> Result<F>,
142+
{
142143
FileBasedDrain {
143-
dp_path: path.clone(),
144+
dp_path: path,
144145
inner: Mutex::new(f),
145146
rotators: vec![],
146-
new_file:Box::new(new_file)
147+
new_file: Box::new(new_file),
147148
}
148149
}
149150

150-
fn add_rotator<R: 'static+Rotator>(mut self, rotator: R) -> Self {
151+
fn add_rotator<R: 'static + Rotator>(mut self, rotator: R) -> Self {
151152
if rotator.is_enabled() {
152153
self.rotators.push(Box::new(rotator));
153154
}
154-
for rotator in (&self).rotators.iter() {
155+
for rotator in self.rotators.iter() {
155156
rotator.prepare(&*self.inner.lock().unwrap()).unwrap();
156157
}
157158
self
158159
}
159160

160-
fn flush(&self) ->Result<()>{
161+
fn flush(&self) -> Result<()> {
161162
self.inner.lock().unwrap().flush()?;
162163
let new_file = (self.new_file)(self.dp_path.clone()).unwrap();
163164

@@ -166,12 +167,11 @@ impl<F: File> FileBasedDrain<F> {
166167
for rotator in self.rotators.iter() {
167168
rotator.on_rotate()?;
168169
}
169-
return Ok(());
170-
170+
Ok(())
171171
}
172172
}
173173

174-
impl<F:File> Drain for FileBasedDrain<F> {
174+
impl<F: File> Drain for FileBasedDrain<F> {
175175
type Ok = ();
176176
type Err = slog::Never;
177177

@@ -186,13 +186,13 @@ impl<F:File> Drain for FileBasedDrain<F> {
186186
record.msg(),
187187
values
188188
);
189-
for rotator in self.rotators.iter() {
190-
if rotator.should_rotate() {
191-
self.flush().unwrap();
192-
return Ok(());
193-
}
194-
}
195-
189+
for rotator in self.rotators.iter() {
190+
if rotator.should_rotate() {
191+
self.flush().unwrap();
192+
return Ok(());
193+
}
194+
}
195+
196196
for rotator in self.rotators.iter() {
197197
rotator.on_write(by.as_bytes()).unwrap();
198198
}
@@ -203,8 +203,6 @@ impl<F:File> Drain for FileBasedDrain<F> {
203203
}
204204
}
205205

206-
207-
208206
trait Rotator: Send {
209207
/// Check if the option is enabled in configuration.
210208
/// Return true if the `rotator` is valid.
@@ -239,10 +237,9 @@ impl Rotator for RotatedFileBySize {
239237
fn is_enabled(&self) -> bool {
240238
self.rotation_size != 0
241239
}
242-
fn prepare(&self, file: &dyn File) -> Result<()> {
240+
fn prepare(&self, file: &dyn File) -> Result<()> {
243241
*self.file_size.lock().unwrap() = file.len().unwrap();
244242
Ok(())
245-
246243
}
247244

248245
fn should_rotate(&self) -> bool {
@@ -266,11 +263,11 @@ mod tests {
266263
use crate::storage::mem::MemStorage;
267264

268265
use std::thread;
269-
use std::time::Duration;
270-
266+
use std::time::Duration;
267+
271268
#[test]
272269
fn test_default_logger() {
273-
let s =MemStorage::default();
270+
let s = MemStorage::default();
274271
// let s = &'static s;
275272
let db_path = "test";
276273
let logger = Logger::new(None, LevelFilter::Debug, s, db_path.to_string());

src/options.rs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -205,10 +205,10 @@ impl Options {
205205
}
206206

207207
/// Initialize Options by limiting ranges of some flags, applying customized Logger and etc.
208-
pub(crate) fn initialize<O: File + 'static, S:Storage<F = O>+Clone+'static>(
208+
pub(crate) fn initialize<O: File + 'static, S: Storage<F = O> + Clone + 'static>(
209209
&mut self,
210210
db_name: String,
211-
storage: &S,
211+
storage: &S,
212212
) {
213213
self.max_open_files =
214214
Self::clip_range(self.max_open_files, 64 + self.non_table_cache_files, 50000);
@@ -225,9 +225,14 @@ impl Options {
225225
}
226226

227227
#[allow(unused_must_use)]
228-
fn apply_logger<S: 'static+Storage+Clone>(&mut self, storage: &S, db_path: &str) {
228+
fn apply_logger<S: 'static + Storage + Clone>(&mut self, storage: &S, db_path: &str) {
229229
let user_logger = std::mem::replace(&mut self.logger, None);
230-
let logger = Logger::new(user_logger, self.logger_level, storage.clone(), db_path.to_string());
230+
let logger = Logger::new(
231+
user_logger,
232+
self.logger_level,
233+
storage.clone(),
234+
db_path.to_string(),
235+
);
231236
let static_logger: &'static dyn Log = Box::leak(Box::new(logger));
232237
log::set_logger(static_logger);
233238
log::set_max_level(self.logger_level);

0 commit comments

Comments
 (0)