kanidm/libs/sketching/src/lib.rs

147 lines
4.3 KiB
Rust
Raw Normal View History

2022-08-09 05:07:06 +02:00
#![deny(warnings)]
#![warn(unused_extern_crates)]
#![allow(non_snake_case)]
use std::str::FromStr;
use num_enum::{IntoPrimitive, TryFromPrimitive};
use serde::Deserialize;
use tracing_forest::printer::TestCapturePrinter;
use tracing_forest::tag::NoTag;
2022-10-01 08:08:51 +02:00
use tracing_forest::util::*;
use tracing_forest::Tag;
use tracing_subscriber::prelude::*;
2022-08-09 05:07:06 +02:00
pub mod macros;
pub mod otel;
2022-08-09 05:07:06 +02:00
2022-10-01 08:08:51 +02:00
pub use {tracing, tracing_forest, tracing_subscriber};
2022-08-09 05:07:06 +02:00
/// Start up the logging for test mode.
pub fn test_init() {
let filter = EnvFilter::from_default_env()
.add_directive(LevelFilter::TRACE.into())
// escargot builds cargo packages while we integration test and is SUPER noisy.
.add_directive(
"escargot=ERROR"
.parse()
.expect("failed to generate log filter"),
)
// hyper's very noisy in debug mode with connectivity-related things that we only need in extreme cases.
.add_directive("hyper=INFO".parse().expect("failed to generate log filter"));
// start the logging!
let _ = tracing_subscriber::Registry::default()
.with(ForestLayer::new(TestCapturePrinter::new(), NoTag).with_filter(filter))
.try_init();
2022-08-09 05:07:06 +02:00
}
/// This is for tagging events. Currently not wired in.
pub fn event_tagger(_event: &Event) -> Option<Tag> {
None
}
#[derive(Debug, Clone, Copy, IntoPrimitive, TryFromPrimitive)]
#[repr(u64)]
pub enum EventTag {
AdminDebug,
AdminError,
AdminWarn,
AdminInfo,
RequestError,
RequestWarn,
RequestInfo,
RequestTrace,
SecurityCritical,
SecurityDebug,
SecurityInfo,
SecurityAccess,
2021-10-17 13:28:04 +02:00
SecurityError,
FilterError,
FilterWarn,
FilterInfo,
FilterTrace,
PerfTrace,
}
impl EventTag {
pub fn pretty(self) -> &'static str {
match self {
EventTag::AdminDebug => "admin.debug",
EventTag::AdminError => "admin.error",
EventTag::AdminWarn => "admin.warn",
EventTag::AdminInfo => "admin.info",
EventTag::RequestError => "request.error",
EventTag::RequestWarn => "request.warn",
EventTag::RequestInfo => "request.info",
EventTag::RequestTrace => "request.trace",
EventTag::SecurityCritical => "security.critical",
EventTag::SecurityDebug => "security.debug",
EventTag::SecurityInfo => "security.info",
EventTag::SecurityAccess => "security.access",
2021-10-17 13:28:04 +02:00
EventTag::SecurityError => "security.error",
EventTag::FilterError => "filter.error",
EventTag::FilterWarn => "filter.warn",
EventTag::FilterInfo => "filter.info",
EventTag::FilterTrace => "filter.trace",
EventTag::PerfTrace => "perf.trace",
}
}
pub fn emoji(self) -> &'static str {
use EventTag::*;
match self {
AdminDebug | SecurityDebug => "🐛",
2021-10-17 13:28:04 +02:00
AdminError | FilterError | RequestError | SecurityError => "🚨",
AdminWarn | FilterWarn | RequestWarn => "⚠️",
AdminInfo | FilterInfo | RequestInfo | SecurityInfo => "",
RequestTrace | FilterTrace | PerfTrace => "📍",
SecurityCritical => "🔐",
SecurityAccess => "🔓",
}
}
}
#[derive(Clone, Copy, Deserialize, Debug, Default)]
pub enum LogLevel {
#[default]
#[serde(rename = "info")]
Info,
#[serde(rename = "debug")]
Debug,
#[serde(rename = "trace")]
Trace,
}
impl FromStr for LogLevel {
type Err = &'static str;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s {
"info" => Ok(LogLevel::Info),
"debug" => Ok(LogLevel::Debug),
"trace" => Ok(LogLevel::Trace),
_ => Err("Must be one of info, debug, trace"),
}
}
}
impl ToString for LogLevel {
fn to_string(&self) -> String {
match self {
LogLevel::Info => "info".to_string(),
LogLevel::Debug => "debug".to_string(),
LogLevel::Trace => "trace".to_string(),
}
}
}
impl From<LogLevel> for EnvFilter {
fn from(value: LogLevel) -> Self {
match value {
LogLevel::Info => EnvFilter::new("info"),
LogLevel::Debug => EnvFilter::new("debug"),
LogLevel::Trace => EnvFilter::new("trace"),
}
}
}