1个不稳定版本
0.1.0 | 2019年5月9日 |
---|
#25 在 #facade
342 每月下载量
在 3 crate 中使用
14KB
199 行
tracing_facade
一个旨在为追踪提供类似log为日志提供的封装。
许可证
此项目受Zero-Clause BSD许可证许可。
lib.rs
:
追踪的封装。
此crate提供了一种可插拔的追踪API,类似于[log]对日志的作用。
一些可用的实现包括
- [tracing_chromium] - 发出Chromium的追踪事件格式
示例
#[macro_use]
extern crate tracing_facade;
#[macro_use]
extern crate serde_json;
use std::borrow::Cow;
use std::sync::{Arc, Mutex};
#[derive(Clone, Debug)]
struct Event {
name: String,
kind: tracing_facade::EventKind,
metadata: tracing_facade::Metadata,
}
impl<'a> From<tracing_facade::Event<'a>> for Event {
fn from(event: tracing_facade::Event) -> Self {
Event {
name: event.name.into_owned(),
kind: event.kind,
metadata: event.metadata,
}
}
}
struct Tracer {
events: Arc<Mutex<Vec<Event>>>
}
impl Tracer {
fn new() -> (Tracer, Arc<Mutex<Vec<Event>>>) {
let vec = Arc::new(Mutex::new(Vec::new()));
let tracer = Tracer {
events: Arc::clone(&vec)
};
(tracer, vec)
}
}
impl tracing_facade::Tracer for Tracer {
fn supports_metadata(&self) -> bool {
true
}
fn record_event(&self, event: tracing_facade::Event) {
self.events.lock().unwrap().push(event.into());
}
fn flush(&self) {}
}
fn main() {
let (tracer, tracer_events) = Tracer::new();
tracing_facade::set_boxed_tracer(Box::new(tracer));
{
trace_scoped!("foo");
trace_begin!("bar", "value": 42);
trace_end!("bar");
}
let events = tracer_events.lock().unwrap().clone();
assert_eq!(events.len(), 4);
assert_eq!(events[0].name, "foo");
assert_eq!(events[0].kind, tracing_facade::EventKind::SyncBegin);
assert_eq!(events[0].metadata.as_json(), None);
assert_eq!(events[1].name, "bar");
assert_eq!(events[1].kind, tracing_facade::EventKind::SyncBegin);
assert_eq!(events[1].metadata.as_json(), Some(&json!({"value": 42})));
assert_eq!(events[2].name, "bar");
assert_eq!(events[2].kind, tracing_facade::EventKind::SyncEnd);
assert_eq!(events[2].metadata.as_json(), None);
assert_eq!(events[3].name, "foo");
assert_eq!(events[3].kind, tracing_facade::EventKind::SyncEnd);
assert_eq!(events[3].metadata.as_json(), None);
}
依赖项
~365–770KB
~17K SLoC