all lists on lists.proxmox.com
 help / color / mirror / Atom feed
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 2/4] log: add logger for perlmod crates
Date: Mon,  9 Dec 2024 10:43:27 +0100	[thread overview]
Message-ID: <20241209094329.134802-3-g.goller@proxmox.com> (raw)
In-Reply-To: <20241209094329.134802-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               | 25 +++++++++++++++++++++
 proxmox-log/src/lib.rs                |  1 +
 proxmox-log/src/pve_task_formatter.rs | 31 +++++++++++++++++++++++++++
 3 files changed, 57 insertions(+)
 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 cd3bdae80fe7..3b4fa0e4ea20 100644
--- a/proxmox-log/src/init.rs
+++ b/proxmox-log/src/init.rs
@@ -95,3 +95,28 @@ 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(())
+}
diff --git a/proxmox-log/src/lib.rs b/proxmox-log/src/lib.rs
index ee1885a77db3..7734f6fba19f 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


  parent reply	other threads:[~2024-12-09  9:44 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-12-09  9:43 [pbs-devel] [PATCH proxmox{, -backup, -perl-rs} 0/4] Rename/Move logging init helper Gabriel Goller
2024-12-09  9:43 ` [pbs-devel] [PATCH proxmox 1/4] log: rename/move init functions Gabriel Goller
2024-12-09  9:43 ` Gabriel Goller [this message]
2024-12-09  9:43 ` [pbs-devel] [PATCH proxmox-backup 3/4] log: use new " Gabriel Goller
2024-12-09  9:43 ` [pbs-devel] [PATCH proxmox-perl-rs 4/4] log: use new init function, print to stderr and journald Gabriel Goller
2024-12-09 10:41 ` [pbs-devel] [PATCH proxmox{, -backup, -perl-rs} 0/4] Rename/Move logging init helper 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=20241209094329.134802-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.
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal