From 8db964ecdc9e6cb456d8ed5a5e490c7eda417673 Mon Sep 17 00:00:00 2001 From: mineshp Date: Mon, 23 Dec 2024 10:48:44 +0530 Subject: [PATCH] feat:enabled logs to file based on settings --- Cargo.lock | 13 ++++++++++++ README.md | 9 ++++++++- agent/Cargo.toml | 1 + agent/src/bin/agent.rs | 37 +++++++++++++++++++++++++++++++--- core/settings/src/constants.rs | 2 ++ 5 files changed, 58 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 412e625..735c71b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2712,6 +2712,7 @@ dependencies = [ "tonic-build 0.10.2", "tonic-types", "tracing", + "tracing-appender", "tracing-subscriber", ] @@ -5955,6 +5956,18 @@ dependencies = [ "tracing-core", ] +[[package]] +name = "tracing-appender" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3566e8ce28cc0a3fe42519fc80e6b4c943cc4c8cef275620eb8dac2d3d4e06cf" +dependencies = [ + "crossbeam-channel", + "thiserror", + "time", + "tracing-subscriber", +] + [[package]] name = "tracing-attributes" version = "0.1.27" diff --git a/README.md b/README.md index 411ea6b..dbff9be 100644 --- a/README.md +++ b/README.md @@ -83,4 +83,11 @@ $ mecha-agent whoami ### Reset ```bash $ mecha-agent reset -``` \ No newline at end of file +``` + +To write logs in file we have to configure settings in settings.yml +```sh +logging: + enabled: true + path: /var/log/mecha-agent.log # File path to store logs based on level filter + level: info \ No newline at end of file diff --git a/agent/Cargo.toml b/agent/Cargo.toml index 3708100..a207477 100644 --- a/agent/Cargo.toml +++ b/agent/Cargo.toml @@ -42,6 +42,7 @@ prost-types = { workspace = true } bincode = { workspace = true } opentelemetry-appender-tracing = { workspace = true } clap = { workspace = true } +tracing-appender = "0.2.3" [build-dependencies] tonic-build = "0.10.2" diff --git a/agent/src/bin/agent.rs b/agent/src/bin/agent.rs index 6b656c1..9c9709c 100644 --- a/agent/src/bin/agent.rs +++ b/agent/src/bin/agent.rs @@ -1,6 +1,10 @@ -use std::net::{IpAddr, SocketAddr}; +use std::{ + ffi::OsStr, + net::{IpAddr, SocketAddr}, + path::Path, +}; -use agent_settings::{read_settings_yml, GrpcSettings}; +use agent_settings::{constants, read_settings_yml, GrpcSettings}; use anyhow::{bail, Result}; use clap::Parser; use init_tracing_opentelemetry::tracing_subscriber_ext::{ @@ -12,7 +16,8 @@ use mecha_agent::init::init_handlers; use opentelemetry::global; use opentelemetry_appender_tracing::layer::OpenTelemetryTracingBridge; use telemetry::config::init_logs_config; -use tracing_subscriber::prelude::__tracing_subscriber_SubscriberExt; +use tracing_appender::{non_blocking, rolling}; +use tracing_subscriber::{fmt::Layer, prelude::__tracing_subscriber_SubscriberExt}; const PACKAGE_NAME: &str = env!("CARGO_PKG_NAME"); #[derive(Debug, Parser)] @@ -81,11 +86,37 @@ async fn start_agent(settings_path: String, init_grpc: bool) -> Result<()> { let socket_addr = get_exporter_endpoint(&settings.grpc); let endpoint = format!("http://{}", socket_addr); let _ = init_logs_config(endpoint.as_str()); + let path = Path::new(settings.logging.path.as_str()); + + //trying to separate a dir and file + let directory = match path.parent() { + Some(p) => p, + None => Path::new(constants::DEFAULT_LOG_FILE_DIR), + }; + let file_name = match path.file_name() { + Some(f) => f, + None => OsStr::new(constants::DEFAULT_LOG_FILE_NAME), + }; + + let file_appender = rolling::never(directory, file_name); + let (non_blocking_writer, _guard) = non_blocking(file_appender); + // Set optional layer for logging to a file + let logs_to_file_layer = if settings.logging.enabled && !settings.logging.path.is_empty() { + Some( + Layer::new() + .with_writer(non_blocking_writer) + .with_ansi(false), + ) + } else { + None + }; + let logger_provider = opentelemetry::global::logger_provider(); let tracing_bridge_layer = OpenTelemetryTracingBridge::new(&logger_provider); global::set_logger_provider(logger_provider); let subscriber = tracing_subscriber::registry() + .with(logs_to_file_layer) .with(tracing_bridge_layer) .with(build_loglevel_filter_layer()) //temp for terminal log .with(build_logger_text()) //temp for terminal log diff --git a/core/settings/src/constants.rs b/core/settings/src/constants.rs index 9ec96bd..3cfd4ae 100644 --- a/core/settings/src/constants.rs +++ b/core/settings/src/constants.rs @@ -1,3 +1,5 @@ +pub const DEFAULT_LOG_FILE_NAME: &str = "mecha-agent.log"; +pub const DEFAULT_LOG_FILE_DIR: &str = "~/.local/logs"; pub const PRIVATE_KEY_PATH: &str = "/openssl/ecdsa/key.pem"; pub const CSR_PATH: &str = "/openssl/ecdsa/csr.pem"; pub const CERT_PATH: &str = "/agent/certs/machine.pem";