From: Gabriel Goller <g.goller@proxmox.com>
To: pbs-devel@lists.proxmox.com
Cc: Lukas Wagner <l.wagner@proxmox.com>
Subject: [pbs-devel] [PATCH proxmox v2 2/4] log: add logger for perlmod crates
Date: Mon, 9 Dec 2024 11:46:04 +0100 [thread overview]
Message-ID: <20241209104606.263045-3-g.goller@proxmox.com> (raw)
In-Reply-To: <20241209104606.263045-1-g.goller@proxmox.com>
Add logger for perlmod crates that always prints to stderr (with a
specific format, which will end up in the tasklog) and to journald.
Reported-by: Lukas Wagner <l.wagner@proxmox.com>
Signed-off-by: Gabriel Goller <g.goller@proxmox.com>
---
proxmox-log/src/init.rs | 29 ++++++++++++++++++++++++-
proxmox-log/src/lib.rs | 1 +
proxmox-log/src/pve_task_formatter.rs | 31 +++++++++++++++++++++++++++
3 files changed, 60 insertions(+), 1 deletion(-)
create mode 100644 proxmox-log/src/pve_task_formatter.rs
diff --git a/proxmox-log/src/init.rs b/proxmox-log/src/init.rs
index 67efa9fcc81f..f2edcbec6a13 100644
--- a/proxmox-log/src/init.rs
+++ b/proxmox-log/src/init.rs
@@ -3,7 +3,8 @@ use tracing_log::{AsLog, LogTracer};
use tracing_subscriber::{filter::filter_fn, layer::SubscriberExt, Layer};
use crate::{
- get_env_variable, journald_or_stderr_layer, plain_stderr_layer, tasklog_layer::TasklogLayer, LogContext
+ get_env_variable, journald_or_stderr_layer, plain_stderr_layer,
+ pve_task_formatter::PveTaskFormatter, tasklog_layer::TasklogLayer, LogContext,
};
/// Inits a new tracing logger that prints to journald or tasklog with the logging level specified in the
@@ -94,6 +95,32 @@ pub fn journald(env_var: &str, default_log_level: LevelFilter) -> Result<(), any
Ok(())
}
+/// Inits a new tracing logger that prints to stderr and journald with the logging level specified
+/// in the environment variable `env_var`.
+///
+/// Prints every message to stderr with a pve-specific format and journald (the fallback will be
+/// stderr as well). The output format for stderr will be "DEBUG: ...msg.." (equivalent to the
+/// pve-workertask format). If `env_var` does not exist or doesn't contain a readable log level,
+/// the `default_log_level` will be used.
+pub fn stderr_and_journald_with_pve_format(
+ env_var: &str,
+ default_log_level: LevelFilter,
+) -> Result<(), anyhow::Error> {
+ let log_level = get_env_variable(env_var, default_log_level);
+
+ let stderr_layer = tracing_subscriber::fmt::layer()
+ .event_format(PveTaskFormatter {})
+ .with_writer(std::io::stderr);
+
+ let registry = tracing_subscriber::registry()
+ .with(tracing_journald::layer().ok().with_filter(log_level))
+ .with(stderr_layer.with_filter(log_level));
+
+ tracing::subscriber::set_global_default(registry)?;
+ LogTracer::init_with_filter(log_level.as_log())?;
+ Ok(())
+}
+
/// Inits a new tracing logger that prints to journald and tasklog with the logging level specified in the
/// environment variable `env_var`.
///
diff --git a/proxmox-log/src/lib.rs b/proxmox-log/src/lib.rs
index 50f63699336f..f5e448fb7f79 100644
--- a/proxmox-log/src/lib.rs
+++ b/proxmox-log/src/lib.rs
@@ -12,6 +12,7 @@ use tracing_subscriber::filter::filter_fn;
use tracing_subscriber::prelude::*;
mod file_logger;
+mod pve_task_formatter;
mod tasklog_layer;
pub mod init;
diff --git a/proxmox-log/src/pve_task_formatter.rs b/proxmox-log/src/pve_task_formatter.rs
new file mode 100644
index 000000000000..e9866a4b0869
--- /dev/null
+++ b/proxmox-log/src/pve_task_formatter.rs
@@ -0,0 +1,31 @@
+use std::fmt;
+use tracing::{Event, Subscriber};
+use tracing_subscriber::field::VisitOutput;
+use tracing_subscriber::fmt::format::{DefaultVisitor, Writer};
+use tracing_subscriber::fmt::{FmtContext, FormatEvent, FormatFields};
+use tracing_subscriber::registry::LookupSpan;
+
+/// This custom formatter outputs logs as they are visible in the PVE task log.
+///
+/// e.g.: "DEBUG: sample message"
+pub struct PveTaskFormatter {}
+
+impl<C, N> FormatEvent<C, N> for PveTaskFormatter
+where
+ C: Subscriber + for<'a> LookupSpan<'a>,
+ N: for<'a> FormatFields<'a> + 'static,
+{
+ fn format_event(
+ &self,
+ _ctx: &FmtContext<'_, C, N>,
+ mut writer: Writer<'_>,
+ event: &Event<'_>,
+ ) -> fmt::Result {
+ write!(writer, "{}: ", event.metadata().level().as_str())?;
+
+ let mut v = DefaultVisitor::new(writer.by_ref(), true);
+ event.record(&mut v);
+ v.finish()?;
+ writer.write_char('\n')
+ }
+}
--
2.39.5
_______________________________________________
pbs-devel mailing list
pbs-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel
next prev parent reply other threads:[~2024-12-09 10:46 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-12-09 10:46 [pbs-devel] [PATCH proxmox{, -backup, -perl-rs} v2 0/4] Rename/Move logging init helper Gabriel Goller
2024-12-09 10:46 ` [pbs-devel] [PATCH proxmox v2 1/4] log: rename/move init functions Gabriel Goller
2025-02-10 14:37 ` Wolfgang Bumiller
2025-02-10 16:42 ` Gabriel Goller
2025-02-11 9:22 ` Wolfgang Bumiller
2025-02-11 9:28 ` Wolfgang Bumiller
2025-02-17 13:08 ` Gabriel Goller
2025-02-17 13:38 ` Wolfgang Bumiller
2025-02-17 14:12 ` Gabriel Goller
2025-02-17 14:51 ` Wolfgang Bumiller
2025-02-17 15:21 ` Gabriel Goller
2025-02-18 10:06 ` Wolfgang Bumiller
2025-02-18 16:15 ` Gabriel Goller
2025-02-11 9:31 ` Gabriel Goller
2024-12-09 10:46 ` Gabriel Goller [this message]
2024-12-09 10:46 ` [pbs-devel] [PATCH proxmox-backup v2 3/4] log: use new " Gabriel Goller
2024-12-09 10:46 ` [pbs-devel] [PATCH proxmox-perl-rs v2 4/4] log: use new init function, print to stderr and journald Gabriel Goller
2025-01-09 10:09 ` [pbs-devel] [PATCH proxmox{, -backup, -perl-rs} v2 0/4] Rename/Move logging init helper Lukas Wagner
2025-01-14 8:43 ` Gabriel Goller
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20241209104606.263045-3-g.goller@proxmox.com \
--to=g.goller@proxmox.com \
--cc=l.wagner@proxmox.com \
--cc=pbs-devel@lists.proxmox.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.