From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [IPv6:2a01:7e0:0:424::9]) by lore.proxmox.com (Postfix) with ESMTPS id D9FAA1FF173 for ; Mon, 9 Dec 2024 10:44:01 +0100 (CET) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 05C962DA59; Mon, 9 Dec 2024 10:44:06 +0100 (CET) From: Gabriel Goller To: pbs-devel@lists.proxmox.com Date: Mon, 9 Dec 2024 10:43:27 +0100 Message-Id: <20241209094329.134802-3-g.goller@proxmox.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20241209094329.134802-1-g.goller@proxmox.com> References: <20241209094329.134802-1-g.goller@proxmox.com> MIME-Version: 1.0 X-SPAM-LEVEL: Spam detection results: 0 AWL -0.036 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% DMARC_MISSING 0.1 Missing DMARC policy KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment RCVD_IN_VALIDITY_CERTIFIED_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to Validity was blocked. See https://knowledge.validity.com/hc/en-us/articles/20961730681243 for more information. RCVD_IN_VALIDITY_RPBL_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to Validity was blocked. See https://knowledge.validity.com/hc/en-us/articles/20961730681243 for more information. RCVD_IN_VALIDITY_SAFE_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to Validity was blocked. See https://knowledge.validity.com/hc/en-us/articles/20961730681243 for more information. SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record Subject: [pbs-devel] [PATCH proxmox 2/4] log: add logger for perlmod crates X-BeenThere: pbs-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox Backup Server development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: Proxmox Backup Server development discussion Cc: Lukas Wagner Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: pbs-devel-bounces@lists.proxmox.com Sender: "pbs-devel" 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 Signed-off-by: Gabriel Goller --- 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 FormatEvent 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