From c913404739bb44c340737f9f4adc72fdc3478f23 Mon Sep 17 00:00:00 2001 From: anastasia Date: Thu, 8 Jul 2021 16:23:41 +0300 Subject: [PATCH] Redirect log to pageserver.log during zenith init. Add new module logger.rs that contains shared code to init logging --- pageserver/src/bin/pageserver.rs | 73 ++------------------------------ pageserver/src/branches.rs | 10 +++++ pageserver/src/lib.rs | 1 + pageserver/src/logger.rs | 50 ++++++++++++++++++++++ 4 files changed, 65 insertions(+), 69 deletions(-) create mode 100644 pageserver/src/logger.rs diff --git a/pageserver/src/bin/pageserver.rs b/pageserver/src/bin/pageserver.rs index 21d2d8e4fd..4606f08bc6 100644 --- a/pageserver/src/bin/pageserver.rs +++ b/pageserver/src/bin/pageserver.rs @@ -6,22 +6,18 @@ use log::*; use serde::{Deserialize, Serialize}; use std::{ env, - fs::{File, OpenOptions}, - io, - net::TcpListener, + net::{TcpListener}, path::{Path, PathBuf}, process::exit, thread, time::Duration, }; -use anyhow::{Context, Result}; +use anyhow::{Result}; use clap::{App, Arg, ArgMatches}; use daemonize::Daemonize; -use slog::{Drain, FnValue}; - -use pageserver::{branches, page_cache, page_service, tui, PageServerConf}; +use pageserver::{branches, page_cache, page_service, tui, logger, PageServerConf}; const DEFAULT_LISTEN_ADDR: &str = "127.0.0.1:64000"; @@ -219,18 +215,9 @@ fn main() -> Result<()> { } fn start_pageserver(conf: &'static PageServerConf) -> Result<()> { - let log_filename = "pageserver.log"; - // Don't open the same file for output multiple times; - // the different fds could overwrite each other's output. - let log_file = OpenOptions::new() - .create(true) - .append(true) - .open(&log_filename) - .with_context(|| format!("failed to open {:?}", &log_filename))?; // Initialize logger - let logger_file = log_file.try_clone().unwrap(); - let _scope_guard = init_logging(&conf, logger_file)?; + let (_scope_guard, log_file) = logger::init_logging(&conf, "pageserver.log")?; let _log_guard = slog_stdlog::init()?; // Note: this `info!(...)` macro comes from `log` crate @@ -297,55 +284,3 @@ fn start_pageserver(conf: &'static PageServerConf) -> Result<()> { Ok(()) } - -fn init_logging( - conf: &PageServerConf, - log_file: File, -) -> Result { - if conf.interactive { - Ok(tui::init_logging()) - } else if conf.daemonize { - let decorator = slog_term::PlainSyncDecorator::new(log_file); - let drain = slog_term::FullFormat::new(decorator).build(); - let drain = slog::Filter::new(drain, |record: &slog::Record| { - if record.level().is_at_least(slog::Level::Info) { - return true; - } - false - }); - let drain = std::sync::Mutex::new(drain).fuse(); - let logger = slog::Logger::root( - drain, - slog::o!( - "location" => - FnValue(move |record| { - format!("{}, {}:{}", - record.module(), - record.file(), - record.line() - ) - } - ) - ), - ); - Ok(slog_scope::set_global_logger(logger)) - } else { - let decorator = slog_term::TermDecorator::new().build(); - let drain = slog_term::FullFormat::new(decorator).build().fuse(); - let drain = slog_async::Async::new(drain).chan_size(1000).build().fuse(); - let drain = slog::Filter::new(drain, |record: &slog::Record| { - if record.level().is_at_least(slog::Level::Info) { - return true; - } - if record.level().is_at_least(slog::Level::Debug) - && record.module().starts_with("pageserver") - { - return true; - } - false - }) - .fuse(); - let logger = slog::Logger::root(drain, slog::o!()); - Ok(slog_scope::set_global_logger(logger)) - } -} diff --git a/pageserver/src/branches.rs b/pageserver/src/branches.rs index 6439704361..c0e26746b0 100644 --- a/pageserver/src/branches.rs +++ b/pageserver/src/branches.rs @@ -19,6 +19,9 @@ use std::{ }; use zenith_utils::lsn::Lsn; +use log::*; + +use crate::logger; use crate::page_cache; use crate::restore_local_repo; use crate::{repository::Repository, PageServerConf, ZTimelineId}; @@ -45,6 +48,13 @@ pub fn init_repo(conf: &'static PageServerConf, repo_dir: &Path) -> Result<()> { env::set_current_dir(repo_dir)?; + // Initialize logger + let (_scope_guard, _log_file) = logger::init_logging(&conf, "pageserver.log")?; + let _log_guard = slog_stdlog::init()?; + + // Note: this `info!(...)` macro comes from `log` crate + info!("standard logging redirected to slog"); + fs::create_dir(std::path::Path::new("timelines"))?; fs::create_dir(std::path::Path::new("refs"))?; fs::create_dir(std::path::Path::new("refs").join("branches"))?; diff --git a/pageserver/src/lib.rs b/pageserver/src/lib.rs index 1dfa384760..8a3b89e02f 100644 --- a/pageserver/src/lib.rs +++ b/pageserver/src/lib.rs @@ -7,6 +7,7 @@ use std::time::Duration; pub mod basebackup; pub mod branches; +pub mod logger; pub mod object_key; pub mod object_repository; pub mod object_store; diff --git a/pageserver/src/logger.rs b/pageserver/src/logger.rs new file mode 100644 index 0000000000..fe3ed381f2 --- /dev/null +++ b/pageserver/src/logger.rs @@ -0,0 +1,50 @@ +use crate::{tui, PageServerConf}; + +use std::fs::{OpenOptions, File}; +use anyhow::{Context, Result}; +use slog::{Drain, FnValue}; + +pub fn init_logging( + conf: &PageServerConf, + log_filename: &str +) -> Result<(slog_scope::GlobalLoggerGuard, File)> { + + // Don't open the same file for output multiple times; + // the different fds could overwrite each other's output. + let log_file = OpenOptions::new() + .create(true) + .append(true) + .open(&log_filename) + .with_context(|| format!("failed to open {:?}", &log_filename))?; + + let logger_file = log_file.try_clone().unwrap(); + + if conf.interactive { + Ok((tui::init_logging(), logger_file)) + } else { + let decorator = slog_term::PlainSyncDecorator::new(logger_file); + let drain = slog_term::FullFormat::new(decorator).build(); + let drain = slog::Filter::new(drain, |record: &slog::Record| { + if record.level().is_at_least(slog::Level::Info) { + return true; + } + false + }); + let drain = std::sync::Mutex::new(drain).fuse(); + let logger = slog::Logger::root( + drain, + slog::o!( + "location" => + FnValue(move |record| { + format!("{}, {}:{}", + record.module(), + record.file(), + record.line() + ) + } + ) + ), + ); + Ok((slog_scope::set_global_logger(logger), log_file)) + } +}