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
use chrono::{DateTime, Local, Utc, Timelike};
use log::Level;
use std::time::SystemTime;
pub trait LogAppender: Send {
fn do_log(&self, record: &mut FastLogRecord);
fn type_name(&self) -> &'static str {
std::any::type_name::<Self>()
}
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub enum Command {
CommandRecord,
CommandExit,
}
#[derive(Clone, Debug)]
pub struct FastLogRecord {
pub command: Command,
pub level: log::Level,
pub target: String,
pub args: String,
pub module_path: String,
pub file: String,
pub line: Option<u32>,
pub now: SystemTime,
pub formated: String,
}
impl FastLogRecord {
pub fn format_line(&self) -> String {
match (self.file.as_str(), self.line.unwrap_or(0)) {
(file, line) => format!("({}:{})", file, line),
}
}
}
pub trait RecordFormat: Send + Sync {
fn do_format(&self, arg: &mut FastLogRecord);
}
pub struct FastLogFormatRecord {
pub hour: u32,
}
impl RecordFormat for FastLogFormatRecord {
fn do_format(&self, arg: &mut FastLogRecord) {
let data;
let now: DateTime<Utc> = chrono::DateTime::from(arg.now);
let now = now.with_hour(now.hour() + self.hour).unwrap();
let now = format!("{:36}", now.to_string());
match arg.level {
Level::Warn | Level::Error => {
data = format!(
"{} {} {} - {} {}\n",
&now,
arg.level,
arg.module_path,
arg.args,
arg.format_line()
);
}
_ => {
data = format!(
"{} {} {} - {}\n",
&now, arg.level, arg.module_path, arg.args
);
}
}
arg.formated = data;
}
}