mirror of
https://github.com/matter-labs/teepot.git
synced 2025-07-21 15:13:56 +02:00
feat(logging): centralize logging setup in teepot crate
- Added a new logging module in `teepot` crate. - Removed redundant logging setup code from individual projects. - Updated dependencies and references for logging setup. Signed-off-by: Harald Hoyer <harald@matterlabs.dev>
This commit is contained in:
parent
2ff3b1168d
commit
af3ab51320
7 changed files with 85 additions and 68 deletions
2
Cargo.lock
generated
2
Cargo.lock
generated
|
@ -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",
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
63
crates/teepot/src/log/mod.rs
Normal file
63
crates/teepot/src/log/mod.rs
Normal 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(())
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue