2022-08-09 05:07:06 +02:00
|
|
|
|
#![deny(warnings)]
|
|
|
|
|
#![warn(unused_extern_crates)]
|
2023-09-09 01:38:47 +02:00
|
|
|
|
#![allow(non_snake_case)]
|
2023-11-09 06:15:12 +01:00
|
|
|
|
use std::str::FromStr;
|
|
|
|
|
|
2021-10-02 01:02:36 +02:00
|
|
|
|
use num_enum::{IntoPrimitive, TryFromPrimitive};
|
2023-11-09 06:15:12 +01:00
|
|
|
|
use serde::Deserialize;
|
2023-10-30 07:10:54 +01:00
|
|
|
|
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;
|
2023-10-30 07:10:54 +01:00
|
|
|
|
use tracing_subscriber::prelude::*;
|
2022-08-09 05:07:06 +02:00
|
|
|
|
|
|
|
|
|
pub mod macros;
|
2023-11-09 06:15:12 +01:00
|
|
|
|
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
|
|
|
|
|
2023-10-30 07:10:54 +01:00
|
|
|
|
/// Start up the logging for test mode.
|
2022-08-18 02:36:45 +02:00
|
|
|
|
pub fn test_init() {
|
2023-10-30 07:10:54 +01:00
|
|
|
|
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
|
|
|
|
|
}
|
2021-08-19 03:04:24 +02:00
|
|
|
|
|
2021-10-02 01:02:36 +02:00
|
|
|
|
#[derive(Debug, Clone, Copy, IntoPrimitive, TryFromPrimitive)]
|
|
|
|
|
#[repr(u64)]
|
2021-08-19 03:04:24 +02:00
|
|
|
|
pub enum EventTag {
|
2022-06-26 10:02:16 +02:00
|
|
|
|
AdminDebug,
|
2021-08-19 03:04:24 +02:00
|
|
|
|
AdminError,
|
|
|
|
|
AdminWarn,
|
|
|
|
|
AdminInfo,
|
|
|
|
|
RequestError,
|
|
|
|
|
RequestWarn,
|
|
|
|
|
RequestInfo,
|
|
|
|
|
RequestTrace,
|
|
|
|
|
SecurityCritical,
|
2023-06-24 07:56:01 +02:00
|
|
|
|
SecurityDebug,
|
2021-08-19 03:04:24 +02:00
|
|
|
|
SecurityInfo,
|
|
|
|
|
SecurityAccess,
|
2021-10-17 13:28:04 +02:00
|
|
|
|
SecurityError,
|
2021-08-19 03:04:24 +02:00
|
|
|
|
FilterError,
|
|
|
|
|
FilterWarn,
|
|
|
|
|
FilterInfo,
|
|
|
|
|
FilterTrace,
|
|
|
|
|
PerfTrace,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl EventTag {
|
|
|
|
|
pub fn pretty(self) -> &'static str {
|
|
|
|
|
match self {
|
2022-06-26 10:02:16 +02:00
|
|
|
|
EventTag::AdminDebug => "admin.debug",
|
2021-08-19 03:04:24 +02:00
|
|
|
|
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",
|
2023-06-24 07:56:01 +02:00
|
|
|
|
EventTag::SecurityDebug => "security.debug",
|
2021-08-19 03:04:24 +02:00
|
|
|
|
EventTag::SecurityInfo => "security.info",
|
|
|
|
|
EventTag::SecurityAccess => "security.access",
|
2021-10-17 13:28:04 +02:00
|
|
|
|
EventTag::SecurityError => "security.error",
|
2021-08-19 03:04:24 +02:00
|
|
|
|
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 {
|
2023-06-24 07:56:01 +02:00
|
|
|
|
AdminDebug | SecurityDebug => "🐛",
|
2021-10-17 13:28:04 +02:00
|
|
|
|
AdminError | FilterError | RequestError | SecurityError => "🚨",
|
2022-06-26 10:02:16 +02:00
|
|
|
|
AdminWarn | FilterWarn | RequestWarn => "⚠️",
|
2023-06-24 07:56:01 +02:00
|
|
|
|
AdminInfo | FilterInfo | RequestInfo | SecurityInfo => "ℹ️",
|
2021-08-19 03:04:24 +02:00
|
|
|
|
RequestTrace | FilterTrace | PerfTrace => "📍",
|
|
|
|
|
SecurityCritical => "🔐",
|
|
|
|
|
SecurityAccess => "🔓",
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2023-11-09 06:15:12 +01:00
|
|
|
|
|
|
|
|
|
#[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"),
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|