日志用于记录程序的运行情况。当程序出现问题时,第一时间会查看日志进行排查,通过异常信息快速定位问题。今天就写一个同步阻塞日志库,下面是我认为一个日志库应该要有的最基本的功能:
- 日志输出到文件或标准输出。日志输出到文件是为了在
非调试环境中出问题时能够获取到日志信息。 - 输出到文件达到设置大小重写。避免日志文件过大占用空间。
- 支持日志级别。因为打印日志会占用很多cpu资源,在
非调试环境中运行,需要设置较高的日志级别。 - 线程安全。避免日志错乱。
- 同步阻塞。异步写日志可能造成日志丢失,不利于排查问题。
- 完善的日志排查信息:时间,文件名,函数名,行号等。有利于快速定位打印日志的地方。
实现代码比较简单就不贴了,完整代码。下面是实例代码:
#[macro_use]
extern crate logger;
use logger::log;
fn main() {
log::set_filepath("/tmp/rs.dat".to_owned());
log::set_level(log::A_LEVEL);
log::set_size(1024);
traceln!("{}", "trace");
debugln!("{}", "debug");
infoln!("{}", "info");
warnln!("{}", "warn");
errorln!("{}", "error");
fatalln!("{}-{}", "fatal", "world");
}
输出:
[T] [2020-04-16-23:16:08] [bin/main.rs/{{closure}}:22]: trace
[D] [2020-04-16-23:16:08] [bin/main.rs/{{closure}}:23]: debug
[I] [2020-04-16-23:16:08] [bin/main.rs/{{closure}}:24]: info
[W] [2020-04-16-23:16:08] [bin/main.rs/{{closure}}:25]: warn
[E] [2020-04-16-23:16:08] [bin/main.rs/{{closure}}:26]: error
[F] [2020-04-16-23:16:08] [bin/main.rs/{{closure}}:27]: fatal-world