1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
use super::{Level};
use super::format;
use super::logger::RecordInfo;
use std::{io, str};
use std::fmt::Write as FmtWrite;
use std::io::Write as IoWrite;
use std::sync::Mutex;
use super::{OwnedKeyValue,BorrowedKeyValue};
pub trait Drain : Send+Sync {
fn log(&self, info : &RecordInfo, &[OwnedKeyValue], &[BorrowedKeyValue]);
}
pub struct Streamer<W : io::Write, F : format::Format> {
io : Mutex<W>,
format : F,
}
impl<W : io::Write, F : format::Format> Streamer<W, F> {
pub fn new(io : W, format : F) -> Self {
Streamer {
io: Mutex::new(io),
format : format,
}
}
}
impl<W : 'static+io::Write+Send, F : format::Format+Send> Drain for Streamer<W, F> {
fn log(&self, info : &RecordInfo, logger_values : &[OwnedKeyValue], values : &[BorrowedKeyValue]) {
let formatted = self.format.format(info, logger_values, values);
let mut io = self.io.lock().unwrap();
let _ = write!(io, "{}", formatted);
}
}
pub struct FilterLevel<D : Drain> {
level: Level,
drain : D,
}
impl<D : Drain> FilterLevel<D> {
pub fn new(level : Level, subdrain : D) -> Self {
FilterLevel {
level: level,
drain: subdrain,
}
}
}
impl<D : Drain> Drain for FilterLevel<D> {
fn log(&self, info : &RecordInfo, logger_values : &[OwnedKeyValue], values : &[BorrowedKeyValue]) {
if info.level.is_at_least(self.level) {
self.drain.log(info, logger_values, values)
}
}
}
pub struct Duplicate<D1 : Drain, D2 : Drain> {
drain1 : D1,
drain2 : D2,
}
impl<D1 : Drain, D2 : Drain> Duplicate<D1, D2> {
pub fn new(drain1 : D1, drain2 : D2) -> Self {
Duplicate {
drain1: drain1,
drain2: drain2,
}
}
}
impl<D1 : Drain, D2 : Drain> Drain for Duplicate<D1, D2> {
fn log(&self, info : &RecordInfo, logger_values : &[OwnedKeyValue], values : &[BorrowedKeyValue]) {
self.drain1.log(info, logger_values, values);
self.drain2.log(info, logger_values, values);
}
}
pub fn stream<W : io::Write + Send, F : format::Format>(io : W, format : F) -> Streamer<W, F> {
Streamer::new(io, format)
}
pub fn filter_level<D : Drain>(level : Level, d : D) -> FilterLevel<D> {
FilterLevel::new(level, d)
}
pub fn duplicate<D1 : Drain, D2 : Drain>(d1 : D1, d2 : D2) -> Duplicate<D1, D2> {
Duplicate::new(d1, d2)
}