diff --git a/Cargo.lock b/Cargo.lock index 184f43a..5ce4dc5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4460,6 +4460,7 @@ dependencies = [ "serde", "serde_json", "state-reconstruct-fetcher", + "syslog-tracing", "thiserror", "tikv-jemallocator", "tokio", @@ -4569,6 +4570,17 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" +[[package]] +name = "syslog-tracing" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f890b68f60eb7e87373b3b8f1f412d2a7d90460cd18294acbc0e90ba496193e" +dependencies = [ + "libc", + "tracing-core", + "tracing-subscriber", +] + [[package]] name = "system-configuration" version = "0.5.1" diff --git a/Cargo.toml b/Cargo.toml index 1c6ffda..2b6df2e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -26,6 +26,7 @@ rocksdb = "0.21" serde = { version = "1.0.189", features = ["derive"] } serde_json = { version = "1.0.107", features = ["std"] } state-reconstruct-fetcher = { path = "./state-reconstruct-fetcher" } +syslog-tracing = "0.2.0" thiserror = "1.0.50" tikv-jemallocator = "0.5" tokio = { version = "1.33.0", features = ["macros"] } diff --git a/src/cli.rs b/src/cli.rs index f5ca19f..a24a260 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -116,6 +116,9 @@ pub enum Command { #[derive(Parser)] #[command(author, version, about = "zkSync state reconstruction tool")] pub struct Cli { + #[arg(long, default_value_t = false)] + pub with_syslog: bool, + #[command(subcommand)] pub subcommand: Command, } diff --git a/src/main.rs b/src/main.rs index 12657f7..51821b3 100644 --- a/src/main.rs +++ b/src/main.rs @@ -7,6 +7,7 @@ mod util; use std::{ env, + ffi::CStr, fs::File, io::BufReader, path::{Path, PathBuf}, @@ -18,10 +19,11 @@ use eyre::Result; use processor::snapshot::{ exporter::SnapshotExporter, importer::SnapshotImporter, SnapshotBuilder, }; +use syslog_tracing::Syslog; use state_reconstruct_fetcher::{constants::storage, l1_fetcher::L1Fetcher, types::CommitBlock}; use tikv_jemallocator::Jemalloc; use tokio::sync::mpsc; -use tracing_subscriber::{filter::LevelFilter, EnvFilter}; +use tracing_subscriber::{filter::LevelFilter, prelude::*, registry::Registry, EnvFilter}; use crate::{ processor::{ @@ -35,30 +37,40 @@ use crate::{ #[global_allocator] static GLOBAL: Jemalloc = Jemalloc; -fn start_logger(default_level: LevelFilter) { +fn start_logger(default_level: LevelFilter, with_syslog: bool) { let filter = match EnvFilter::try_from_default_env() { - Ok(filter) => filter - .add_directive("hyper=off".parse().unwrap()) - .add_directive("ethers=off".parse().unwrap()), - _ => EnvFilter::default() - .add_directive(default_level.into()) - .add_directive("hyper=off".parse().unwrap()) - .add_directive("ethers=off".parse().unwrap()) - .add_directive("zksync_storage=off".parse().unwrap()), + Ok(filter) => filter, + _ => EnvFilter::default().add_directive(default_level.into()), }; - - tracing_subscriber::fmt() - .with_env_filter(filter) - .with_target(false) - .init(); + let filter = filter + .add_directive("hyper=off".parse().unwrap()) + .add_directive("ethers=off".parse().unwrap()); + + let default_layer = tracing_subscriber::fmt::layer().with_target(false); + + let subscriber = Registry::default().with(filter).with(default_layer); + + if with_syslog { + let identity = CStr::from_bytes_with_nul(b"zksync-sr\0").unwrap(); + let (options, facility) = Default::default(); + let syslog = Syslog::new(identity, options, facility).unwrap(); + let syslog_layer = tracing_subscriber::fmt::layer() + .with_target(false) + .with_ansi(false) + .without_time() // Syslog logs its own time. + .with_writer(syslog); + + subscriber.with(syslog_layer).init(); + } else { + subscriber.init(); + } } #[tokio::main] #[allow(clippy::too_many_lines)] async fn main() -> Result<()> { - start_logger(LevelFilter::INFO); - let cli = Cli::parse(); + start_logger(LevelFilter::INFO, cli.with_syslog); match cli.subcommand { Command::Reconstruct {