From 98e55b2b4ca703b9d1364b7e82833723ec18d8cf Mon Sep 17 00:00:00 2001 From: Karthik Nadig Date: Fri, 3 May 2024 15:21:31 -0700 Subject: [PATCH] Add logging over JSON-RPC --- native_locator/src/logging.rs | 62 +++++++++++++++++++++++++++++++++ native_locator/src/main.rs | 20 ++++++++++- native_locator/src/messaging.rs | 1 - 3 files changed, 81 insertions(+), 2 deletions(-) create mode 100644 native_locator/src/logging.rs diff --git a/native_locator/src/logging.rs b/native_locator/src/logging.rs new file mode 100644 index 000000000000..7dc2b495442a --- /dev/null +++ b/native_locator/src/logging.rs @@ -0,0 +1,62 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +use crate::messaging; +use serde::{Deserialize, Serialize}; + +#[derive(Serialize, Deserialize, PartialEq, Debug, Eq, Clone)] +pub enum LogLevel { + #[serde(rename = "debug")] + Debug, + #[serde(rename = "info")] + Info, + #[serde(rename = "warning")] + Warning, + #[serde(rename = "error")] + Error, +} + +#[derive(Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct Log { + pub message: String, + pub level: LogLevel, +} + +#[derive(Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct LogMessage { + pub jsonrpc: String, + pub method: String, + pub params: Log, +} + +impl LogMessage { + pub fn new(message: String, level: LogLevel) -> Self { + Self { + jsonrpc: "2.0".to_string(), + method: "log".to_string(), + params: Log { message, level }, + } + } +} + +pub fn log_debug(message: &str) { + messaging::send_message(LogMessage::new(message.to_string(), LogLevel::Debug)); +} + +pub fn log_info(message: &str) { + messaging::send_message(LogMessage::new(message.to_string(), LogLevel::Info)); +} + +pub fn log_warning(message: &str) { + messaging::send_message(LogMessage::new(message.to_string(), LogLevel::Warning)); +} + +pub fn log_error(message: &str) { + messaging::send_message(LogMessage::new(message.to_string(), LogLevel::Error)); +} + +pub fn log_msg(message: &str, level: LogLevel) { + messaging::send_message(LogMessage::new(message.to_string(), level)); +} diff --git a/native_locator/src/main.rs b/native_locator/src/main.rs index 51f9a5b3d016..aa339e4e2b6d 100644 --- a/native_locator/src/main.rs +++ b/native_locator/src/main.rs @@ -1,23 +1,41 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. +use std::time::SystemTime; + mod common_python; mod conda; mod known; +mod logging; mod messaging; mod utils; mod windows_python; fn main() { + let now = SystemTime::now(); + logging::log_info("Starting Native Locator"); + // Finds python on PATH common_python::find_and_report(); - // finds conda binary and conda environments + // Finds conda binary and conda environments conda::find_and_report(); // Finds Windows Store, Known Path, and Registry pythons #[cfg(windows)] windows_python::find_and_report(); + match now.elapsed() { + Ok(elapsed) => { + logging::log_info(&format!( + "Native Locator took {} milliseconds.", + elapsed.as_millis() + )); + } + Err(e) => { + logging::log_error(&format!("Error getting elapsed time: {:?}", e)); + } + } + messaging::send_message(messaging::ExitMessage::new()); } diff --git a/native_locator/src/messaging.rs b/native_locator/src/messaging.rs index b67318d551fe..540ba0595988 100644 --- a/native_locator/src/messaging.rs +++ b/native_locator/src/messaging.rs @@ -3,7 +3,6 @@ use serde::{Deserialize, Serialize}; - #[derive(Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct EnvManager {