From mboxrd@z Thu Jan  1 00:00:00 1970
Return-Path: <pbs-devel-bounces@lists.proxmox.com>
Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68])
	by lore.proxmox.com (Postfix) with ESMTPS id CE3C11FF16E
	for <inbox@lore.proxmox.com>; Mon, 17 Feb 2025 16:21:56 +0100 (CET)
Received: from firstgate.proxmox.com (localhost [127.0.0.1])
	by firstgate.proxmox.com (Proxmox) with ESMTP id 1361F2BF0B;
	Mon, 17 Feb 2025 16:21:54 +0100 (CET)
Date: Mon, 17 Feb 2025 16:21:19 +0100
From: Gabriel Goller <g.goller@proxmox.com>
To: Wolfgang Bumiller <w.bumiller@proxmox.com>
Message-ID: <2yyeufgkcyl3nhkztrynakfbj5q5s35afo4mpkpdowjab2pxam@dufv5c2fpui3>
References: <20241209104606.263045-1-g.goller@proxmox.com>
 <20241209104606.263045-2-g.goller@proxmox.com>
 <5cettqvqg6i6y2cgihynjjirl4vyl6c5l3ewbn4ydhccpgc6ac@aj5yojr624d4>
 <yyzfsgf2p5k52fk67lsu6jzu42egxjqnfgywuermm75ijm7cwg@v4x56bymmlxq>
 <2cugfnfjfv2robousxhdshdu3rxmyg3bnfdazoyagvn5gglatl@6x4trum24nak>
 <iidtwwpusvqkcqw6sh7e7mqqnlhu37icz5k77ps5wro2nenr7b@gqi7k24dsw4n>
 <4iymtwe46mmc7zn6f2erjkfxhal76ma2xy2fh2d4rk2vaqpik4@7n363ok7f5yf>
 <xgi5aiiutasg2353yvgfalsvmq3at6ivsm3gpny42dce3a7mj7@brxsvu2dduhp>
 <j4r7odcmrgzwjcjtofsrtu3dp6mo4cwl2rjozpxsf4ytze5f5s@65euvf7zi2z7>
 <sb6fqudqt4jrewfugeafluk2czmzh34zkzgzlg4aadtuhinsle@ds3vqwr2wypo>
MIME-Version: 1.0
Content-Disposition: inline
In-Reply-To: <sb6fqudqt4jrewfugeafluk2czmzh34zkzgzlg4aadtuhinsle@ds3vqwr2wypo>
User-Agent: NeoMutt/20241002-35-39f9a6
X-SPAM-LEVEL: Spam detection results:  0
 AWL -0.032 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: Re: [pbs-devel] [PATCH proxmox v2 1/4] log: rename/move init
 functions
X-BeenThere: pbs-devel@lists.proxmox.com
X-Mailman-Version: 2.1.29
Precedence: list
List-Id: Proxmox Backup Server development discussion
 <pbs-devel.lists.proxmox.com>
List-Unsubscribe: <https://lists.proxmox.com/cgi-bin/mailman/options/pbs-devel>, 
 <mailto:pbs-devel-request@lists.proxmox.com?subject=unsubscribe>
List-Archive: <http://lists.proxmox.com/pipermail/pbs-devel/>
List-Post: <mailto:pbs-devel@lists.proxmox.com>
List-Help: <mailto:pbs-devel-request@lists.proxmox.com?subject=help>
List-Subscribe: <https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel>, 
 <mailto:pbs-devel-request@lists.proxmox.com?subject=subscribe>
Reply-To: Proxmox Backup Server development discussion
 <pbs-devel@lists.proxmox.com>
Cc: Lukas Wagner <l.wagner@proxmox.com>, pbs-devel@lists.proxmox.com
Content-Transfer-Encoding: 7bit
Content-Type: text/plain; charset="us-ascii"; Format="flowed"
Errors-To: pbs-devel-bounces@lists.proxmox.com
Sender: "pbs-devel" <pbs-devel-bounces@lists.proxmox.com>

>> > > <snip>
>> > >
>> > > I cooked up a simple builder type thingy to build layers:
>> > >
>> > >
>> > >     struct LogBuilder {
>> > >         global_log_level: LevelFilter,
>> > >         layer: Vec<
>> > >             Box<dyn tracing_subscriber::Layer<tracing_subscriber::Registry> + Send + Sync + 'static>,
>> > >         >,
>> > >     }
>> > >
>> > >
>> > > And the implementation:
>> > >
>> > >     impl LogBuilder {
>> > >         pub fn from_env(env_var: &str, default_log_level: LevelFilter) -> LogBuilder {
>> > >             let log_level = get_env_variable(env_var, default_log_level);
>> > >             LogBuilder {
>> > >                 global_log_level: log_level,
>> > >                 layer: vec![],
>> > >             }
>> > >         }
>> > >
>> > >         pub fn journald_or_stderr(mut self) -> LogBuilder {
>> > >             self.layer.push(
>> > >                 journald_or_stderr_layer()
>> > >                     .with_filter(self.global_log_level)
>> > >                     .boxed(),
>> > >             );
>> > >             self
>> > >         }
>> > >
>> > >         pub fn journald_or_stderr_on_logcontext_and_error(mut self) -> LogBuilder {
>> > >             self.layer.push(
>> > >                 journald_or_stderr_layer()
>> > >                     .with_filter(filter_fn(|metadata| {
>> > >                         !LogContext::exists() || *metadata.level() == Level::ERROR
>> > >                     }))
>> > >                     .with_filter(self.global_log_level)
>> > >                     .boxed(),
>> > >             );
>> > >             self
>> > >         }
>> > >
>> > >         //...
>> > >
>> > >         pub fn init(self) -> Result<(), anyhow::Error> {
>> > >             let registry = tracing_subscriber::registry().with(self.layer);
>> > >             tracing::subscriber::set_global_default(registry)?;
>> > >
>> > >             LogTracer::init_with_filter(self.global_log_level.as_log())?;
>> > >             Ok(())
>> > >         }
>> > >     }
>> > >
>> > > We could place this in a new builder module and then have the
>> > > product-specific functions (e.g. init_pve_log, init_perlmod_log,
>> > > init_pbs_log, etc.) in the init module.
>> > >
>> > > What do you think?
>> >
>> > Hmmm...
>> > Those names are a bit long, and still as specific as before, so I'm not
>> > sure we win a lot either way.
>> >
>> > I'm wondering - if we really have so many specific cases - do we really
>> > need them implemented in this crate, rather than where they are used?
>> > How many different types of logging layers do we have and where atm?
>>
>> We currently have:
>>  1) journald (with stderr fallback)
>
>=> builder.journald_logging()
>
>(the fallback could just be implied, or do we ever not want that?)

true, I don't think we want to fail anywhere if there is no journald
anyway.

>>  2) stderr
>
>=> builder.stderr_logging()
>
>>  3) stderr (with pve formatting)
>
>=> builder.pve_logging() (#[cfg(feature = "pve")]?)

Maybe stderr_pve_logging? I'd like to mention 'stderr' somewhere in the
case we add some different pve-format logging (e.g. pve-tasklog).

>>  4) pbs tasklog
>^ I assume (4) is the "tasklog-or-journald" case?
>Not sure where (1) is really the right choice.
>
>Does (4) exist anywhere other than in the API daemons?
>
>=> builder.task_logging()
>
>(the journal-if-not-in-task part could be implied - or do we ever need
>to combine the tasklog part differently?)

Yes, in the proxmox-backup-manager. There we use stderr for all the
normal logs and the tasklogger for when we a task is started.

>> But the problem is we have different combinations and filters as well:
>> journald and stderr (perlmod), stderr and pbs tasklog (but only when we
>> are in a tasklog or when the level is error) (pbs-client), etc.
>
>^ Why is "pbs-client" the example here? IMO this sounds like the API
>daemons. The pbs-client *CLI* tool certainly should just log to stderr,
>and the "crate" otherwise doesn't decide this.

Oops, my bad I meant the proxmox-backup-manager.

>> The logging gets initiated in:
>
>(list below is reordered)
>
>>  * pbs proxy daemon
>>  * pbs api daemon
>
>^ API daemons - so those are case (4) - are they different from one
>another?

Nope, this is case 4. (To be exact case 1 + 4, journald + tasklog.)
Also you need to add filters here, this isn't just a "print everything
to journald", we only print to journald when the level is error or we
are *not* in a tasklog.

>>  * pbs proxmox-file-restore
>
>^ The VM side? Not sure what it needs, but seems special-enough to have
>its own code, unless we just log to the journal anyway

As far as I remember this one should print to stderr only. (This is
wrong in this patch.)

>>  * pbs tape pmt
>>  * pbs tape pmtx
>>  * pbs client
>>  * pbs pxar
>>  * pbs proxmox-backup-debug
>>  * pbs proxmox-backup-manager
>>  * pbs proxmox-backup-tape
>>  * pbs sg-tape-cmd
>
>^ IIRC all of these are CLI tools and should therefore all be case (2) -
>although I don't know about how the tape stuff works.
>If they do anything else, it would be good to know why and have this
>documented either in proxmox-log or in their logging-init functions.

All except the proxmox-backup-manager as far as I can see, because that
one starts pbs tasks directly.

>>  * pbs proxmox-daily-update
>
>The 'daily-update' may be a special case and could use the journal
>directly, but may as well be stderr->journald via its `.service`.
>But, yeah, obviously it would make actual tracing/debugging easier with
>a proper journald-logger here. So another user of case (1).

Agree.

>>  * perlmod
>^ For the lack of a better place (as pve, pmg and nftables code probably
>all want to share it), having this as a special function in proxmox-log
>makes some sense I suppose (but could be feature-guarded).

There is already a shared common::init_logger function in perlmod I think.

>> Exposing the builder directly without any helper functions would be fine
>> as well I reckon. The downside is that the initiation gets more
>> "complicated", e.g. (the pbs daemon):
>>
>>     LogBuilder::from_env("PBS_LOG", LevelFilter::INFO)
>>         .journald_on_no_tasklog_or_error()
>>         .tasklog().init()?;
>
>So yes this is probably okay to have, but I really don't think we need
>these huge names - like I said, it doesn't make sense to me that
>`.tasklog()` should be combined with anything other than this exact one
>other thing anyway, so the middle line there could just be left out IMO.

See above.
Also either we use a helper function which does everything for us (e.g.
init_perlmod_logger, init_journald_and_tasklog) or we use the builder
where we *need* to mention every layer separately. Otherwise you have different
builder functions, some which add a single layer and others that add
multiple layers + magic (which IMO is a mess).




_______________________________________________
pbs-devel mailing list
pbs-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel