Merge pull request #212 from matter-labs/logging

feat(logging): centralize logging setup in teepot crate
This commit is contained in:
Harald Hoyer 2024-09-18 16:38:39 +02:00 committed by GitHub
commit 1a8a9f17fa
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 85 additions and 68 deletions

2
Cargo.lock generated
View file

@ -4952,6 +4952,8 @@ dependencies = [
"testaso", "testaso",
"thiserror", "thiserror",
"tracing", "tracing",
"tracing-log 0.2.0",
"tracing-subscriber",
"webpki-roots", "webpki-roots",
"x509-cert", "x509-cert",
"zeroize", "zeroize",

View file

@ -15,12 +15,11 @@ use teepot::json::http::{
SignRequest, SignRequestData, SignResponse, VaultCommandRequest, VaultCommands, SignRequest, SignRequestData, SignResponse, VaultCommandRequest, VaultCommands,
VaultCommandsResponse, DIGEST_URL, VaultCommandsResponse, DIGEST_URL,
}; };
use teepot::log::{setup_logging, LogLevelParser};
use teepot::server::signatures::verify_sig; use teepot::server::signatures::verify_sig;
use teepot::sgx::sign::Signature; use teepot::sgx::sign::Signature;
use tracing::level_filters::LevelFilter;
use tracing::{error, info}; use tracing::{error, info};
use tracing_log::LogTracer;
use tracing_subscriber::Registry;
use tracing_subscriber::{fmt, prelude::*, EnvFilter};
#[derive(Args, Debug)] #[derive(Args, Debug)]
struct SendArgs { struct SendArgs {
@ -101,18 +100,18 @@ enum SubCommands {
struct Arguments { struct Arguments {
#[clap(subcommand)] #[clap(subcommand)]
cmd: SubCommands, cmd: SubCommands,
/// Log level for the log output.
/// Valid values are: `off`, `error`, `warn`, `info`, `debug`, `trace`
#[clap(long, default_value_t = LevelFilter::WARN, value_parser = LogLevelParser)]
pub log_level: LevelFilter,
} }
#[actix_web::main] #[actix_web::main]
async fn main() -> Result<()> { async fn main() -> Result<()> {
LogTracer::init().context("Failed to set logger")?;
let subscriber = Registry::default()
.with(EnvFilter::from_default_env())
.with(fmt::layer().with_writer(std::io::stderr));
tracing::subscriber::set_global_default(subscriber).unwrap();
let args = Arguments::parse(); let args = Arguments::parse();
setup_logging(&args.log_level)?;
info!("Quote verified! Connection secure!"); info!("Quote verified! Connection secure!");
match args.cmd { match args.cmd {

View file

@ -4,6 +4,7 @@
use anyhow::{anyhow, Result}; use anyhow::{anyhow, Result};
use clap::{ArgGroup, Args, Parser}; use clap::{ArgGroup, Args, Parser};
use std::time::Duration; use std::time::Duration;
use teepot::log::LogLevelParser;
use teepot::sgx::{parse_tcb_levels, EnumSet, TcbLevel}; use teepot::sgx::{parse_tcb_levels, EnumSet, TcbLevel};
use tracing_subscriber::filter::LevelFilter; use tracing_subscriber::filter::LevelFilter;
use url::Url; use url::Url;
@ -18,6 +19,8 @@ use zksync_types::L2ChainId;
.args(&["batch_range", "continuous"]), .args(&["batch_range", "continuous"]),
))] ))]
pub struct Arguments { pub struct Arguments {
/// Log level for the log output.
/// Valid values are: `off`, `error`, `warn`, `info`, `debug`, `trace`
#[clap(long, default_value_t = LevelFilter::WARN, value_parser = LogLevelParser)] #[clap(long, default_value_t = LevelFilter::WARN, value_parser = LogLevelParser)]
pub log_level: LevelFilter, pub log_level: LevelFilter,
/// The batch number or range of batch numbers to verify the attestation and signature (e.g., /// The batch number or range of batch numbers to verify the attestation and signature (e.g.,
@ -90,34 +93,3 @@ fn parse_duration(s: &str) -> Result<Duration> {
let millis = s.parse()?; let millis = s.parse()?;
Ok(Duration::from_millis(millis)) Ok(Duration::from_millis(millis))
} }
#[derive(Clone)]
struct LogLevelParser;
impl clap::builder::TypedValueParser for LogLevelParser {
type Value = LevelFilter;
fn parse_ref(
&self,
cmd: &clap::Command,
arg: Option<&clap::Arg>,
value: &std::ffi::OsStr,
) -> Result<Self::Value, clap::Error> {
clap::builder::TypedValueParser::parse(self, cmd, arg, value.to_owned())
}
fn parse(
&self,
cmd: &clap::Command,
arg: Option<&clap::Arg>,
value: std::ffi::OsString,
) -> std::result::Result<Self::Value, clap::Error> {
use std::str::FromStr;
let p = clap::builder::PossibleValuesParser::new([
"off", "error", "warn", "info", "debug", "trace",
]);
let v = p.parse(cmd, arg, value)?;
Ok(LevelFilter::from_str(&v).unwrap())
}
}

View file

@ -8,23 +8,21 @@ mod client;
mod proof; mod proof;
mod verification; mod verification;
use anyhow::{Context, Result}; use crate::verification::{
log_quote_verification_summary, verify_attestation_quote, verify_batch_proof,
};
use anyhow::Result;
use args::{Arguments, AttestationPolicyArgs}; use args::{Arguments, AttestationPolicyArgs};
use clap::Parser; use clap::Parser;
use client::MainNodeClient; use client::MainNodeClient;
use proof::get_proofs; use proof::get_proofs;
use reqwest::Client; use reqwest::Client;
use teepot::log::setup_logging;
use tokio::{signal, sync::watch}; use tokio::{signal, sync::watch};
use tracing::{debug, error, info, trace, warn}; use tracing::{debug, error, info, trace, warn};
use tracing_log::LogTracer;
use tracing_subscriber::{filter::LevelFilter, fmt, prelude::*, EnvFilter, Registry};
use url::Url; use url::Url;
use zksync_basic_types::L1BatchNumber; use zksync_basic_types::L1BatchNumber;
use crate::verification::{
log_quote_verification_summary, verify_attestation_quote, verify_batch_proof,
};
#[tokio::main] #[tokio::main]
async fn main() -> Result<()> { async fn main() -> Result<()> {
let args = Arguments::parse(); let args = Arguments::parse();
@ -45,26 +43,6 @@ async fn main() -> Result<()> {
Ok(()) Ok(())
} }
fn setup_logging(log_level: &LevelFilter) -> Result<()> {
LogTracer::init().context("Failed to set logger")?;
let filter = EnvFilter::builder()
.try_from_env()
.unwrap_or(match *log_level {
LevelFilter::OFF => EnvFilter::new("off"),
_ => EnvFilter::new(format!(
"warn,{crate_name}={log_level},teepot={log_level}",
crate_name = env!("CARGO_CRATE_NAME"),
log_level = log_level
)),
});
let subscriber = Registry::default()
.with(filter)
.with(fmt::layer().with_writer(std::io::stderr));
tracing::subscriber::set_global_default(subscriber)?;
Ok(())
}
fn validate_arguments(args: &Arguments) -> Result<()> { fn validate_arguments(args: &Arguments) -> Result<()> {
if args.attestation_policy.sgx_mrsigners.is_none() if args.attestation_policy.sgx_mrsigners.is_none()
&& args.attestation_policy.sgx_mrenclaves.is_none() && args.attestation_policy.sgx_mrenclaves.is_none()

View file

@ -39,6 +39,8 @@ sha2.workspace = true
signature.workspace = true signature.workspace = true
thiserror.workspace = true thiserror.workspace = true
tracing.workspace = true tracing.workspace = true
tracing-log.workspace = true
tracing-subscriber.workspace = true
webpki-roots.workspace = true webpki-roots.workspace = true
x509-cert.workspace = true x509-cert.workspace = true
zeroize.workspace = true zeroize.workspace = true

View file

@ -11,4 +11,5 @@ pub mod json;
pub mod server; pub mod server;
pub mod sgx; pub mod sgx;
pub mod log;
pub mod quote; pub mod quote;

View file

@ -0,0 +1,63 @@
// SPDX-License-Identifier: Apache-2.0
// Copyright (c) 2024 Matter Labs
//! Logging related stuff
use anyhow::Context;
use tracing::level_filters::LevelFilter;
use tracing_log::LogTracer;
use tracing_subscriber::Registry;
use tracing_subscriber::{fmt, prelude::*, EnvFilter};
/// A log level parser for clap, with "off", "error", "warn", "info", "debug", "trace" as valid values
#[derive(Clone)]
pub struct LogLevelParser;
impl clap::builder::TypedValueParser for LogLevelParser {
type Value = LevelFilter;
fn parse_ref(
&self,
cmd: &clap::Command,
arg: Option<&clap::Arg>,
value: &std::ffi::OsStr,
) -> anyhow::Result<Self::Value, clap::Error> {
clap::builder::TypedValueParser::parse(self, cmd, arg, value.to_owned())
}
fn parse(
&self,
cmd: &clap::Command,
arg: Option<&clap::Arg>,
value: std::ffi::OsString,
) -> std::result::Result<Self::Value, clap::Error> {
use std::str::FromStr;
let p = clap::builder::PossibleValuesParser::new([
"off", "error", "warn", "info", "debug", "trace",
]);
let v = p.parse(cmd, arg, value)?;
Ok(LevelFilter::from_str(&v).unwrap())
}
}
/// Setup standard logging and loglevel for the current crate and the `teepot` crate.
pub fn setup_logging(log_level: &LevelFilter) -> anyhow::Result<()> {
LogTracer::init().context("Failed to set logger")?;
let filter = EnvFilter::builder()
.try_from_env()
.unwrap_or(match *log_level {
LevelFilter::OFF => EnvFilter::new("off"),
_ => EnvFilter::new(format!(
"warn,{crate_name}={log_level},teepot={log_level}",
crate_name = env!("CARGO_CRATE_NAME"),
log_level = log_level
)),
});
let subscriber = Registry::default()
.with(filter)
.with(fmt::layer().with_writer(std::io::stderr));
tracing::subscriber::set_global_default(subscriber)?;
Ok(())
}