add markdown log format for capture
Signed-off-by: Jason Volk <jason@zemos.net>
This commit is contained in:
parent
c914a4fd91
commit
1f9225e4d1
6 changed files with 95 additions and 17 deletions
28
Cargo.lock
generated
28
Cargo.lock
generated
|
@ -2714,6 +2714,24 @@ dependencies = [
|
||||||
"prost",
|
"prost",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "pulldown-cmark"
|
||||||
|
version = "0.10.3"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "76979bea66e7875e7509c4ec5300112b316af87fa7a252ca91c448b32dfe3993"
|
||||||
|
dependencies = [
|
||||||
|
"bitflags 2.5.0",
|
||||||
|
"memchr",
|
||||||
|
"pulldown-cmark-escape",
|
||||||
|
"unicase",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "pulldown-cmark-escape"
|
||||||
|
version = "0.10.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "bd348ff538bc9caeda7ee8cad2d1d48236a1f443c1fa3913c6a02fe0043b1dd3"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "quick-error"
|
name = "quick-error"
|
||||||
version = "1.2.3"
|
version = "1.2.3"
|
||||||
|
@ -2980,6 +2998,7 @@ dependencies = [
|
||||||
"js_int",
|
"js_int",
|
||||||
"js_option",
|
"js_option",
|
||||||
"percent-encoding",
|
"percent-encoding",
|
||||||
|
"pulldown-cmark",
|
||||||
"regex",
|
"regex",
|
||||||
"ruma-common",
|
"ruma-common",
|
||||||
"ruma-identifiers-validation",
|
"ruma-identifiers-validation",
|
||||||
|
@ -4279,6 +4298,15 @@ dependencies = [
|
||||||
"version_check",
|
"version_check",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "unicase"
|
||||||
|
version = "2.7.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89"
|
||||||
|
dependencies = [
|
||||||
|
"version_check",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "unicode-bidi"
|
name = "unicode-bidi"
|
||||||
version = "0.3.15"
|
version = "0.3.15"
|
||||||
|
|
|
@ -280,6 +280,7 @@ features = [
|
||||||
"appservice-api-c",
|
"appservice-api-c",
|
||||||
"client-api",
|
"client-api",
|
||||||
"federation-api",
|
"federation-api",
|
||||||
|
"markdown",
|
||||||
"push-gateway-api-c",
|
"push-gateway-api-c",
|
||||||
"state-res",
|
"state-res",
|
||||||
"unstable-exhaustive-types",
|
"unstable-exhaustive-types",
|
||||||
|
|
|
@ -648,16 +648,18 @@ pub(crate) async fn resolve_true_destination(
|
||||||
|
|
||||||
let state = &services().server.log.capture;
|
let state = &services().server.log.capture;
|
||||||
let logs = Arc::new(Mutex::new(String::new()));
|
let logs = Arc::new(Mutex::new(String::new()));
|
||||||
let capture = Capture::new(state, Some(filter), capture::to_html(&logs));
|
let capture = Capture::new(state, Some(filter), capture::fmt_markdown(logs.clone()));
|
||||||
let (actual_dest, hostname_uri);
|
let (actual_dest, hostname_uri);
|
||||||
{
|
{
|
||||||
let _capture_scope = capture.start();
|
let _capture_scope = capture.start();
|
||||||
(actual_dest, hostname_uri) = resolve_actual_dest(&server_name, !no_cache).await?;
|
(actual_dest, hostname_uri) = resolve_actual_dest(&server_name, !no_cache).await?;
|
||||||
};
|
};
|
||||||
|
|
||||||
let plain = format!("Actual destination: {actual_dest} | Hostname URI: {hostname_uri}");
|
let msg = format!(
|
||||||
let html = format!("{}<br>{plain}", logs.lock().expect("locked"));
|
"{}\nDestination: {actual_dest}\nHostname URI: {hostname_uri}",
|
||||||
Ok(RoomMessageEventContent::text_html(plain, html))
|
logs.lock().expect("locked")
|
||||||
|
);
|
||||||
|
Ok(RoomMessageEventContent::text_markdown(msg))
|
||||||
}
|
}
|
||||||
|
|
||||||
#[must_use]
|
#[must_use]
|
||||||
|
|
|
@ -10,7 +10,7 @@ pub use data::Data;
|
||||||
use guard::Guard;
|
use guard::Guard;
|
||||||
pub use layer::{Layer, Value};
|
pub use layer::{Layer, Value};
|
||||||
pub use state::State;
|
pub use state::State;
|
||||||
pub use util::to_html;
|
pub use util::*;
|
||||||
|
|
||||||
pub type Filter = dyn Fn(Data<'_>) -> bool + Send + Sync + 'static;
|
pub type Filter = dyn Fn(Data<'_>) -> bool + Send + Sync + 'static;
|
||||||
pub type Closure = dyn FnMut(Data<'_>) + Send + Sync + 'static;
|
pub type Closure = dyn FnMut(Data<'_>) + Send + Sync + 'static;
|
||||||
|
|
|
@ -1,19 +1,37 @@
|
||||||
use std::sync::{Arc, Mutex};
|
use std::sync::{Arc, Mutex};
|
||||||
|
|
||||||
use super::{super::fmt, Closure};
|
use super::{
|
||||||
|
super::{fmt, Level},
|
||||||
|
Closure, Data,
|
||||||
|
};
|
||||||
|
use crate::Result;
|
||||||
|
|
||||||
pub fn to_html<S>(out: &Arc<Mutex<S>>) -> Box<Closure>
|
pub fn fmt_html<S>(out: Arc<Mutex<S>>) -> Box<Closure>
|
||||||
where
|
where
|
||||||
S: std::fmt::Write + Send + 'static,
|
S: std::fmt::Write + Send + 'static,
|
||||||
{
|
{
|
||||||
let out = out.clone();
|
fmt(fmt::html, out)
|
||||||
Box::new(move |data| {
|
}
|
||||||
fmt::html(
|
|
||||||
&mut *out.lock().expect("locked"),
|
pub fn fmt_markdown<S>(out: Arc<Mutex<S>>) -> Box<Closure>
|
||||||
&data.level(),
|
where
|
||||||
data.span_name(),
|
S: std::fmt::Write + Send + 'static,
|
||||||
data.message(),
|
{
|
||||||
)
|
fmt(fmt::markdown, out)
|
||||||
.expect("log line appended");
|
}
|
||||||
})
|
|
||||||
|
pub fn fmt<F, S>(fun: F, out: Arc<Mutex<S>>) -> Box<Closure>
|
||||||
|
where
|
||||||
|
F: Fn(&mut S, &Level, &str, &str) -> Result<()> + Send + Sync + Copy + 'static,
|
||||||
|
S: std::fmt::Write + Send + 'static,
|
||||||
|
{
|
||||||
|
Box::new(move |data| call(fun, &mut *out.lock().expect("locked"), &data))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn call<F, S>(fun: F, out: &mut S, data: &Data<'_>)
|
||||||
|
where
|
||||||
|
F: Fn(&mut S, &Level, &str, &str) -> Result<()>,
|
||||||
|
S: std::fmt::Write,
|
||||||
|
{
|
||||||
|
fun(out, &data.level(), data.span_name(), data.message()).expect("log line appended");
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,3 +16,32 @@ where
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn markdown<S>(out: &mut S, level: &Level, span: &str, msg: &str) -> Result<()>
|
||||||
|
where
|
||||||
|
S: Write,
|
||||||
|
{
|
||||||
|
let level = level.as_str().to_uppercase();
|
||||||
|
writeln!(out, "`{level:>5}` `{span:^12}` `{msg}`")?;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn markdown_table<S>(out: &mut S, level: &Level, span: &str, msg: &str) -> Result<()>
|
||||||
|
where
|
||||||
|
S: Write,
|
||||||
|
{
|
||||||
|
let level = level.as_str().to_uppercase();
|
||||||
|
writeln!(out, "| `{level:>5}` | `{span:^12}` | `{msg} |")?;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn markdown_table_head<S>(out: &mut S) -> Result<()>
|
||||||
|
where
|
||||||
|
S: Write,
|
||||||
|
{
|
||||||
|
write!(out, "| level | span | message |\n|------:|:----:|:--------|\n")?;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue