From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from gate001.proxmox.com (gate001.proxmox.com [45.144.208.40]) by lore.proxmox.com (Postfix) with ESMTPS id 1FAD81FF0AB for ; Wed, 07 Oct 2026 09:45:43 +0200 (CEST) Received: from gate001.proxmox.com (localhost.localdomain [127.0.0.1]) by gate001.proxmox.com (Proxmox) with ESMTP id B93D32139E; Wed, 07 Oct 2026 09:45:41 +0200 (CEST) From: Thomas Ellmenreich To: pdm-devel@lists.proxmox.com Subject: [PATCH proxmox 1/6] log: replace per layer filtering by one global filter Date: Wed, 7 Oct 2026 09:45:10 +0200 Message-ID: <20261007074527.102419-2-t.ellmenreich@proxmox.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20261007074527.102419-1-t.ellmenreich@proxmox.com> References: <20261007074527.102419-1-t.ellmenreich@proxmox.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Bm-Milter-Handled: 55990f41-d878-4baa-be0a-ee34c49e34d2 X-Bm-Transport-Timestamp: 1791359136351 X-SPAM-LEVEL: Spam detection results: 0 AWL 0.473 Adjusted score from AWL reputation of From: address DMARC_MISSING 0.1 Missing DMARC policy KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment (newer systems) KAM_SHORT 0.001 Use of a URL Shortener for very short URL RCVD_IN_DNSWL_MED -2.3 Sender listed at https://www.dnswl.org/, medium trust SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record Message-ID-Hash: LI7EPAKCWI4VFMNY5Z2HOW7PJ6PXJBOQ X-Message-ID-Hash: LI7EPAKCWI4VFMNY5Z2HOW7PJ6PXJBOQ X-MailFrom: t.ellmenreich@proxmox.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header CC: Thomas Ellmenreich X-Mailman-Version: 3.3.10 Precedence: list List-Id: Proxmox Datacenter Manager development discussion List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: Instead of filtering with the global filter on every layer, provide one global filter once, as described here: [0] This is also in preparation for filters that either have to be cloned or cannot be cloned at all, like EnvFilters* [1]. * EnvFilter can be cloned from tracing_subscriber version 0.3.20 onwards. [0]: https://docs.rs/tracing-subscriber/latest/tracing_subscriber/layer/index.html#global-filtering [1]: https://docs.rs/tracing-subscriber/latest/tracing_subscriber/filter/struct.EnvFilter.html Signed-off-by: Thomas Ellmenreich --- proxmox-log/src/builder.rs | 41 ++++++++++++-------------------------- 1 file changed, 13 insertions(+), 28 deletions(-) diff --git a/proxmox-log/src/builder.rs b/proxmox-log/src/builder.rs index 6fcf1cc9..fcc11ec5 100644 --- a/proxmox-log/src/builder.rs +++ b/proxmox-log/src/builder.rs @@ -1,7 +1,7 @@ use tracing::Level; use tracing::Metadata; use tracing::level_filters::LevelFilter; -use tracing_log::{AsLog, LogTracer}; +use tracing_log::LogTracer; use tracing_subscriber::Layer; use tracing_subscriber::layer::Context; use tracing_subscriber::layer::Filter; @@ -76,11 +76,7 @@ impl Logger { /// /// If the journal cannot be opened, print to stderr instead. pub fn journald(mut self) -> Logger { - self.layer.push( - journald_or_stderr_layer() - .with_filter(self.global_log_level) - .boxed(), - ); + self.layer.push(journald_or_stderr_layer().boxed()); self } @@ -90,12 +86,8 @@ impl Logger { /// no LogContext exists – which means we are not in a PBS workertask – or the level of the /// log message is 'ERROR'. pub fn journald_on_no_workertask(mut self) -> Logger { - self.layer.push( - journald_or_stderr_layer() - .with_filter(NoWorkerTask) - .with_filter(self.global_log_level) - .boxed(), - ); + self.layer + .push(journald_or_stderr_layer().with_filter(NoWorkerTask).boxed()); self } @@ -103,8 +95,7 @@ impl Logger { /// /// Check if a LogContext exists and if it does, print to the corresponding task log file. pub fn tasklog_pbs(mut self) -> Logger { - self.layer - .push(TasklogLayer {}.with_filter(self.global_log_level).boxed()); + self.layer.push(TasklogLayer {}.boxed()); self } @@ -112,11 +103,7 @@ impl Logger { /// /// Prints all the events to stderr with the compact format (no level, no timestamp). pub fn stderr(mut self) -> Logger { - self.layer.push( - plain_stderr_layer() - .with_filter(self.global_log_level) - .boxed(), - ); + self.layer.push(plain_stderr_layer().boxed()); self } @@ -126,12 +113,8 @@ impl Logger { /// triggered if no workertask could be found (no LogContext exists) or the event level is /// `ERROR`. pub fn stderr_on_no_workertask(mut self) -> Logger { - self.layer.push( - plain_stderr_layer() - .with_filter(NoWorkerTask) - .with_filter(self.global_log_level) - .boxed(), - ); + self.layer + .push(plain_stderr_layer().with_filter(NoWorkerTask).boxed()); self } @@ -143,7 +126,6 @@ impl Logger { let layer = tracing_subscriber::fmt::layer() .event_format(PveTaskFormatter {}) .with_writer(std::io::stderr) - .with_filter(self.global_log_level) .boxed(); self.layer.push(layer); self @@ -153,10 +135,13 @@ impl Logger { /// /// Also configures the `LogTracer` which will convert all `log` events to tracing events. pub fn init(self) -> Result<(), anyhow::Error> { - let registry = tracing_subscriber::registry().with(self.layer); + let registry = tracing_subscriber::registry() + .with(self.layer) + .with(self.global_log_level); + tracing::subscriber::set_global_default(registry)?; - LogTracer::init_with_filter(self.global_log_level.as_log())?; + LogTracer::init()?; Ok(()) } } -- 2.47.3