diff --git a/crates/ecstore/src/cache_value/metacache_set.rs b/crates/ecstore/src/cache_value/metacache_set.rs index 47154b6a..0ac371a4 100644 --- a/crates/ecstore/src/cache_value/metacache_set.rs +++ b/crates/ecstore/src/cache_value/metacache_set.rs @@ -31,7 +31,7 @@ pub struct ListPathRawOptions { pub fallback_disks: Vec>, pub bucket: String, pub path: String, - pub recursice: bool, + pub recursive: bool, pub filter_prefix: Option, pub forward_to: Option, pub min_disks: usize, @@ -52,7 +52,7 @@ impl Clone for ListPathRawOptions { fallback_disks: self.fallback_disks.clone(), bucket: self.bucket.clone(), path: self.path.clone(), - recursice: self.recursice, + recursive: self.recursive, filter_prefix: self.filter_prefix.clone(), forward_to: self.forward_to.clone(), min_disks: self.min_disks, @@ -85,7 +85,7 @@ pub async fn list_path_raw(mut rx: B_Receiver, opts: ListPathRawOptions) - let wakl_opts = WalkDirOptions { bucket: opts_clone.bucket.clone(), base_dir: opts_clone.path.clone(), - recursive: opts_clone.recursice, + recursive: opts_clone.recursive, report_notfound: opts_clone.report_not_found, filter_prefix: opts_clone.filter_prefix.clone(), forward_to: opts_clone.forward_to.clone(), @@ -133,7 +133,7 @@ pub async fn list_path_raw(mut rx: B_Receiver, opts: ListPathRawOptions) - WalkDirOptions { bucket: opts_clone.bucket.clone(), base_dir: opts_clone.path.clone(), - recursive: opts_clone.recursice, + recursive: opts_clone.recursive, report_notfound: opts_clone.report_not_found, filter_prefix: opts_clone.filter_prefix.clone(), forward_to: opts_clone.forward_to.clone(), diff --git a/crates/ecstore/src/heal/data_scanner.rs b/crates/ecstore/src/heal/data_scanner.rs index d10a8688..4449d81a 100644 --- a/crates/ecstore/src/heal/data_scanner.rs +++ b/crates/ecstore/src/heal/data_scanner.rs @@ -1262,7 +1262,7 @@ impl FolderScanner { disks: self.disks.clone(), bucket: bucket.clone(), path: prefix.clone(), - recursice: true, + recursive: true, report_not_found: true, min_disks: self.disks_quorum, agreed: Some(Box::new(move |entry: MetaCacheEntry| { diff --git a/crates/ecstore/src/pools.rs b/crates/ecstore/src/pools.rs index aa4f3741..96105046 100644 --- a/crates/ecstore/src/pools.rs +++ b/crates/ecstore/src/pools.rs @@ -1355,7 +1355,7 @@ impl SetDisks { disks: disks.iter().cloned().map(Some).collect(), bucket: bucket_info.name.clone(), path: bucket_info.prefix.clone(), - recursice: true, + recursive: true, min_disks: listing_quorum, agreed: Some(Box::new(move |entry: MetaCacheEntry| Box::pin(cb1(entry)))), partial: Some(Box::new(move |entries: MetaCacheEntries, _: &[Option]| { diff --git a/crates/ecstore/src/rebalance.rs b/crates/ecstore/src/rebalance.rs index 5ab2f149..6800060a 100644 --- a/crates/ecstore/src/rebalance.rs +++ b/crates/ecstore/src/rebalance.rs @@ -1172,7 +1172,7 @@ impl SetDisks { ListPathRawOptions { disks: disks.iter().cloned().map(Some).collect(), bucket: bucket.clone(), - recursice: true, + recursive: true, min_disks: listing_quorum, agreed: Some(Box::new(move |entry: MetaCacheEntry| { info!("list_objects_to_rebalance: agreed: {:?}", &entry.name); diff --git a/crates/ecstore/src/set_disk.rs b/crates/ecstore/src/set_disk.rs index 7e7516ae..9bd74578 100644 --- a/crates/ecstore/src/set_disk.rs +++ b/crates/ecstore/src/set_disk.rs @@ -2306,7 +2306,7 @@ impl SetDisks { Some(filter_prefix.to_string()) } }, - recursice: true, + recursive: true, forward_to: None, min_disks: 1, report_not_found: false, @@ -3836,7 +3836,7 @@ impl SetDisks { disks, fallback_disks, bucket: bucket.clone(), - recursice: true, + recursive: true, forward_to, min_disks: 1, report_not_found: false, diff --git a/crates/ecstore/src/store_list_objects.rs b/crates/ecstore/src/store_list_objects.rs index d223f207..b028818f 100644 --- a/crates/ecstore/src/store_list_objects.rs +++ b/crates/ecstore/src/store_list_objects.rs @@ -776,7 +776,7 @@ impl ECStore { fallback_disks: fallback_disks.iter().cloned().map(Some).collect(), bucket: bucket.to_owned(), path, - recursice: true, + recursive: true, filter_prefix: Some(filter_prefix), forward_to: opts.marker.clone(), min_disks: listing_quorum, @@ -1286,7 +1286,7 @@ impl SetDisks { fallback_disks: fallback_disks.iter().cloned().map(Some).collect(), bucket: opts.bucket, path: opts.base_dir, - recursice: opts.recursive, + recursive: opts.recursive, filter_prefix: opts.filter_prefix, forward_to: opts.marker, min_disks: listing_quorum, diff --git a/crates/obs/src/telemetry.rs b/crates/obs/src/telemetry.rs index 137634d9..ba812cc6 100644 --- a/crates/obs/src/telemetry.rs +++ b/crates/obs/src/telemetry.rs @@ -36,6 +36,7 @@ use rustfs_config::{ use rustfs_utils::get_local_ip_with_default; use smallvec::SmallVec; use std::borrow::Cow; +use std::fs; use std::io::IsTerminal; use tracing::info; use tracing_error::ErrorLayer; @@ -295,6 +296,21 @@ pub(crate) fn init_telemetry(config: &OtelConfig) -> OtelGuard { let log_directory = config.log_directory.as_deref().unwrap_or(DEFAULT_LOG_DIR); let log_filename = config.log_filename.as_deref().unwrap_or(service_name); + if let Err(e) = fs::create_dir_all(log_directory) { + eprintln!("Failed to create log directory {log_directory}: {e}"); + } + #[cfg(unix)] + { + // Linux/macOS Setting Permissions + // Set the log directory permissions to 755 (rwxr-xr-x) + use std::fs::Permissions; + use std::os::unix::fs::PermissionsExt; + match fs::set_permissions(log_directory, Permissions::from_mode(0o755)) { + Ok(_) => eprintln!("Log directory permissions set to 755: {log_directory}"), + Err(e) => eprintln!("Failed to set log directory permissions {log_directory}: {e}"), + } + } + // Build log cutting conditions let rotation_criterion = match (config.log_rotation_time.as_deref(), config.log_rotation_size_mb) { // Cut by time and size at the same time @@ -354,13 +370,15 @@ pub(crate) fn init_telemetry(config: &OtelConfig) -> OtelGuard { FileSpec::default() .directory(log_directory) .basename(log_filename) - .suffix("log"), + .suppress_timestamp(), ) .rotate(rotation_criterion, Naming::TimestampsDirect, Cleanup::KeepLogFiles(keep_files.into())) .format_for_files(format_for_file) // Add a custom formatting function for file output .duplicate_to_stdout(level_filter) // Use dynamic levels .format_for_stdout(format_with_color) // Add a custom formatting function for terminal output - .write_mode(WriteMode::Async) + .write_mode(WriteMode::BufferAndFlush) + .append() // Avoid clearing existing logs at startup + .print_message() // Startup information output to console .start(); if let Ok(logger) = flexi_logger_result { @@ -420,7 +438,7 @@ fn format_with_color(w: &mut dyn std::io::Write, now: &mut DeferredNow, record: writeln!( w, "[{}] {} [{}] [{}:{}] [{}:{}] {}", - now.now().format("%Y-%m-%d %H:%M:%S%.6f"), + now.now().format(flexi_logger::TS_DASHES_BLANK_COLONS_DOT_BLANK), level_style.paint(level.to_string()), Color::Magenta.paint(record.target()), Color::Blue.paint(record.file().unwrap_or("unknown")), @@ -444,7 +462,7 @@ fn format_for_file(w: &mut dyn std::io::Write, now: &mut DeferredNow, record: &R writeln!( w, "[{}] {} [{}] [{}:{}] [{}:{}] {}", - now.now().format("%Y-%m-%d %H:%M:%S%.6f"), + now.now().format(flexi_logger::TS_DASHES_BLANK_COLONS_DOT_BLANK), level, record.target(), record.file().unwrap_or("unknown"), diff --git a/scripts/run.sh b/scripts/run.sh index 03eade1b..b9e94979 100755 --- a/scripts/run.sh +++ b/scripts/run.sh @@ -64,7 +64,7 @@ export RUSTFS_OBS_LOG_DIRECTORY="$current_dir/deploy/logs" # Log directory export RUSTFS_OBS_LOG_ROTATION_TIME="minute" # Log rotation time unit, can be "second", "minute", "hour", "day" export RUSTFS_OBS_LOG_ROTATION_SIZE_MB=1 # Log rotation size in MB -export RUSTFS_SINKS_FILE_PATH="$current_dir/deploy/logs/rustfs.log" +export RUSTFS_SINKS_FILE_PATH="$current_dir/deploy/logs" export RUSTFS_SINKS_FILE_BUFFER_SIZE=12 export RUSTFS_SINKS_FILE_FLUSH_INTERVAL_MS=1000 export RUSTFS_SINKS_FILE_FLUSH_THRESHOLD=100