From 463bff9d735b18a90b266eef1e670f6c8fa1823b Mon Sep 17 00:00:00 2001 From: Annie Smith Date: Thu, 6 Jul 2023 11:44:24 -0400 Subject: [PATCH 01/21] Added PB and initial function to set the levels --- src/api/cpp/GravityNode.cpp | 63 +++++++++++++++++++ src/api/protobufs/GravitySpdLogConfigPB.proto | 37 +++++++++++ 2 files changed, 100 insertions(+) create mode 100755 src/api/protobufs/GravitySpdLogConfigPB.proto diff --git a/src/api/cpp/GravityNode.cpp b/src/api/cpp/GravityNode.cpp index 1ada4b286..fda13d94e 100755 --- a/src/api/cpp/GravityNode.cpp +++ b/src/api/cpp/GravityNode.cpp @@ -65,6 +65,7 @@ #include "protobuf/ServiceDirectoryUnregistrationPB.pb.h" #include "protobuf/ServiceDirectoryBroadcastPB.pb.h" #include "protobuf/GravityConfigParamPB.pb.h" +#include "protobuf/GravitySpdLogConfigPB.pb.h" #include "spdlog/sinks/basic_file_sink.h" #include "spdlog/sinks/dist_sink.h" @@ -2806,6 +2807,68 @@ bool GravityNode::getBoolParam(std::string key, bool default_value) { } } +bool GravityNode::reconfigSpdLoggers(GravitySpdLogConfigPB spdLogConfigPB) +{ + bool isCompID = false; + // Check if it is one of the specified components + if (spdLogConfigPB.has_componentID()) + { + for (auto compID : spdLogConfigPB.componentID()) + { + if (compID == componentID) + { + isCompID = true; + break; + } + } + } + // All components subscribed should be updated + else{ + isCompID = true; + } + + if (isCompID){ + + // Get the gravity and application loggers + gravityLogger = spdlog::get("GravityLogger"); + gravityApplicationLogger = spdlog::get("GravityApplicationLogger"); + + if (spdLogConfigPB.has_spdlog_component()); + { + for(auto logConfig : spdLogConfigPB.spdlog_component()); + { + // Console log level always exists, do not need to check + if (logConfig.loggerID() == "GravityConsoleLogLevel") + { + console_proxy_for_gravity -> set_level(spdLogConfigPB.log_level()); + } + else if (logConfig.loggerID() == "AppConsoleLogLevel") + { + console_proxy_for_app -> set_level(spdLogConfigPB.log_level()); + } + // Assume right now that all exist + // ... ask about this later + // weird issue of accessing sinks (might need global map of sinks) + else if (logConfig.loggerID() == "GravityFileLogLevel") + { + file_proxy_for_gravity-> set_level(spdLogConfigPB.log_level()); + } + else if (logConfig.loggerID() == "AppFileLogLevel") + { + file_proxy_for_app-> set_level(spdLogConfigPB.log_level()); + } + else if (logConfig.loggerID() == "AppNetworkLogLevel") + { + publish_proxy_for_app-> set_level(spdLogConfigPB.log_level()); + } + } + } + } + + + return false; +} + std::string GravityNode::getComponentID() { return componentID; diff --git a/src/api/protobufs/GravitySpdLogConfigPB.proto b/src/api/protobufs/GravitySpdLogConfigPB.proto new file mode 100755 index 000000000..c2d805f67 --- /dev/null +++ b/src/api/protobufs/GravitySpdLogConfigPB.proto @@ -0,0 +1,37 @@ +/** (C) Copyright 2013, Applied Physical Sciences Corp., A General Dynamics Company + ** + ** Gravity is free software; you can redistribute it and/or modify + ** it under the terms of the GNU Lesser General Public License as published by + ** the Free Software Foundation; either version 3 of the License, or + ** (at your option) any later version. + ** + ** This program is distributed in the hope that it will be useful, + ** but WITHOUT ANY WARRANTY; without even the implied warranty of + ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + ** GNU Lesser General Public License for more details. + ** + ** You should have received a copy of the GNU Lesser General Public + ** License along with this program; + ** If not, see . + ** + */ + +syntax = "proto2"; +option optimize_for = SPEED; +option java_outer_classname = "ComponentDataLookupResponseContainer"; +option java_package = "com.aphysci.gravity.protobuf"; + +package gravity; + +message SpdLogComponentInfoPB +{ + // used or just implied?? + required string log_level = 1; // INFO ERR WARN CRITICAL DEBUG OFF TRACE + required string loggerID = 2; //"GravityFileLogLevel""GravityConsoleLogLevel"AppFileLogLevel""AppConsoleLogLevel""AppNetworkLogLevel" +} + +message GravitySpdLogConfigPB +{ + repeated string componentID = 1; + repeated SpdLogComponentInfoPB spdlog_component = 2; +} \ No newline at end of file From 4ddf6464333f195c842bb2967c346d216eb87f5c Mon Sep 17 00:00:00 2001 From: Annie Smith Date: Thu, 6 Jul 2023 13:25:36 -0400 Subject: [PATCH 02/21] init method to register the listener & changed pb --- src/api/cpp/GravityNode.cpp | 114 ++++++++---------- src/api/protobufs/GravitySpdLogConfigPB.proto | 3 +- 2 files changed, 55 insertions(+), 62 deletions(-) diff --git a/src/api/cpp/GravityNode.cpp b/src/api/cpp/GravityNode.cpp index fda13d94e..9086d79aa 100755 --- a/src/api/cpp/GravityNode.cpp +++ b/src/api/cpp/GravityNode.cpp @@ -578,61 +578,42 @@ void GravityNode::configSpdLoggers() auto app_console_level = spdlog::level::from_str(StringToLowerCase(getStringParam("AppConsoleLogLevel", "off"))); auto app_publish_level = spdlog::level::from_str(StringToLowerCase(getStringParam("AppNetworkLogLevel", "off"))); - bool has_gravity_file_logger = gravity_file_level != SPDLOG_LEVEL_OFF; - bool has_app_file_logger = app_file_level != SPDLOG_LEVEL_OFF; - bool has_app_console_logger = app_console_level != SPDLOG_LEVEL_OFF; - bool has_app_publish_logger = app_publish_level != SPDLOG_LEVEL_OFF; - - bool has_app_logger = has_app_file_logger || has_app_console_logger || has_app_publish_logger; - // Create lists to hold sinks std::list> app_sink_list = {}; std::list> gravity_sink_list = {}; - // Always create console loggers + // Always create all loggers, some may be set to off auto shared_console_sink = make_shared(); + auto console_proxy_for_gravity = std::make_shared(); console_proxy_for_gravity->add_sink(shared_console_sink); console_proxy_for_gravity->set_level(gravity_console_level); gravity_sink_list.push_back(console_proxy_for_gravity); + auto console_proxy_for_app = std::make_shared(); console_proxy_for_app->add_sink(shared_console_sink); console_proxy_for_app->set_level(app_console_level); app_sink_list.push_back(console_proxy_for_app); - // Configure file logger (if specified) - if (has_gravity_file_logger || has_app_file_logger) - { - string filename = getStringParam("LogDirectory", ".") + file_separator + componentID + ".log"; - auto sharedFileSink = std::make_shared(filename); - - if (has_gravity_file_logger) - { - auto file_proxy_for_gravity = std::make_shared(); - file_proxy_for_gravity->add_sink(sharedFileSink); - file_proxy_for_gravity->set_level(gravity_file_level); - gravity_sink_list.push_back(file_proxy_for_gravity); - } + + string filename = getStringParam("LogDirectory", ".") + file_separator + componentID + ".log"; + auto sharedFileSink = std::make_shared(filename); + + auto file_proxy_for_gravity = std::make_shared(); + file_proxy_for_gravity->add_sink(sharedFileSink); + file_proxy_for_gravity->set_level(gravity_file_level); + gravity_sink_list.push_back(file_proxy_for_gravity); - if (has_app_file_logger) - { - auto file_proxy_for_app = std::make_shared(); - file_proxy_for_app->add_sink(sharedFileSink); - file_proxy_for_app->set_level(app_file_level); - app_sink_list.push_back(file_proxy_for_app); - } + auto file_proxy_for_app = std::make_shared(); + file_proxy_for_app->add_sink(sharedFileSink); + file_proxy_for_app->set_level(app_file_level); + app_sink_list.push_back(file_proxy_for_app); - } - - // Configure publish logger - if (has_app_publish_logger) - { - auto publishSink = std::make_shared>(this); - auto publish_proxy_for_app = std::make_shared(); - publish_proxy_for_app->add_sink(publishSink); - publish_proxy_for_app->set_level(app_publish_level); - app_sink_list.push_back(publish_proxy_for_app); - } + auto publishSink = std::make_shared>(this); + auto publish_proxy_for_app = std::make_shared(); + publish_proxy_for_app->add_sink(publishSink); + publish_proxy_for_app->set_level(app_publish_level); + app_sink_list.push_back(publish_proxy_for_app); // Configure GravityLogger. logger = std::make_shared("GravityLogger"); @@ -656,9 +637,9 @@ void GravityNode::configSpdLoggers() app_logger->set_pattern("[%Y-%m-%d %T.%f " + componentID + "-%l] %v"); spdlog::register_logger(app_logger); - if (has_app_logger) + if ((app_file_level != SPDLOG_LEVEL_OFF) || (app_console_level != SPDLOG_LEVEL_OFF) || (app_publish_level != SPDLOG_LEVEL_OFF)) { - // Set the ApplicaitonLogger as the default + // Set the ApplicationLogger as the default spdlog::set_default_logger(app_logger); } } @@ -2519,6 +2500,15 @@ GravityReturnCode GravityNode::unregisterHeartbeatListener(string componentID, s return GravityReturnCodes::SUCCESS; } + +GravityReturnCode GravityNode::registerSpdLogConfigListener() +{ + // Subscribe to the spdlogconfig publisher + this-> subscribe(); + + // Listener thread ? +} + GravityReturnCode GravityNode::registerRelay(string dataProductID, const GravitySubscriber& subscriber, bool localOnly, GravityTransportType transportType) { return registerRelay(dataProductID, subscriber, localOnly, transportType, false); @@ -2830,37 +2820,39 @@ bool GravityNode::reconfigSpdLoggers(GravitySpdLogConfigPB spdLogConfigPB) if (isCompID){ // Get the gravity and application loggers - gravityLogger = spdlog::get("GravityLogger"); - gravityApplicationLogger = spdlog::get("GravityApplicationLogger"); + auto gravityLogger = spdlog::get("GravityLogger"); + auto gravityApplicationLogger = spdlog::get("GravityApplicationLogger"); + string loggerID = {"console","file", "network"}; + if (spdLogConfigPB.has_spdlog_component()); { for(auto logConfig : spdLogConfigPB.spdlog_component()); { - // Console log level always exists, do not need to check - if (logConfig.loggerID() == "GravityConsoleLogLevel") - { - console_proxy_for_gravity -> set_level(spdLogConfigPB.log_level()); - } - else if (logConfig.loggerID() == "AppConsoleLogLevel") + // Choose logger + auto logger; + // Set max number of loggers (2 for gravity, 3 for app) + int max = 2; + if (logConfig.isAppLogger()) { - console_proxy_for_app -> set_level(spdLogConfigPB.log_level()); + logger = gravityApplicationLogger; + max = 3; } - // Assume right now that all exist - // ... ask about this later - // weird issue of accessing sinks (might need global map of sinks) - else if (logConfig.loggerID() == "GravityFileLogLevel") + else { - file_proxy_for_gravity-> set_level(spdLogConfigPB.log_level()); + logger = gravityLogger; } - else if (logConfig.loggerID() == "AppFileLogLevel") - { - file_proxy_for_app-> set_level(spdLogConfigPB.log_level()); - } - else if (logConfig.loggerID() == "AppNetworkLogLevel") + + // Choose sink and set level + for (int i = 0 ; i < max; i++) { - publish_proxy_for_app-> set_level(spdLogConfigPB.log_level()); + if(loggerID[i] == logConfig.loggerID()) + { + logger->sink()[i] -> set_level(logConfig.log_level()); + break; + } } + } } } diff --git a/src/api/protobufs/GravitySpdLogConfigPB.proto b/src/api/protobufs/GravitySpdLogConfigPB.proto index c2d805f67..8a5002cd1 100755 --- a/src/api/protobufs/GravitySpdLogConfigPB.proto +++ b/src/api/protobufs/GravitySpdLogConfigPB.proto @@ -27,7 +27,8 @@ message SpdLogComponentInfoPB { // used or just implied?? required string log_level = 1; // INFO ERR WARN CRITICAL DEBUG OFF TRACE - required string loggerID = 2; //"GravityFileLogLevel""GravityConsoleLogLevel"AppFileLogLevel""AppConsoleLogLevel""AppNetworkLogLevel" + required string loggerID = 2; //"console" "file" "network" + required bool isAppLogger = 3; } message GravitySpdLogConfigPB From c3b2c4d28dd8192f626f71724af2e50d65f97321 Mon Sep 17 00:00:00 2001 From: Annie Smith Date: Fri, 7 Jul 2023 11:16:50 -0400 Subject: [PATCH 03/21] Made a config subscriber to be used in gravityNode --- src/api/cpp/GravityNode.cpp | 77 +---------------- src/api/cpp/GravityNode.h | 3 + src/api/cpp/GravitySpdLogConfigSubscriber.cpp | 84 +++++++++++++++++++ src/api/cpp/GravitySpdLogConfigSubscriber.h | 18 ++++ 4 files changed, 108 insertions(+), 74 deletions(-) create mode 100644 src/api/cpp/GravitySpdLogConfigSubscriber.cpp create mode 100644 src/api/cpp/GravitySpdLogConfigSubscriber.h diff --git a/src/api/cpp/GravityNode.cpp b/src/api/cpp/GravityNode.cpp index 9086d79aa..4779d59ea 100755 --- a/src/api/cpp/GravityNode.cpp +++ b/src/api/cpp/GravityNode.cpp @@ -65,7 +65,6 @@ #include "protobuf/ServiceDirectoryUnregistrationPB.pb.h" #include "protobuf/ServiceDirectoryBroadcastPB.pb.h" #include "protobuf/GravityConfigParamPB.pb.h" -#include "protobuf/GravitySpdLogConfigPB.pb.h" #include "spdlog/sinks/basic_file_sink.h" #include "spdlog/sinks/dist_sink.h" @@ -642,6 +641,9 @@ void GravityNode::configSpdLoggers() // Set the ApplicationLogger as the default spdlog::set_default_logger(app_logger); } + + // Set up the subscriber for any reconfiguration messages + this->subscribe("GravitySpdLogConfig", slcs) } GravityReturnCode GravityNode::init() @@ -2500,15 +2502,6 @@ GravityReturnCode GravityNode::unregisterHeartbeatListener(string componentID, s return GravityReturnCodes::SUCCESS; } - -GravityReturnCode GravityNode::registerSpdLogConfigListener() -{ - // Subscribe to the spdlogconfig publisher - this-> subscribe(); - - // Listener thread ? -} - GravityReturnCode GravityNode::registerRelay(string dataProductID, const GravitySubscriber& subscriber, bool localOnly, GravityTransportType transportType) { return registerRelay(dataProductID, subscriber, localOnly, transportType, false); @@ -2797,70 +2790,6 @@ bool GravityNode::getBoolParam(std::string key, bool default_value) { } } -bool GravityNode::reconfigSpdLoggers(GravitySpdLogConfigPB spdLogConfigPB) -{ - bool isCompID = false; - // Check if it is one of the specified components - if (spdLogConfigPB.has_componentID()) - { - for (auto compID : spdLogConfigPB.componentID()) - { - if (compID == componentID) - { - isCompID = true; - break; - } - } - } - // All components subscribed should be updated - else{ - isCompID = true; - } - - if (isCompID){ - - // Get the gravity and application loggers - auto gravityLogger = spdlog::get("GravityLogger"); - auto gravityApplicationLogger = spdlog::get("GravityApplicationLogger"); - - string loggerID = {"console","file", "network"}; - - if (spdLogConfigPB.has_spdlog_component()); - { - for(auto logConfig : spdLogConfigPB.spdlog_component()); - { - // Choose logger - auto logger; - // Set max number of loggers (2 for gravity, 3 for app) - int max = 2; - if (logConfig.isAppLogger()) - { - logger = gravityApplicationLogger; - max = 3; - } - else - { - logger = gravityLogger; - } - - // Choose sink and set level - for (int i = 0 ; i < max; i++) - { - if(loggerID[i] == logConfig.loggerID()) - { - logger->sink()[i] -> set_level(logConfig.log_level()); - break; - } - } - - } - } - } - - - return false; -} - std::string GravityNode::getComponentID() { return componentID; diff --git a/src/api/cpp/GravityNode.h b/src/api/cpp/GravityNode.h index dc99a5724..ae2a09a5c 100755 --- a/src/api/cpp/GravityNode.h +++ b/src/api/cpp/GravityNode.h @@ -32,6 +32,7 @@ #include "GravitySemaphore.h" #include "GravityServiceProvider.h" #include "GravitySubscriptionMonitor.h" +#include "GravitySpdLogConfigSubscriber.h" #include "Utility.h" #include "CommUtil.h" //#include "PublishSink.h" @@ -211,6 +212,8 @@ class GravityNode bool defaultCacheLastSentDataprodut; bool defaultReceiveLastSentDataproduct; + + SpdLogConfigSubscriber slcs; std::thread subscriptionManagerThread; diff --git a/src/api/cpp/GravitySpdLogConfigSubscriber.cpp b/src/api/cpp/GravitySpdLogConfigSubscriber.cpp new file mode 100644 index 000000000..032d14fa9 --- /dev/null +++ b/src/api/cpp/GravitySpdLogConfigSubscriber.cpp @@ -0,0 +1,84 @@ +#include "GravitySpdLogConfigSubscriber.h" + +#include "spdlog/spdlog.h" + +#include "protobuf/GravitySpdLogConfigPB.pb.h" + + +namespace gravity { + //init function setting the componentID + void SpdLogConfigSubscriber::subscriptionFilled(const std::vector< std::shared_ptr >& dataProducts) + { + for(std::vector< std::shared_ptr >::const_iterator i = dataProducts.begin(); i != dataProducts.end(); i++) + { + //Get the protobuf object from the message + GravitySpdLogConfigPB spdLogConfigPB; + (*i)->populateMessage(spdLogConfigPB); + // Reconfigure the loggers based on this + reconfigSpdLoggers(spdLogConfigPB); + } + } + + // Determines whether or not to reconfigure this componenet based on the component ID + void SpdLogConfigSubscriber::reconfigSpdLoggers(GravitySpdLogConfigPB spdLogConfigPB) + { + bool isCompID = false; + // Check if it is one of the specified components + if (spdLogConfigPB.has_componentID()) + { + for (auto compID : spdLogConfigPB.componentID()) + { + if (compID == componentID) + { + isCompID = true; + break; + } + } + } + // All components subscribed should be updated + else + { + isCompID = true; + } + + // Update valid component + if (isCompID){ + // Get the gravity and application loggers + auto gravityLogger = spdlog::get("GravityLogger"); + auto gravityApplicationLogger = spdlog::get("GravityApplicationLogger"); + + string loggerID = {"console","file", "network"}; + + if (spdLogConfigPB.has_spdlog_component()); + { + for(SpdLogComponentInfoPB logConfig : spdLogConfigPB.spdlog_component()); + { + // Choose logger and max number + // of loggers (2 for gravity, 3 for app) + auto logger; + int max; + if (logConfig.isAppLogger()) + { + logger = gravityApplicationLogger; + max = 3; + } + else + { + logger = gravityLogger; + max = 2; + } + + // Choose sink and set level + for (int i = 0 ; i < max; i++) + { + if(loggerID[i] == logConfig.loggerID()) + { + logger->sink()[i] -> set_level(logConfig.log_level()); + break; + } + } + } + } + } + } +} \ No newline at end of file diff --git a/src/api/cpp/GravitySpdLogConfigSubscriber.h b/src/api/cpp/GravitySpdLogConfigSubscriber.h new file mode 100644 index 000000000..af7bdd8ed --- /dev/null +++ b/src/api/cpp/GravitySpdLogConfigSubscriber.h @@ -0,0 +1,18 @@ +#include +#include +#include + +#include "protobuf/GravitySpdLogConfigPB.pb.h" + + +namespace gravity { + //Declare class for receiving published messages about the log. + class SpdLogConfigSubscriber: public GravitySubscriber + { + private: + string componentID; + void reconfigSpdLoggers(GravitySpdLogConfigPB spdLogConfigPB); + public: + void subscriptionFilled(const std::vector< std::shared_ptr >& dataProducts); + }; +} \ No newline at end of file From 984fbc2b94995e5d786ac3c7afade3178156a2a0 Mon Sep 17 00:00:00 2001 From: Annie Smith Date: Fri, 7 Jul 2023 11:49:38 -0400 Subject: [PATCH 04/21] Updated subscriber methods --- src/api/cpp/GravityNode.cpp | 1 + src/api/cpp/GravitySpdLogConfigSubscriber.cpp | 6 +++++- src/api/cpp/GravitySpdLogConfigSubscriber.h | 4 +++- src/api/protobufs/GravitySpdLogConfigPB.proto | 9 ++++----- 4 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/api/cpp/GravityNode.cpp b/src/api/cpp/GravityNode.cpp index 4779d59ea..f7219effc 100755 --- a/src/api/cpp/GravityNode.cpp +++ b/src/api/cpp/GravityNode.cpp @@ -643,6 +643,7 @@ void GravityNode::configSpdLoggers() } // Set up the subscriber for any reconfiguration messages + slcs.init(componentID); this->subscribe("GravitySpdLogConfig", slcs) } diff --git a/src/api/cpp/GravitySpdLogConfigSubscriber.cpp b/src/api/cpp/GravitySpdLogConfigSubscriber.cpp index 032d14fa9..ec668f062 100644 --- a/src/api/cpp/GravitySpdLogConfigSubscriber.cpp +++ b/src/api/cpp/GravitySpdLogConfigSubscriber.cpp @@ -6,7 +6,11 @@ namespace gravity { - //init function setting the componentID + SpdLogConfigSubscriber::SpdLogConfigSubscriber(){} + spdLogConfigSubscriber::init(string compID) + { + componentID = compID; + } void SpdLogConfigSubscriber::subscriptionFilled(const std::vector< std::shared_ptr >& dataProducts) { for(std::vector< std::shared_ptr >::const_iterator i = dataProducts.begin(); i != dataProducts.end(); i++) diff --git a/src/api/cpp/GravitySpdLogConfigSubscriber.h b/src/api/cpp/GravitySpdLogConfigSubscriber.h index af7bdd8ed..2f167bdae 100644 --- a/src/api/cpp/GravitySpdLogConfigSubscriber.h +++ b/src/api/cpp/GravitySpdLogConfigSubscriber.h @@ -4,7 +4,6 @@ #include "protobuf/GravitySpdLogConfigPB.pb.h" - namespace gravity { //Declare class for receiving published messages about the log. class SpdLogConfigSubscriber: public GravitySubscriber @@ -13,6 +12,9 @@ namespace gravity { string componentID; void reconfigSpdLoggers(GravitySpdLogConfigPB spdLogConfigPB); public: + SpdLogConfigSubscriber(); + void init(); void subscriptionFilled(const std::vector< std::shared_ptr >& dataProducts); + }; } \ No newline at end of file diff --git a/src/api/protobufs/GravitySpdLogConfigPB.proto b/src/api/protobufs/GravitySpdLogConfigPB.proto index 8a5002cd1..9095df773 100755 --- a/src/api/protobufs/GravitySpdLogConfigPB.proto +++ b/src/api/protobufs/GravitySpdLogConfigPB.proto @@ -25,14 +25,13 @@ package gravity; message SpdLogComponentInfoPB { - // used or just implied?? - required string log_level = 1; // INFO ERR WARN CRITICAL DEBUG OFF TRACE - required string loggerID = 2; //"console" "file" "network" - required bool isAppLogger = 3; + required bool isAppLogger = 1; // application or gravity logger + required string loggerID = 2; // "console" "file" "network" + required string log_level = 3; // INFO ERR WARN CRITICAL DEBUG OFF TRACE } message GravitySpdLogConfigPB { - repeated string componentID = 1; + repeated string componentID = 1; // GravityNode componentID repeated SpdLogComponentInfoPB spdlog_component = 2; } \ No newline at end of file From bc43d7a9ccfb66ce11dfb803b8aa66cbc04ae15a Mon Sep 17 00:00:00 2001 From: Annie Smith Date: Fri, 7 Jul 2023 12:01:05 -0400 Subject: [PATCH 05/21] added std to strings --- src/api/cpp/GravitySpdLogConfigSubscriber.cpp | 8 +++----- src/api/cpp/GravitySpdLogConfigSubscriber.h | 2 +- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/api/cpp/GravitySpdLogConfigSubscriber.cpp b/src/api/cpp/GravitySpdLogConfigSubscriber.cpp index ec668f062..f8c97b78a 100644 --- a/src/api/cpp/GravitySpdLogConfigSubscriber.cpp +++ b/src/api/cpp/GravitySpdLogConfigSubscriber.cpp @@ -1,13 +1,11 @@ #include "GravitySpdLogConfigSubscriber.h" - #include "spdlog/spdlog.h" - #include "protobuf/GravitySpdLogConfigPB.pb.h" namespace gravity { SpdLogConfigSubscriber::SpdLogConfigSubscriber(){} - spdLogConfigSubscriber::init(string compID) + spdLogConfigSubscriber::init(std::string compID) { componentID = compID; } @@ -23,7 +21,7 @@ namespace gravity { } } - // Determines whether or not to reconfigure this componenet based on the component ID + // Determines if correct ID and reconfigures accordingly void SpdLogConfigSubscriber::reconfigSpdLoggers(GravitySpdLogConfigPB spdLogConfigPB) { bool isCompID = false; @@ -51,7 +49,7 @@ namespace gravity { auto gravityLogger = spdlog::get("GravityLogger"); auto gravityApplicationLogger = spdlog::get("GravityApplicationLogger"); - string loggerID = {"console","file", "network"}; + std::string loggerID[3] = {"console","file", "network"}; if (spdLogConfigPB.has_spdlog_component()); { diff --git a/src/api/cpp/GravitySpdLogConfigSubscriber.h b/src/api/cpp/GravitySpdLogConfigSubscriber.h index 2f167bdae..51079fa80 100644 --- a/src/api/cpp/GravitySpdLogConfigSubscriber.h +++ b/src/api/cpp/GravitySpdLogConfigSubscriber.h @@ -9,7 +9,7 @@ namespace gravity { class SpdLogConfigSubscriber: public GravitySubscriber { private: - string componentID; + std::string componentID; void reconfigSpdLoggers(GravitySpdLogConfigPB spdLogConfigPB); public: SpdLogConfigSubscriber(); From b8ba73d3048da58a3081babed49b0f6fda179fdf Mon Sep 17 00:00:00 2001 From: Annie Smith Date: Fri, 7 Jul 2023 12:59:15 -0400 Subject: [PATCH 06/21] Fixed errirs to build --- src/api/cpp/GravityNode.cpp | 2 +- src/api/cpp/GravitySpdLogConfigSubscriber.cpp | 25 +++++++++++-------- src/api/cpp/GravitySpdLogConfigSubscriber.h | 7 +++--- 3 files changed, 18 insertions(+), 16 deletions(-) diff --git a/src/api/cpp/GravityNode.cpp b/src/api/cpp/GravityNode.cpp index f7219effc..bfbff571f 100755 --- a/src/api/cpp/GravityNode.cpp +++ b/src/api/cpp/GravityNode.cpp @@ -644,7 +644,7 @@ void GravityNode::configSpdLoggers() // Set up the subscriber for any reconfiguration messages slcs.init(componentID); - this->subscribe("GravitySpdLogConfig", slcs) + this->subscribe("GravitySpdLogConfig", slcs); } GravityReturnCode GravityNode::init() diff --git a/src/api/cpp/GravitySpdLogConfigSubscriber.cpp b/src/api/cpp/GravitySpdLogConfigSubscriber.cpp index f8c97b78a..a1535370c 100644 --- a/src/api/cpp/GravitySpdLogConfigSubscriber.cpp +++ b/src/api/cpp/GravitySpdLogConfigSubscriber.cpp @@ -1,3 +1,5 @@ +#include + #include "GravitySpdLogConfigSubscriber.h" #include "spdlog/spdlog.h" #include "protobuf/GravitySpdLogConfigPB.pb.h" @@ -5,7 +7,7 @@ namespace gravity { SpdLogConfigSubscriber::SpdLogConfigSubscriber(){} - spdLogConfigSubscriber::init(std::string compID) + void SpdLogConfigSubscriber::init(std::string compID) { componentID = compID; } @@ -26,9 +28,9 @@ namespace gravity { { bool isCompID = false; // Check if it is one of the specified components - if (spdLogConfigPB.has_componentID()) + if (spdLogConfigPB.componentid_size() !=0) { - for (auto compID : spdLogConfigPB.componentID()) + for (auto compID : spdLogConfigPB.componentid()) { if (compID == componentID) { @@ -51,31 +53,32 @@ namespace gravity { std::string loggerID[3] = {"console","file", "network"}; - if (spdLogConfigPB.has_spdlog_component()); + if (spdLogConfigPB.spdlog_component_size() != 0) { - for(SpdLogComponentInfoPB logConfig : spdLogConfigPB.spdlog_component()); + for(SpdLogComponentInfoPB logConfig : spdLogConfigPB.spdlog_component()) { // Choose logger and max number // of loggers (2 for gravity, 3 for app) - auto logger; + std::shared_ptr log; int max; - if (logConfig.isAppLogger()) + if (logConfig.isapplogger()) { - logger = gravityApplicationLogger; + log = gravityApplicationLogger; max = 3; } else { - logger = gravityLogger; + log = gravityLogger; max = 2; } // Choose sink and set level for (int i = 0 ; i < max; i++) { - if(loggerID[i] == logConfig.loggerID()) + if(loggerID[i] == logConfig.loggerid()) { - logger->sink()[i] -> set_level(logConfig.log_level()); + auto sink = log->sinks()[i]; + sink -> set_level(spdlog::level::from_str(logConfig.log_level())); break; } } diff --git a/src/api/cpp/GravitySpdLogConfigSubscriber.h b/src/api/cpp/GravitySpdLogConfigSubscriber.h index 51079fa80..854602d6d 100644 --- a/src/api/cpp/GravitySpdLogConfigSubscriber.h +++ b/src/api/cpp/GravitySpdLogConfigSubscriber.h @@ -1,7 +1,6 @@ #include -#include -#include - +#include "Utility.h" +#include "GravitySubscriber.h" #include "protobuf/GravitySpdLogConfigPB.pb.h" namespace gravity { @@ -13,7 +12,7 @@ namespace gravity { void reconfigSpdLoggers(GravitySpdLogConfigPB spdLogConfigPB); public: SpdLogConfigSubscriber(); - void init(); + void init(std::string compID); void subscriptionFilled(const std::vector< std::shared_ptr >& dataProducts); }; From c9286c7ea9accf7c69c72744f49a7cf538dde78b Mon Sep 17 00:00:00 2001 From: Annie Smith Date: Fri, 7 Jul 2023 16:54:31 -0400 Subject: [PATCH 07/21] Changed message format --- src/api/cpp/GravityNode.cpp | 4 +- src/api/cpp/GravityNode.h | 2 +- src/api/cpp/GravitySpdLogConfigSubscriber.cpp | 75 +++++-------------- src/api/protobufs/GravitySpdLogConfigPB.proto | 32 +++++--- 4 files changed, 42 insertions(+), 71 deletions(-) diff --git a/src/api/cpp/GravityNode.cpp b/src/api/cpp/GravityNode.cpp index bfbff571f..d12cf2959 100755 --- a/src/api/cpp/GravityNode.cpp +++ b/src/api/cpp/GravityNode.cpp @@ -643,8 +643,8 @@ void GravityNode::configSpdLoggers() } // Set up the subscriber for any reconfiguration messages - slcs.init(componentID); - this->subscribe("GravitySpdLogConfig", slcs); + spdLogConfigSub.init(componentID); + this->subscribe("GravitySpdLogConfig", spdLogConfigSub); } GravityReturnCode GravityNode::init() diff --git a/src/api/cpp/GravityNode.h b/src/api/cpp/GravityNode.h index ae2a09a5c..dff4910ba 100755 --- a/src/api/cpp/GravityNode.h +++ b/src/api/cpp/GravityNode.h @@ -213,7 +213,7 @@ class GravityNode bool defaultCacheLastSentDataprodut; bool defaultReceiveLastSentDataproduct; - SpdLogConfigSubscriber slcs; + SpdLogConfigSubscriber spdLogConfigSub; std::thread subscriptionManagerThread; diff --git a/src/api/cpp/GravitySpdLogConfigSubscriber.cpp b/src/api/cpp/GravitySpdLogConfigSubscriber.cpp index a1535370c..f57a9c272 100644 --- a/src/api/cpp/GravitySpdLogConfigSubscriber.cpp +++ b/src/api/cpp/GravitySpdLogConfigSubscriber.cpp @@ -26,64 +26,23 @@ namespace gravity { // Determines if correct ID and reconfigures accordingly void SpdLogConfigSubscriber::reconfigSpdLoggers(GravitySpdLogConfigPB spdLogConfigPB) { - bool isCompID = false; - // Check if it is one of the specified components - if (spdLogConfigPB.componentid_size() !=0) - { - for (auto compID : spdLogConfigPB.componentid()) - { - if (compID == componentID) - { - isCompID = true; - break; - } - } - } - // All components subscribed should be updated - else - { - isCompID = true; - } - - // Update valid component - if (isCompID){ - // Get the gravity and application loggers - auto gravityLogger = spdlog::get("GravityLogger"); - auto gravityApplicationLogger = spdlog::get("GravityApplicationLogger"); + // Check if it is one of the specfied components, return if not + if (spdLogConfigPB.has_component_id() && spdLogConfigPB.component_id() != componentID) + { + return; + } - std::string loggerID[3] = {"console","file", "network"}; - - if (spdLogConfigPB.spdlog_component_size() != 0) - { - for(SpdLogComponentInfoPB logConfig : spdLogConfigPB.spdlog_component()) - { - // Choose logger and max number - // of loggers (2 for gravity, 3 for app) - std::shared_ptr log; - int max; - if (logConfig.isapplogger()) - { - log = gravityApplicationLogger; - max = 3; - } - else - { - log = gravityLogger; - max = 2; - } + if (spdLogConfigPB.logger_id() <=1) + { + auto log = spdlog::get("GravityLogger"); + log->sinks()[spdLogConfigPB.logger_id()]-> set_level((spdlog::level::level_enum)(spdLogConfigPB.logger_level())); - // Choose sink and set level - for (int i = 0 ; i < max; i++) - { - if(loggerID[i] == logConfig.loggerid()) - { - auto sink = log->sinks()[i]; - sink -> set_level(spdlog::level::from_str(logConfig.log_level())); - break; - } - } - } - } - } - } + } + else + { + auto log = spdlog::get("GravityApplicationLogger"); + log->sinks()[spdLogConfigPB.logger_id() - 2]-> set_level((spdlog::level::level_enum)(spdLogConfigPB.logger_level())); + + } + } } \ No newline at end of file diff --git a/src/api/protobufs/GravitySpdLogConfigPB.proto b/src/api/protobufs/GravitySpdLogConfigPB.proto index 9095df773..3d448daf5 100755 --- a/src/api/protobufs/GravitySpdLogConfigPB.proto +++ b/src/api/protobufs/GravitySpdLogConfigPB.proto @@ -22,16 +22,28 @@ option java_outer_classname = "ComponentDataLookupResponseContainer"; option java_package = "com.aphysci.gravity.protobuf"; package gravity; - -message SpdLogComponentInfoPB -{ - required bool isAppLogger = 1; // application or gravity logger - required string loggerID = 2; // "console" "file" "network" - required string log_level = 3; // INFO ERR WARN CRITICAL DEBUG OFF TRACE -} - message GravitySpdLogConfigPB { - repeated string componentID = 1; // GravityNode componentID - repeated SpdLogComponentInfoPB spdlog_component = 2; + optional string component_id = 1; + enum LogLevel + { + trace = 0; + debug = 1; + info = 2; + warn = 3; + err = 4; + critical = 5; + off = 6; + } + optional LogLevel logger_level = 2; + enum LoggerType + { + GravityConsoleLogger = 0; + GravityFileLogger = 1; + ApplicationConsoleLogger = 2; + ApplicationFileLogger = 3; + ApplicationNetworkLogger = 4; + + } + optional LoggerType logger_id = 3; } \ No newline at end of file From 0b1147cab2c38ed1f8ee2f1dc26522a8359d5825 Mon Sep 17 00:00:00 2001 From: Annie Smith Date: Fri, 7 Jul 2023 17:16:49 -0400 Subject: [PATCH 08/21] Began new test for spdconfig changes --- .../ConfigurationPublisherTest.cpp | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 test/components/cpp/SpdlogConfigurationTest/ConfigurationPublisherTest.cpp diff --git a/test/components/cpp/SpdlogConfigurationTest/ConfigurationPublisherTest.cpp b/test/components/cpp/SpdlogConfigurationTest/ConfigurationPublisherTest.cpp new file mode 100644 index 000000000..cc8257d51 --- /dev/null +++ b/test/components/cpp/SpdlogConfigurationTest/ConfigurationPublisherTest.cpp @@ -0,0 +1,57 @@ +#include +#include + +#ifdef WIN32 +#include +#define sleep Sleep +#else +#include +#endif + +// TO DO: make a test with no id, and one with a different id +// Add in the data and see where to log + +int main() +{ + using namespace gravity; + + GravityNode gn; + const std::string dataProductID = "GravitySpdLogConfig"; + + //Initialize gravity, giving this node a componentID. + GravityReturnCode ret = gn.init("SimpleGravityComponentID"); + if (ret != GravityReturnCodes::SUCCESS) + { + spdlog::critical("Could not initialize GravityNode, return code was {}", ret); + exit(1); + } + + //Register a data product + ret = gn.registerDataProduct(dataProductID, GravityTransportTypes::TCP); + if (ret != GravityReturnCodes::SUCCESS) + { + spdlog::critical("Could not register data product with id {}, return code was {}", dataProductID, ret); + exit(1); + } + + //Create a data product to send across the network of type "HelloWorldDataProduct" + GravityDataProduct gravityConfigDP(dataProductID); + + //Initialize our message + GravitySpdLogConfigPB spdLogConfigPB; + spdLogConfigPB.set_component_id("SimpleGravityComponentID"); + spdLogConfigPB.set_logger_id(); + spdLogConfigPB.set_logger_level(); + gravityConfigDP.set_data(spdLogConfigPB); + + //Publish the data product. + ret = gn.publish(gravityConfigDP); + if (ret != GravityReturnCodes::SUCCESS) + { + spdlog::error("Could not publish data product with id {}, return code was {}", dataProductID, ret); + } + + //Sleep for 1 second. + gravity::sleep(1000); + +} \ No newline at end of file From d914d5dc093d273d613e9fd1bce1f18fd85f6899 Mon Sep 17 00:00:00 2001 From: Annie Smith Date: Mon, 10 Jul 2023 16:11:45 -0400 Subject: [PATCH 09/21] changes to test --- src/api/cpp/GravitySpdLogConfigSubscriber.cpp | 2 +- src/api/protobufs/GravitySpdLogConfigPB.proto | 4 +- .../ConfigurationPublisherTest.cpp | 57 -------- .../15-SpdlogDynamicConfiguration/Gravity.ini | 7 + .../15-SpdlogDynamicConfiguration/Makefile.in | 97 +++++++++++++ .../SpdlogConfigurationPublisherTest.cpp | 132 ++++++++++++++++++ .../15-SpdlogDynamicConfiguration/run.sh.in | 46 ++++++ 7 files changed, 285 insertions(+), 60 deletions(-) delete mode 100644 test/components/cpp/SpdlogConfigurationTest/ConfigurationPublisherTest.cpp create mode 100644 test/examples/15-SpdlogDynamicConfiguration/Gravity.ini create mode 100644 test/examples/15-SpdlogDynamicConfiguration/Makefile.in create mode 100644 test/examples/15-SpdlogDynamicConfiguration/SpdlogConfigurationPublisherTest.cpp create mode 100644 test/examples/15-SpdlogDynamicConfiguration/run.sh.in diff --git a/src/api/cpp/GravitySpdLogConfigSubscriber.cpp b/src/api/cpp/GravitySpdLogConfigSubscriber.cpp index f57a9c272..c821eb90c 100644 --- a/src/api/cpp/GravitySpdLogConfigSubscriber.cpp +++ b/src/api/cpp/GravitySpdLogConfigSubscriber.cpp @@ -32,7 +32,7 @@ namespace gravity { return; } - if (spdLogConfigPB.logger_id() <=1) + if (spdLogConfigPB.logger_id() == GravitySpdLogConfigPB_LoggerType_GravityConsoleLogger || spdLogConfigPB.logger_id() == GravitySpdLogConfigPB_LoggerType_GravityFileLogger) { auto log = spdlog::get("GravityLogger"); log->sinks()[spdLogConfigPB.logger_id()]-> set_level((spdlog::level::level_enum)(spdLogConfigPB.logger_level())); diff --git a/src/api/protobufs/GravitySpdLogConfigPB.proto b/src/api/protobufs/GravitySpdLogConfigPB.proto index 3d448daf5..65fd25fdb 100755 --- a/src/api/protobufs/GravitySpdLogConfigPB.proto +++ b/src/api/protobufs/GravitySpdLogConfigPB.proto @@ -25,7 +25,7 @@ package gravity; message GravitySpdLogConfigPB { optional string component_id = 1; - enum LogLevel + enum LoggerLevel { trace = 0; debug = 1; @@ -35,7 +35,7 @@ message GravitySpdLogConfigPB critical = 5; off = 6; } - optional LogLevel logger_level = 2; + optional LoggerLevel logger_level = 2; enum LoggerType { GravityConsoleLogger = 0; diff --git a/test/components/cpp/SpdlogConfigurationTest/ConfigurationPublisherTest.cpp b/test/components/cpp/SpdlogConfigurationTest/ConfigurationPublisherTest.cpp deleted file mode 100644 index cc8257d51..000000000 --- a/test/components/cpp/SpdlogConfigurationTest/ConfigurationPublisherTest.cpp +++ /dev/null @@ -1,57 +0,0 @@ -#include -#include - -#ifdef WIN32 -#include -#define sleep Sleep -#else -#include -#endif - -// TO DO: make a test with no id, and one with a different id -// Add in the data and see where to log - -int main() -{ - using namespace gravity; - - GravityNode gn; - const std::string dataProductID = "GravitySpdLogConfig"; - - //Initialize gravity, giving this node a componentID. - GravityReturnCode ret = gn.init("SimpleGravityComponentID"); - if (ret != GravityReturnCodes::SUCCESS) - { - spdlog::critical("Could not initialize GravityNode, return code was {}", ret); - exit(1); - } - - //Register a data product - ret = gn.registerDataProduct(dataProductID, GravityTransportTypes::TCP); - if (ret != GravityReturnCodes::SUCCESS) - { - spdlog::critical("Could not register data product with id {}, return code was {}", dataProductID, ret); - exit(1); - } - - //Create a data product to send across the network of type "HelloWorldDataProduct" - GravityDataProduct gravityConfigDP(dataProductID); - - //Initialize our message - GravitySpdLogConfigPB spdLogConfigPB; - spdLogConfigPB.set_component_id("SimpleGravityComponentID"); - spdLogConfigPB.set_logger_id(); - spdLogConfigPB.set_logger_level(); - gravityConfigDP.set_data(spdLogConfigPB); - - //Publish the data product. - ret = gn.publish(gravityConfigDP); - if (ret != GravityReturnCodes::SUCCESS) - { - spdlog::error("Could not publish data product with id {}, return code was {}", dataProductID, ret); - } - - //Sleep for 1 second. - gravity::sleep(1000); - -} \ No newline at end of file diff --git a/test/examples/15-SpdlogDynamicConfiguration/Gravity.ini b/test/examples/15-SpdlogDynamicConfiguration/Gravity.ini new file mode 100644 index 000000000..33ee11717 --- /dev/null +++ b/test/examples/15-SpdlogDynamicConfiguration/Gravity.ini @@ -0,0 +1,7 @@ +[general] +NoConfigServer=true +Domain=GravityTest +ServiceDirectoryBroadcastTimeout=15 + +[ServiceDirectory] +BroadcastEnabled=true diff --git a/test/examples/15-SpdlogDynamicConfiguration/Makefile.in b/test/examples/15-SpdlogDynamicConfiguration/Makefile.in new file mode 100644 index 000000000..6ced12d92 --- /dev/null +++ b/test/examples/15-SpdlogDynamicConfiguration/Makefile.in @@ -0,0 +1,97 @@ +#** (C) Copyright 2013, Applied Physical Sciences Corp., A General Dynamics Company +#** +#** Gravity is free software; you can redistribute it and/or modify +#** it under the terms of the GNU Lesser General Public License as published by +#** the Free Software Foundation; either version 3 of the License, or +#** (at your option) any later version. +#** +#** This program is distributed in the hope that it will be useful, +#** but WITHOUT ANY WARRANTY; without even the implied warranty of +#** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +#** GNU Lesser General Public License for more details. +#** +#** You should have received a copy of the GNU Lesser General Public +#** License along with this program; +#** If not, see . +#** + +# @configure_input@ + +# Package-related substitution variables +package = @PACKAGE_NAME@ +version = @PACKAGE_VERSION@ +tarname = @PACKAGE_TARNAME@ + +# Prefix-related substitution variables +prefix = @prefix@ +exec_prefix = @exec_prefix@ +bindir = @bindir@ + +# Tool-related substitution variables +CC = @CC@ +CXX = @CXX@ +DEFS = @DEFS@ +LIBS = @LIBS@ +AC_CFLAGS = @CFLAGS@ +AC_CPPFLAGS = @CPPFLAGS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM= @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +AC_LDFLAGS = @LDFLAGS@ +LEX = @LEX@ +YACC = @YACC@ + +# VPATH-related substitution variables +top_builddir = @top_builddir@ +builddir = @builddir@ +srcdir = @srcdir@ +VPATH = @srcdir@ + +CC=$(CXX) +GRAVLIB_DIR=../../../src/api/cpp/ +COMPONENT_DIR=../../../src/components/cpp +SERVICEDIRECTORY_LOCATION=$(COMPONENT_DIR)/ServiceDirectory + +#OS Specific +SYSTEM:=$(strip $(shell uname -s)) +#SYSTEM:=LINUX +#SYSTEM=MINGW32_NT-6.1 +#WARNING: DON'T PUT SPACES OR QUOTES IN COMPARISON STRING!!! +ifneq (,$(findstring MINGW32_NT,$(SYSTEM))) + OS_SPECIFIC_LIBS = -Wl,-Bdynamic -lzmq -lwsock32 -lpthread + OS_EXE_EXT=.exe +windows: all; +else ifneq (,$(findstring Linux,$(SYSTEM))) +ifneq (,$(findstring lsodium,$(LIBS))) + OS_SPECIFIC_LIBS = -lzmq -lsodium -Wl,-Bdynamic -lrt -lpthread +else + OS_SPECIFIC_LIBS = -lzmq -Wl,-Bdynamic -lrt -lpthread +endif + OS_EXE_EXT= +linux: all; +else +ostype: ; @echo "ERROR UNKNOWN OS: " $(SYSTEM); +endif + +INCLUDES=-I$(GRAVLIB_DIR) $(AC_CPPFLAGS) +CFLAGS=-std=c++11 -L$(GRAVLIB_DIR) -L../../../src/keyvalue_parser/ $(AC_LDFLAGS) $(AC_CFLAGS) +LIBS=-lgravity -lkeyvalue_parser -lprotobuf $(OS_SPECIFIC_LIBS) + +all: SpdlogConfigurationPublisherTest$(OS_EXE_EXT) + +#Compile each cpp file to a separate executable. +SpdlogConfigurationPublisherTest$(OS_EXE_EXT):SpdlogConfigurationPublisherTest.cpp + $(CC) -o $@ $< $(INCLUDES) $(CFLAGS) $(LIBS) + +components: ServiceDirectory$(OS_EXE_EXT) + +ServiceDirectory$(OS_EXE_EXT): + @cd $(SERVICEDIRECTORY_LOCATION); \ + make + +clean: + @rm -rf *.o *.exe SpdlogConfigurationPublisherTest + +run: components SpdlogConfigurationPublisherTest$(OS_EXE_EXT) + ./run.sh \ No newline at end of file diff --git a/test/examples/15-SpdlogDynamicConfiguration/SpdlogConfigurationPublisherTest.cpp b/test/examples/15-SpdlogDynamicConfiguration/SpdlogConfigurationPublisherTest.cpp new file mode 100644 index 000000000..4f794ad0e --- /dev/null +++ b/test/examples/15-SpdlogDynamicConfiguration/SpdlogConfigurationPublisherTest.cpp @@ -0,0 +1,132 @@ +#include +#include +#include "protobuf/GravitySpdLogConfigPB.pb.h" + +#ifdef WIN32 +#include +#define sleep Sleep +#else +#include +#endif + +class SimpleSubscriber : public GravitySubscriber +{ +public: + virtual void subscriptionFilled(const std::vector< std::shared_ptr >& dataProducts); +}; + +int main() +{ + using namespace gravity; + + GravityNode gn1; + GravityNode gn2; + + //Initialize gravity, giving this node a componentID. + GravityReturnCode ret = gn1.init("SimpleGravityComponentID1"); + if (ret != GravityReturnCodes::SUCCESS) + { + spdlog::critical("Could not initialize GravityNode, return code was {}", ret); + exit(1); + } + GravityReturnCode ret = gn2.init("SimpleGravityComponentID2"); + if (ret != GravityReturnCodes::SUCCESS) + { + spdlog::critical("Could not initialize GravityNode, return code was {}", ret); + exit(1); + } + + //Register a data product + const std::string dataProductID = "GravitySpdLogConfig"; + ret = gn1.registerDataProduct(dataProductID, GravityTransportTypes::TCP); + if (ret != GravityReturnCodes::SUCCESS) + { + spdlog::critical("Could not register data product with id {}, return code was {}", dataProductID, ret); + exit(1); + } + + // Set up a subscriber to the Application Publisher Logger + SimpleSubscriber simpleSubscriber; + gn1.subscribe(gravity::constants::GRAVITY_LOGGER_DPID, simpleSubscriber) + + sleep(1000); // All components begin as off, nothing should print + // Change SimpleGravityComponentID1's GravityConsole to trace and file to debug + sendConfigMessage(gn1, dataProductID,"SimpleGravityComponentID1", GravitySpdLogConfigPB_LoggerType_GravityConsoleLogger, GravitySpdLogConfigPB_LoggerLevel_trace); + sendConfigMessage(gn1, dataProductID,"SimpleGravityComponentID1", GravitySpdLogConfigPB_LoggerType_GravityFileLogger, GravitySpdLogConfigPB_LoggerLevel_debug); + logAllAppLevels(); // nothing from application should log + + sleep(1000); // wait for some gravity messages to log (only ID1 is printing this) + + // Change SimpleGravityComponentID1's ApplicationFile to trace and file to debug + sendConfigMessage(gn1, dataProductID, "SimpleGravityComponentID2", GravitySpdLogConfigPB_LoggerType_ApplicationFileLogger, GravitySpdLogConfigPB_LoggerLevel_error); + logAllAppLevels(); // only ID2 application file should be logging + + sleep(1000); // wait for some gravity messages to log (only ID1 is printing this) + + // Change both components' ApplicationNetwork to info + sendConfigMessage(gn1, dataProductID, "SimpleGravityComponentID1", GravitySpdLogConfigPB_LoggerType_ApplicationNetworkLogger, GravitySpdLogConfigPB_LoggerLevel_critical); + sendConfigMessage(gn1, dataProductID, "", GravitySpdLogConfigPB_LoggerType_ApplicationConsoleLogger, GravitySpdLogConfigPB_LoggerLevel_info); + + logAllAppLevels(); // both ApplicationConsole should be logging at info, application network for ID1 logging critical + + // Check subscriber to make sure they are logged + + // Change all logger's changed back to off + sendConfigMessage(gn1, dataProductID,"SimpleGravityComponentID1", GravitySpdLogConfigPB_LoggerType_GravityConsoleLogger, GravitySpdLogConfigPB_LoggerLevel_off); + sendConfigMessage(gn1, dataProductID,"SimpleGravityComponentID1", GravitySpdLogConfigPB_LoggerType_GravityFileLogger, GravitySpdLogConfigPB_LoggerLevel_off); + sendConfigMessage(gn1, dataProductID, "SimpleGravityComponentID2", GravitySpdLogConfigPB_LoggerType_ApplicationFileLogger, GravitySpdLogConfigPB_LoggerLevel_off); + sendConfigMessage(gn1, dataProductID, "", GravitySpdLogConfigPB_LoggerType_ApplicationNetworkLogger, GravitySpdLogConfigPB_LoggerLevel_off); + logAllAppLevels(); // none should log anything + sleep(1000); // wait to allow for some gravity messages to generate (but none should be logged) +} + +void logAllAppLevels() +{ + spdlog::trace("AppTraceLog"); + spdlog::debug("AppDebugLog"); + spdlog::info("AppInfoLog"); + spdlog::warn("AppWarnLog"); + spdlog::err("AppErrorLog"); + spdlog::critical("AppCriticalLog"); +} + +void sendConfigMessage(GravityNode gn, std::string dataProductID,std::string compID, GravitySpdLogConfigPB_LoggerType lt, GravitySpdLogConfigPB_LoggerLevel ll) +{ + //Create a data product to send across the network + GravityDataProduct gravityConfigDP(dataProductID); + + //Initialize our message + GravitySpdLogConfigPB spdLogConfigPB; + if(compId != "") + { + spdLogConfigPB.set_component_id(compID); + } + + spdLogConfigPB.set_logger_id(lt); + spdLogConfigPB.set_logger_level(ll); + gravityConfigDP.set_data(spdLogConfigPB); + + //Publish the data product. + ret = gn.publish(gravityConfigDP); + if (ret != GravityReturnCodes::SUCCESS) + { + spdlog::error("Could not publish data product with id {}, return code was {}", dataProductID, ret); + } +} + +void SimpleGravityCounterSubscriber::subscriptionFilled(const std::vector< std::shared_ptr >& dataProducts) +{ + for(std::vector< std::shared_ptr >::const_iterator i = dataProducts.begin(); + i != dataProducts.end(); i++) + { + //Get the protobuf object from the message + GravityLogMessagePB logMessage; + (*i)->populateMessage(logMessage); + + if(logMessage.message() == "AppCriticalLog" && logMessage.level() == "critical") + { + std::string isValid("The correct level and message were published"); + cout << isValid; + } + } +} \ No newline at end of file diff --git a/test/examples/15-SpdlogDynamicConfiguration/run.sh.in b/test/examples/15-SpdlogDynamicConfiguration/run.sh.in new file mode 100644 index 000000000..3259aadda --- /dev/null +++ b/test/examples/15-SpdlogDynamicConfiguration/run.sh.in @@ -0,0 +1,46 @@ +#!/bin/bash +#** (C) Copyright 2013, Applied Physical Sciences Corp., A General Dynamics Company +#** +#** Gravity is free software; you can redistribute it and/or modify +#** it under the terms of the GNU Lesser General Public License as published by +#** the Free Software Foundation; either version 3 of the License, or +#** (at your option) any later version. +#** +#** This program is distributed in the hope that it will be useful, +#** but WITHOUT ANY WARRANTY; without even the implied warranty of +#** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +#** GNU Lesser General Public License for more details. +#** +#** You should have received a copy of the GNU Lesser General Public +#** License along with this program; +#** If not, see . +#** + +# @configure_input@ + +# Tool-related substitution variables +PROTOBUF_LIB_DIR=@PROTOBUF_LIBDIR@ +ZMQ_LIB_DIR=@ZEROMQ_LIBDIR@ + +export PATH=$PATH:../../../src/components/cpp/bin +export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:../../../src/api/cpp:../../../src/keyvalue_parser:$ZMQ_LIB_DIR:$PROTOBUF_LIB_DIR + + control_c() +# run if user hits control-c +{ + kill -9 $SDPID + kill -9 $PUBPID + exit $? +} + +# trap keyboard interrupt (control-c) +trap control_c SIGINT + +ServiceDirectory & +SDPID=$! + +# sleep for a second to give the service directory a chance to start up +sleep 1 + +./SpdlogConfigurationPublisherTest & +PUBPID=$! From 4e8eef0ba2bd7dac9f13b657019afc6c184600b7 Mon Sep 17 00:00:00 2001 From: Annie Smith Date: Tue, 11 Jul 2023 09:40:47 -0400 Subject: [PATCH 10/21] Makefile updates --- Makefile.in | 2 ++ configure.ac | 6 ++++-- .../15-SpdlogDynamicConfiguration/CMakeLists.txt | 16 ++++++++++++++++ 3 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 test/examples/15-SpdlogDynamicConfiguration/CMakeLists.txt diff --git a/Makefile.in b/Makefile.in index 39c6a46da..23c680d75 100644 --- a/Makefile.in +++ b/Makefile.in @@ -64,6 +64,7 @@ all clean: $(MAKE) -C test/examples/9-Domains $@ $(MAKE) -C test/examples/10-Archiving $@ $(MAKE) -C test/examples/13-Relay $@ + $(MAKE) -C test/examples/15-SpdlogDynamicConfiguration $@ # Perform each of the following in their own if block, otherwise a failure in the below make commands # won't cause the overall build to fail. @@ -131,6 +132,7 @@ test-prep: chmod 755 test/examples/13-Relay/run.sh chmod 755 test/examples/14-AnomalyDetection/train.sh chmod 755 test/examples/14-AnomalyDetection/detect.sh + chmod 755 test/examples/15-SpdlogDynamicConfiguration/run.sh test: distributable test-prep components ./test/testall.sh diff --git a/configure.ac b/configure.ac index fa6c9dd2b..3ddb8137e 100644 --- a/configure.ac +++ b/configure.ac @@ -293,8 +293,10 @@ AC_CONFIG_FILES([Makefile test/examples/12-PythonBasicService/Makefile test/examples/13-Relay/Makefile test/examples/13-Relay/run.sh - test/examples/14-AnomalyDetection/train.sh - test/examples/14-AnomalyDetection/detect.sh]) + test/examples/14-AnomalyDetection/train.sh + test/examples/14-AnomalyDetection/detect.sh + test/examples/15-SpdlogDynamicConfiguration/Makefile + test/examples/15-SpdLogDynamicConfiguration/run.sh]) AC_OUTPUT diff --git a/test/examples/15-SpdlogDynamicConfiguration/CMakeLists.txt b/test/examples/15-SpdlogDynamicConfiguration/CMakeLists.txt new file mode 100644 index 000000000..76bac35ef --- /dev/null +++ b/test/examples/15-SpdlogDynamicConfiguration/CMakeLists.txt @@ -0,0 +1,16 @@ +cmake_minimum_required(VERSION 3.17) +include(GravitySupport) +project(SpdlogDynamicConfiguration) + +find_package(PThreadsWin32 REQUIRED) +gravity_find_protobuf(ON) +gravity_find_zeromq(ON) +gravity_find_spdlog(ON) +find_package(GravityKeyValueParser REQUIRED) +find_package(Gravity REQUIRED) + +set(CMAKE_DEBUG_POSTFIX _d) +add_executable(SpdlogConfigurationPublisherTest SpdlogConfigurationPublisherTest.cpp) +set_target_properties(SpdlogConfigurationPublisherTest PROPERTIES DEBUG_POSTFIX ${CMAKE_DEBUG_POSTFIX}) +target_link_libraries(SpdlogConfigurationPublisherTest gravity) +install(TARGETS SpdlogConfigurationPublisherTest DESTINATION bin) \ No newline at end of file From ee436cb23b0a480d7f4e6cb73f34ee37ec67c41a Mon Sep 17 00:00:00 2001 From: Annie Smith Date: Tue, 11 Jul 2023 14:53:31 -0400 Subject: [PATCH 11/21] configuration changes for spdlogconfig example --- configure | 2 +- configure.ac | 2 +- src/api/protobufs/GravitySpdLogConfigPB.proto | 2 +- .../SpdlogConfigurationPublisherTest.cpp | 96 +++++++++---------- 4 files changed, 51 insertions(+), 51 deletions(-) diff --git a/configure b/configure index 663b21dc9..8ef12edd2 100755 --- a/configure +++ b/configure @@ -6227,7 +6227,7 @@ fi CPPFLAGS="$CPPFLAGS -Wall" -ac_config_files="$ac_config_files Makefile src/api/MATLAB/Makefile src/api/cpp/Makefile src/components/cpp/Makefile src/components/cpp/Archiver/Makefile src/components/cpp/ConfigServer/Makefile src/components/cpp/LogRecorder/Makefile src/components/cpp/Playback/Makefile src/components/cpp/Relay/Makefile src/components/cpp/ServiceDirectory/Makefile src/keyvalue_parser/Makefile test/components/cpp/Makefile test/components/cpp/ServiceDirectory/Makefile test/components/cpp/ServiceDirectoryReregister/Makefile src/api/java/cpp_makefile src/api/java/java_makefile src/api/python/cpp_makefile src/api/python/Makefile test/api/cpp/Makefile test/api/java/Makefile test/api/python/Makefile test/components/cpp/ServiceDirectory/test.sh test/components/cpp/ServiceDirectoryReregister/test.sh test/api/cpp/test.sh test/api/java/test.sh test/api/python/test.sh test/examples/1-BasicDataProduct/Makefile test/examples/1-BasicDataProduct/run.sh test/examples/2-ProtobufDataProduct/Makefile test/examples/2-ProtobufDataProduct/run.sh test/examples/3-MultipleDataProduct/Makefile test/examples/3-MultipleDataProduct/run.sh test/examples/4-BasicService/Makefile test/examples/4-BasicService/run.sh test/examples/5-MiscFunctionality/Makefile test/examples/5-MiscFunctionality/run.sh test/examples/6-JavaProtobufDataProduct/Makefile test/examples/6-JavaProtobufDataProduct/run.sh test/examples/7-JavaBasicService/Makefile test/examples/7-JavaBasicService/run.sh test/examples/8-ConfigFile/Makefile test/examples/8-ConfigFile/run.sh test/examples/9-Domains/Makefile test/examples/9-Domains/run.sh test/examples/10-Archiving/Makefile test/examples/10-Archiving/run.sh test/examples/11-PythonPubSub/run.sh test/examples/11-PythonPubSub/Makefile test/examples/12-PythonBasicService/run.sh test/examples/12-PythonBasicService/Makefile test/examples/13-Relay/Makefile test/examples/13-Relay/run.sh test/examples/14-AnomalyDetection/train.sh test/examples/14-AnomalyDetection/detect.sh " +ac_config_files="$ac_config_files Makefile src/api/MATLAB/Makefile src/api/cpp/Makefile src/components/cpp/Makefile src/components/cpp/Archiver/Makefile src/components/cpp/ConfigServer/Makefile src/components/cpp/LogRecorder/Makefile src/components/cpp/Playback/Makefile src/components/cpp/Relay/Makefile src/components/cpp/ServiceDirectory/Makefile src/keyvalue_parser/Makefile test/components/cpp/Makefile test/components/cpp/ServiceDirectory/Makefile test/components/cpp/ServiceDirectoryReregister/Makefile src/api/java/cpp_makefile src/api/java/java_makefile src/api/python/cpp_makefile src/api/python/Makefile test/api/cpp/Makefile test/api/java/Makefile test/api/python/Makefile test/components/cpp/ServiceDirectory/test.sh test/components/cpp/ServiceDirectoryReregister/test.sh test/api/cpp/test.sh test/api/java/test.sh test/api/python/test.sh test/examples/1-BasicDataProduct/Makefile test/examples/1-BasicDataProduct/run.sh test/examples/2-ProtobufDataProduct/Makefile test/examples/2-ProtobufDataProduct/run.sh test/examples/3-MultipleDataProduct/Makefile test/examples/3-MultipleDataProduct/run.sh test/examples/4-BasicService/Makefile test/examples/4-BasicService/run.sh test/examples/5-MiscFunctionality/Makefile test/examples/5-MiscFunctionality/run.sh test/examples/6-JavaProtobufDataProduct/Makefile test/examples/6-JavaProtobufDataProduct/run.sh test/examples/7-JavaBasicService/Makefile test/examples/7-JavaBasicService/run.sh test/examples/8-ConfigFile/Makefile test/examples/8-ConfigFile/run.sh test/examples/9-Domains/Makefile test/examples/9-Domains/run.sh test/examples/10-Archiving/Makefile test/examples/10-Archiving/run.sh test/examples/11-PythonPubSub/run.sh test/examples/11-PythonPubSub/Makefile test/examples/12-PythonBasicService/run.sh test/examples/12-PythonBasicService/Makefile test/examples/13-Relay/Makefile test/examples/13-Relay/run.sh test/examples/14-AnomalyDetection/train.sh test/examples/14-AnomalyDetection/detect.sh test/examples/15-SpdlogDynamicConfiguration/Makefile test/examples/15-SpdlogDynamicConfiguration/run.sh " cat >confcache <<\_ACEOF diff --git a/configure.ac b/configure.ac index 3ddb8137e..6d4c95c3b 100644 --- a/configure.ac +++ b/configure.ac @@ -296,7 +296,7 @@ AC_CONFIG_FILES([Makefile test/examples/14-AnomalyDetection/train.sh test/examples/14-AnomalyDetection/detect.sh test/examples/15-SpdlogDynamicConfiguration/Makefile - test/examples/15-SpdLogDynamicConfiguration/run.sh]) + test/examples/15-SpdlogDynamicConfiguration/run.sh]) AC_OUTPUT diff --git a/src/api/protobufs/GravitySpdLogConfigPB.proto b/src/api/protobufs/GravitySpdLogConfigPB.proto index 65fd25fdb..afcd0bd1b 100755 --- a/src/api/protobufs/GravitySpdLogConfigPB.proto +++ b/src/api/protobufs/GravitySpdLogConfigPB.proto @@ -31,7 +31,7 @@ message GravitySpdLogConfigPB debug = 1; info = 2; warn = 3; - err = 4; + error = 4; critical = 5; off = 6; } diff --git a/test/examples/15-SpdlogDynamicConfiguration/SpdlogConfigurationPublisherTest.cpp b/test/examples/15-SpdlogDynamicConfiguration/SpdlogConfigurationPublisherTest.cpp index 4f794ad0e..7fcae5713 100644 --- a/test/examples/15-SpdlogDynamicConfiguration/SpdlogConfigurationPublisherTest.cpp +++ b/test/examples/15-SpdlogDynamicConfiguration/SpdlogConfigurationPublisherTest.cpp @@ -1,6 +1,11 @@ #include #include +#include #include "protobuf/GravitySpdLogConfigPB.pb.h" +#include "protobuf/GravityLogMessagePB.pb.h" + +using namespace std; +using namespace gravity; #ifdef WIN32 #include @@ -9,12 +14,44 @@ #include #endif -class SimpleSubscriber : public GravitySubscriber -{ +class SimpleSubscriber : public GravitySubscriber { public: virtual void subscriptionFilled(const std::vector< std::shared_ptr >& dataProducts); }; +void logAllAppLevels() +{ + spdlog::trace("AppTraceLog"); + spdlog::debug("AppDebugLog"); + spdlog::info("AppInfoLog"); + spdlog::warn("AppWarnLog"); + spdlog::error("AppErrorLog"); + spdlog::critical("AppCriticalLog"); +} + +void sendConfigMessage(GravityNode &gn,std::string dataProductID,std::string compID, GravitySpdLogConfigPB_LoggerType lt, GravitySpdLogConfigPB_LoggerLevel ll) +{ + //Create a data product to send across the network + GravityDataProduct gravityConfigDP(dataProductID); + + //Initialize our message + GravitySpdLogConfigPB spdLogConfigPB; + if(compID != "") + { + spdLogConfigPB.set_component_id(compID); + } + + spdLogConfigPB.set_logger_id(lt); + spdLogConfigPB.set_logger_level(ll); + gravityConfigDP.setData(spdLogConfigPB); + + //Publish the data product. + if (gn.publish(gravityConfigDP) != GravityReturnCodes::SUCCESS) + { + spdlog::error("Could not publish data product with id {}", dataProductID); + } +} + int main() { using namespace gravity; @@ -23,31 +60,28 @@ int main() GravityNode gn2; //Initialize gravity, giving this node a componentID. - GravityReturnCode ret = gn1.init("SimpleGravityComponentID1"); - if (ret != GravityReturnCodes::SUCCESS) + if (gn1.init("SimpleGravityComponentID1") != GravityReturnCodes::SUCCESS) { - spdlog::critical("Could not initialize GravityNode, return code was {}", ret); + spdlog::critical("Could not initialize GravityNode"); exit(1); } - GravityReturnCode ret = gn2.init("SimpleGravityComponentID2"); - if (ret != GravityReturnCodes::SUCCESS) + if (gn2.init("SimpleGravityComponentID2") != GravityReturnCodes::SUCCESS) { - spdlog::critical("Could not initialize GravityNode, return code was {}", ret); + spdlog::critical("Could not initialize GravityNode"); exit(1); } //Register a data product const std::string dataProductID = "GravitySpdLogConfig"; - ret = gn1.registerDataProduct(dataProductID, GravityTransportTypes::TCP); - if (ret != GravityReturnCodes::SUCCESS) + if (gn1.registerDataProduct(dataProductID, GravityTransportTypes::TCP) != GravityReturnCodes::SUCCESS) { - spdlog::critical("Could not register data product with id {}, return code was {}", dataProductID, ret); + spdlog::critical("Could not register data product with id {}", dataProductID); exit(1); } // Set up a subscriber to the Application Publisher Logger SimpleSubscriber simpleSubscriber; - gn1.subscribe(gravity::constants::GRAVITY_LOGGER_DPID, simpleSubscriber) + gn1.subscribe(gravity::constants::GRAVITY_LOGGER_DPID, simpleSubscriber); sleep(1000); // All components begin as off, nothing should print // Change SimpleGravityComponentID1's GravityConsole to trace and file to debug @@ -80,44 +114,10 @@ int main() sleep(1000); // wait to allow for some gravity messages to generate (but none should be logged) } -void logAllAppLevels() -{ - spdlog::trace("AppTraceLog"); - spdlog::debug("AppDebugLog"); - spdlog::info("AppInfoLog"); - spdlog::warn("AppWarnLog"); - spdlog::err("AppErrorLog"); - spdlog::critical("AppCriticalLog"); -} - -void sendConfigMessage(GravityNode gn, std::string dataProductID,std::string compID, GravitySpdLogConfigPB_LoggerType lt, GravitySpdLogConfigPB_LoggerLevel ll) -{ - //Create a data product to send across the network - GravityDataProduct gravityConfigDP(dataProductID); - - //Initialize our message - GravitySpdLogConfigPB spdLogConfigPB; - if(compId != "") - { - spdLogConfigPB.set_component_id(compID); - } - - spdLogConfigPB.set_logger_id(lt); - spdLogConfigPB.set_logger_level(ll); - gravityConfigDP.set_data(spdLogConfigPB); - - //Publish the data product. - ret = gn.publish(gravityConfigDP); - if (ret != GravityReturnCodes::SUCCESS) - { - spdlog::error("Could not publish data product with id {}, return code was {}", dataProductID, ret); - } -} - -void SimpleGravityCounterSubscriber::subscriptionFilled(const std::vector< std::shared_ptr >& dataProducts) +void SimpleSubscriber::subscriptionFilled(const std::vector< std::shared_ptr >& dataProducts) { for(std::vector< std::shared_ptr >::const_iterator i = dataProducts.begin(); - i != dataProducts.end(); i++) + i != dataProducts.end(); i++) { //Get the protobuf object from the message GravityLogMessagePB logMessage; From 5a6bb203ee7db178e90f5db78c0c6ebd723e4d3b Mon Sep 17 00:00:00 2001 From: Annie Smith Date: Tue, 11 Jul 2023 17:01:07 -0400 Subject: [PATCH 12/21] debug message to check subscription --- .../SpdlogConfigurationPublisherTest.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/test/examples/15-SpdlogDynamicConfiguration/SpdlogConfigurationPublisherTest.cpp b/test/examples/15-SpdlogDynamicConfiguration/SpdlogConfigurationPublisherTest.cpp index 7fcae5713..d0a716929 100644 --- a/test/examples/15-SpdlogDynamicConfiguration/SpdlogConfigurationPublisherTest.cpp +++ b/test/examples/15-SpdlogDynamicConfiguration/SpdlogConfigurationPublisherTest.cpp @@ -97,14 +97,12 @@ int main() sleep(1000); // wait for some gravity messages to log (only ID1 is printing this) - // Change both components' ApplicationNetwork to info + // Change ID1 ApplicationNetwork to critical, both components' ApplicationConsole to info sendConfigMessage(gn1, dataProductID, "SimpleGravityComponentID1", GravitySpdLogConfigPB_LoggerType_ApplicationNetworkLogger, GravitySpdLogConfigPB_LoggerLevel_critical); sendConfigMessage(gn1, dataProductID, "", GravitySpdLogConfigPB_LoggerType_ApplicationConsoleLogger, GravitySpdLogConfigPB_LoggerLevel_info); - logAllAppLevels(); // both ApplicationConsole should be logging at info, application network for ID1 logging critical - - // Check subscriber to make sure they are logged - + // Wait for subscriber to receive this + sleep(1000); // Change all logger's changed back to off sendConfigMessage(gn1, dataProductID,"SimpleGravityComponentID1", GravitySpdLogConfigPB_LoggerType_GravityConsoleLogger, GravitySpdLogConfigPB_LoggerLevel_off); sendConfigMessage(gn1, dataProductID,"SimpleGravityComponentID1", GravitySpdLogConfigPB_LoggerType_GravityFileLogger, GravitySpdLogConfigPB_LoggerLevel_off); @@ -123,6 +121,7 @@ void SimpleSubscriber::subscriptionFilled(const std::vector< std::shared_ptrpopulateMessage(logMessage); + cout << "Hello"; if(logMessage.message() == "AppCriticalLog" && logMessage.level() == "critical") { std::string isValid("The correct level and message were published"); From 32633a5b3e76d56c7a7b21b747ffdccef32d97b7 Mon Sep 17 00:00:00 2001 From: Annie Smith Date: Wed, 12 Jul 2023 13:14:12 -0400 Subject: [PATCH 13/21] current log messages for debugging --- src/api/cpp/GravityNode.cpp | 4 +- src/api/cpp/GravitySpdLogConfigSubscriber.cpp | 5 +- .../15-SpdlogDynamicConfiguration/Gravity.ini | 6 +- .../SpdlogConfigurationPublisherTest.cpp | 79 +++++++++---------- 4 files changed, 49 insertions(+), 45 deletions(-) diff --git a/src/api/cpp/GravityNode.cpp b/src/api/cpp/GravityNode.cpp index d12cf2959..28451671c 100755 --- a/src/api/cpp/GravityNode.cpp +++ b/src/api/cpp/GravityNode.cpp @@ -643,8 +643,10 @@ void GravityNode::configSpdLoggers() } // Set up the subscriber for any reconfiguration messages + const std::string dataProductID = "GravitySpdLogConfig"; spdLogConfigSub.init(componentID); - this->subscribe("GravitySpdLogConfig", spdLogConfigSub); + this->subscribe(dataProductID, spdLogConfigSub); + std::cout << "Subscribed to data product " << dataProductID << "\n"; } GravityReturnCode GravityNode::init() diff --git a/src/api/cpp/GravitySpdLogConfigSubscriber.cpp b/src/api/cpp/GravitySpdLogConfigSubscriber.cpp index c821eb90c..e1a7f426f 100644 --- a/src/api/cpp/GravitySpdLogConfigSubscriber.cpp +++ b/src/api/cpp/GravitySpdLogConfigSubscriber.cpp @@ -1,5 +1,5 @@ #include - +#include #include "GravitySpdLogConfigSubscriber.h" #include "spdlog/spdlog.h" #include "protobuf/GravitySpdLogConfigPB.pb.h" @@ -9,10 +9,12 @@ namespace gravity { SpdLogConfigSubscriber::SpdLogConfigSubscriber(){} void SpdLogConfigSubscriber::init(std::string compID) { + std::cout<< "Set up ConfigSub for " << compID << "\n"; componentID = compID; } void SpdLogConfigSubscriber::subscriptionFilled(const std::vector< std::shared_ptr >& dataProducts) { + std::cout<< "Receiving subscription " << componentID << "\n"; for(std::vector< std::shared_ptr >::const_iterator i = dataProducts.begin(); i != dataProducts.end(); i++) { //Get the protobuf object from the message @@ -32,6 +34,7 @@ namespace gravity { return; } + std::cout<<"Going to reconfigure " << spdLogConfigPB.logger_id() << " to " << spdLogConfigPB.logger_level() << "\n"; if (spdLogConfigPB.logger_id() == GravitySpdLogConfigPB_LoggerType_GravityConsoleLogger || spdLogConfigPB.logger_id() == GravitySpdLogConfigPB_LoggerType_GravityFileLogger) { auto log = spdlog::get("GravityLogger"); diff --git a/test/examples/15-SpdlogDynamicConfiguration/Gravity.ini b/test/examples/15-SpdlogDynamicConfiguration/Gravity.ini index 33ee11717..eb4d15f66 100644 --- a/test/examples/15-SpdlogDynamicConfiguration/Gravity.ini +++ b/test/examples/15-SpdlogDynamicConfiguration/Gravity.ini @@ -2,6 +2,10 @@ NoConfigServer=true Domain=GravityTest ServiceDirectoryBroadcastTimeout=15 - +GravityFileLogLevel=off +GravityConsoleLogLevel=off +AppFileLogLevel=off +AppConsoleLogLevel=off +AppNetworkLogLevel=off [ServiceDirectory] BroadcastEnabled=true diff --git a/test/examples/15-SpdlogDynamicConfiguration/SpdlogConfigurationPublisherTest.cpp b/test/examples/15-SpdlogDynamicConfiguration/SpdlogConfigurationPublisherTest.cpp index d0a716929..8833fcd21 100644 --- a/test/examples/15-SpdlogDynamicConfiguration/SpdlogConfigurationPublisherTest.cpp +++ b/test/examples/15-SpdlogDynamicConfiguration/SpdlogConfigurationPublisherTest.cpp @@ -21,12 +21,12 @@ class SimpleSubscriber : public GravitySubscriber { void logAllAppLevels() { - spdlog::trace("AppTraceLog"); - spdlog::debug("AppDebugLog"); - spdlog::info("AppInfoLog"); - spdlog::warn("AppWarnLog"); - spdlog::error("AppErrorLog"); - spdlog::critical("AppCriticalLog"); + spdlog::trace("App"); + spdlog::debug("App"); + spdlog::info("App"); + spdlog::warn("App"); + spdlog::error("App"); + spdlog::critical("App"); } void sendConfigMessage(GravityNode &gn,std::string dataProductID,std::string compID, GravitySpdLogConfigPB_LoggerType lt, GravitySpdLogConfigPB_LoggerLevel ll) @@ -49,23 +49,17 @@ void sendConfigMessage(GravityNode &gn,std::string dataProductID,std::string com if (gn.publish(gravityConfigDP) != GravityReturnCodes::SUCCESS) { spdlog::error("Could not publish data product with id {}", dataProductID); + } + std::cout<<"Set logger id " << lt << " and level " << ll << " for " << compID << " and published data product " << dataProductID << "\n"; } int main() { - using namespace gravity; - - GravityNode gn1; - GravityNode gn2; + GravityNode gn; //Initialize gravity, giving this node a componentID. - if (gn1.init("SimpleGravityComponentID1") != GravityReturnCodes::SUCCESS) - { - spdlog::critical("Could not initialize GravityNode"); - exit(1); - } - if (gn2.init("SimpleGravityComponentID2") != GravityReturnCodes::SUCCESS) + if (gn.init("SimpleGravityComponentID1") != GravityReturnCodes::SUCCESS) { spdlog::critical("Could not initialize GravityNode"); exit(1); @@ -73,43 +67,44 @@ int main() //Register a data product const std::string dataProductID = "GravitySpdLogConfig"; - if (gn1.registerDataProduct(dataProductID, GravityTransportTypes::TCP) != GravityReturnCodes::SUCCESS) + if (gn.registerDataProduct(dataProductID, GravityTransportTypes::TCP) != GravityReturnCodes::SUCCESS) { spdlog::critical("Could not register data product with id {}", dataProductID); exit(1); } + std::cout << "Registered data product " << dataProductID << "\n"; // Set up a subscriber to the Application Publisher Logger SimpleSubscriber simpleSubscriber; - gn1.subscribe(gravity::constants::GRAVITY_LOGGER_DPID, simpleSubscriber); + gn.subscribe(gravity::constants::GRAVITY_LOGGER_DPID, simpleSubscriber); - sleep(1000); // All components begin as off, nothing should print // Change SimpleGravityComponentID1's GravityConsole to trace and file to debug - sendConfigMessage(gn1, dataProductID,"SimpleGravityComponentID1", GravitySpdLogConfigPB_LoggerType_GravityConsoleLogger, GravitySpdLogConfigPB_LoggerLevel_trace); - sendConfigMessage(gn1, dataProductID,"SimpleGravityComponentID1", GravitySpdLogConfigPB_LoggerType_GravityFileLogger, GravitySpdLogConfigPB_LoggerLevel_debug); + sendConfigMessage(gn, dataProductID,"SimpleGravityComponentID1", GravitySpdLogConfigPB_LoggerType_GravityConsoleLogger, GravitySpdLogConfigPB_LoggerLevel_trace); + sendConfigMessage(gn, dataProductID,"SimpleGravityComponentID1", GravitySpdLogConfigPB_LoggerType_GravityFileLogger, GravitySpdLogConfigPB_LoggerLevel_debug); logAllAppLevels(); // nothing from application should log + sleep(5000); - sleep(1000); // wait for some gravity messages to log (only ID1 is printing this) - - // Change SimpleGravityComponentID1's ApplicationFile to trace and file to debug - sendConfigMessage(gn1, dataProductID, "SimpleGravityComponentID2", GravitySpdLogConfigPB_LoggerType_ApplicationFileLogger, GravitySpdLogConfigPB_LoggerLevel_error); - logAllAppLevels(); // only ID2 application file should be logging + // Nothing changes as component ID does not work + sendConfigMessage(gn, dataProductID, "NotARealID", GravitySpdLogConfigPB_LoggerType_ApplicationFileLogger, GravitySpdLogConfigPB_LoggerLevel_error); + logAllAppLevels(); + sleep(5000); - sleep(1000); // wait for some gravity messages to log (only ID1 is printing this) + // Change ID1 ApplicationNetwork to critical, any subscribed component ApplicationConsole to info + sendConfigMessage(gn, dataProductID, "SimpleGravityComponentID1", GravitySpdLogConfigPB_LoggerType_ApplicationNetworkLogger, GravitySpdLogConfigPB_LoggerLevel_critical); + sendConfigMessage(gn, dataProductID, "", GravitySpdLogConfigPB_LoggerType_ApplicationConsoleLogger, GravitySpdLogConfigPB_LoggerLevel_info); + logAllAppLevels(); + sleep(5000); - // Change ID1 ApplicationNetwork to critical, both components' ApplicationConsole to info - sendConfigMessage(gn1, dataProductID, "SimpleGravityComponentID1", GravitySpdLogConfigPB_LoggerType_ApplicationNetworkLogger, GravitySpdLogConfigPB_LoggerLevel_critical); - sendConfigMessage(gn1, dataProductID, "", GravitySpdLogConfigPB_LoggerType_ApplicationConsoleLogger, GravitySpdLogConfigPB_LoggerLevel_info); - logAllAppLevels(); // both ApplicationConsole should be logging at info, application network for ID1 logging critical - // Wait for subscriber to receive this - sleep(1000); // Change all logger's changed back to off - sendConfigMessage(gn1, dataProductID,"SimpleGravityComponentID1", GravitySpdLogConfigPB_LoggerType_GravityConsoleLogger, GravitySpdLogConfigPB_LoggerLevel_off); - sendConfigMessage(gn1, dataProductID,"SimpleGravityComponentID1", GravitySpdLogConfigPB_LoggerType_GravityFileLogger, GravitySpdLogConfigPB_LoggerLevel_off); - sendConfigMessage(gn1, dataProductID, "SimpleGravityComponentID2", GravitySpdLogConfigPB_LoggerType_ApplicationFileLogger, GravitySpdLogConfigPB_LoggerLevel_off); - sendConfigMessage(gn1, dataProductID, "", GravitySpdLogConfigPB_LoggerType_ApplicationNetworkLogger, GravitySpdLogConfigPB_LoggerLevel_off); - logAllAppLevels(); // none should log anything - sleep(1000); // wait to allow for some gravity messages to generate (but none should be logged) + sendConfigMessage(gn, dataProductID,"SimpleGravityComponentID1", GravitySpdLogConfigPB_LoggerType_GravityConsoleLogger, GravitySpdLogConfigPB_LoggerLevel_off); + sendConfigMessage(gn, dataProductID,"SimpleGravityComponentID1", GravitySpdLogConfigPB_LoggerType_GravityFileLogger, GravitySpdLogConfigPB_LoggerLevel_off); + sendConfigMessage(gn, dataProductID, "SimpleGravityComponentID1", GravitySpdLogConfigPB_LoggerType_ApplicationNetworkLogger, GravitySpdLogConfigPB_LoggerLevel_off); + sendConfigMessage(gn, dataProductID, "", GravitySpdLogConfigPB_LoggerType_ApplicationConsoleLogger, GravitySpdLogConfigPB_LoggerLevel_off); + logAllAppLevels(); + sleep(5000); + + gn.waitForExit(); + gn.unsubscribe(gravity::constants::GRAVITY_LOGGER_DPID, simpleSubscriber); } void SimpleSubscriber::subscriptionFilled(const std::vector< std::shared_ptr >& dataProducts) @@ -121,11 +116,11 @@ void SimpleSubscriber::subscriptionFilled(const std::vector< std::shared_ptrpopulateMessage(logMessage); - cout << "Hello"; - if(logMessage.message() == "AppCriticalLog" && logMessage.level() == "critical") + std::cout << "Received Application network log message"; + if(logMessage.message() == "App" && logMessage.level() == "critical") { std::string isValid("The correct level and message were published"); - cout << isValid; + std::cout << isValid; } } } \ No newline at end of file From 8b30238e099c7fa8c3a1294966a82ce7e30637cd Mon Sep 17 00:00:00 2001 From: Annie Smith Date: Thu, 13 Jul 2023 11:16:45 -0400 Subject: [PATCH 14/21] change configuration to occur after init complete --- src/api/cpp/GravityNode.cpp | 28 ++++++++++------- src/api/cpp/GravityNode.h | 8 +++++ src/api/cpp/GravitySubscriptionManager.cpp | 2 +- .../SpdlogConfigurationPublisherTest.cpp | 31 ++++++++++--------- 4 files changed, 41 insertions(+), 28 deletions(-) diff --git a/src/api/cpp/GravityNode.cpp b/src/api/cpp/GravityNode.cpp index 28451671c..7251fd83c 100755 --- a/src/api/cpp/GravityNode.cpp +++ b/src/api/cpp/GravityNode.cpp @@ -635,18 +635,9 @@ void GravityNode::configSpdLoggers() app_logger->flush_on(spdlog::level::trace); // logger will flush on all messages app_logger->set_pattern("[%Y-%m-%d %T.%f " + componentID + "-%l] %v"); spdlog::register_logger(app_logger); - - if ((app_file_level != SPDLOG_LEVEL_OFF) || (app_console_level != SPDLOG_LEVEL_OFF) || (app_publish_level != SPDLOG_LEVEL_OFF)) - { - // Set the ApplicationLogger as the default - spdlog::set_default_logger(app_logger); - } - // Set up the subscriber for any reconfiguration messages - const std::string dataProductID = "GravitySpdLogConfig"; - spdLogConfigSub.init(componentID); - this->subscribe(dataProductID, spdLogConfigSub); - std::cout << "Subscribed to data product " << dataProductID << "\n"; + // Set the ApplicationLogger as the default + spdlog::set_default_logger(app_logger); } GravityReturnCode GravityNode::init() @@ -1683,7 +1674,6 @@ GravityReturnCode GravityNode::subscribeInternal(string dataProductID, const Gra } logger->trace("Subscribing to [{}] and receiving cached values: {}", dataProductID, receiveLastCachedValue); - vector registeredPublishersInfo; int tries = 5; while (registeredPublishersInfo.size() == 0 && tries-- > 0) @@ -2505,6 +2495,20 @@ GravityReturnCode GravityNode::unregisterHeartbeatListener(string componentID, s return GravityReturnCodes::SUCCESS; } +GravityReturnCode GravityNode::registerSpdlogConfiguration() +{ + // Set up the subscriber for any reconfiguration messages + const std::string dataProductID = "GravitySpdLogConfig"; + spdLogConfigSub.init(componentID); + GravityReturnCode ret = GravityReturnCodes::SUCCESS; + ret = this->subscribe(dataProductID, spdLogConfigSub); + if (ret!=GravityReturnCodes::SUCCESS) + { + spdlog::error("Unsuccessfully registered data product {}", ret); + } + return ret; +} + GravityReturnCode GravityNode::registerRelay(string dataProductID, const GravitySubscriber& subscriber, bool localOnly, GravityTransportType transportType) { return registerRelay(dataProductID, subscriber, localOnly, transportType, false); diff --git a/src/api/cpp/GravityNode.h b/src/api/cpp/GravityNode.h index dff4910ba..45cb11016 100755 --- a/src/api/cpp/GravityNode.h +++ b/src/api/cpp/GravityNode.h @@ -503,6 +503,14 @@ class GravityNode */ GRAVITY_API GravityReturnCode unregisterHeartbeatListener(std::string componentID, std::string domain = ""); + + /** + * Sets up the ability to reconfigure spdlog levels + * potentially add in params?? + * \return success flag + */ + GRAVITY_API GravityReturnCode registerSpdlogConfiguration(); + /** * Register a Relay that will act as a pass-through for the given dataProductID. It will be a publisher and subscriber * for the given dataProductID, but other components will only subscribe to this data if they are on the same host (localOnly == true), or diff --git a/src/api/cpp/GravitySubscriptionManager.cpp b/src/api/cpp/GravitySubscriptionManager.cpp index 9de5094aa..6089a93be 100755 --- a/src/api/cpp/GravitySubscriptionManager.cpp +++ b/src/api/cpp/GravitySubscriptionManager.cpp @@ -345,7 +345,7 @@ void GravitySubscriptionManager::start() // Loop through all subscribers and deliver the messages if(dataProducts.size() != 0) { - logger->trace("received {} gdp's, about to send to {} subscribers", dataProducts.size(), subDetails->subscribers.size()); + logger->trace("received {} gdp's, about to send {} to {} subscribers", dataProducts.size(),subDetails->dataProductID, subDetails->subscribers.size()); for (set::iterator iter = subDetails->subscribers.begin(); iter != subDetails->subscribers.end(); iter++) { diff --git a/test/examples/15-SpdlogDynamicConfiguration/SpdlogConfigurationPublisherTest.cpp b/test/examples/15-SpdlogDynamicConfiguration/SpdlogConfigurationPublisherTest.cpp index 8833fcd21..3b7f0bdbc 100644 --- a/test/examples/15-SpdlogDynamicConfiguration/SpdlogConfigurationPublisherTest.cpp +++ b/test/examples/15-SpdlogDynamicConfiguration/SpdlogConfigurationPublisherTest.cpp @@ -51,7 +51,6 @@ void sendConfigMessage(GravityNode &gn,std::string dataProductID,std::string com spdlog::error("Could not publish data product with id {}", dataProductID); } - std::cout<<"Set logger id " << lt << " and level " << ll << " for " << compID << " and published data product " << dataProductID << "\n"; } int main() @@ -72,43 +71,45 @@ int main() spdlog::critical("Could not register data product with id {}", dataProductID); exit(1); } - std::cout << "Registered data product " << dataProductID << "\n"; - + + // Register the subscriber for spdlog regconfiguration // Set up a subscriber to the Application Publisher Logger + gn.registerSpdlogConfiguration(); SimpleSubscriber simpleSubscriber; gn.subscribe(gravity::constants::GRAVITY_LOGGER_DPID, simpleSubscriber); - - // Change SimpleGravityComponentID1's GravityConsole to trace and file to debug - sendConfigMessage(gn, dataProductID,"SimpleGravityComponentID1", GravitySpdLogConfigPB_LoggerType_GravityConsoleLogger, GravitySpdLogConfigPB_LoggerLevel_trace); - sendConfigMessage(gn, dataProductID,"SimpleGravityComponentID1", GravitySpdLogConfigPB_LoggerType_GravityFileLogger, GravitySpdLogConfigPB_LoggerLevel_debug); - logAllAppLevels(); // nothing from application should log + + // Change SimpleGravityComponentID1's GravityFile to trace and GravityConsole to debug + // sendConfigMessage(gn, dataProductID,"SimpleGravityComponentID1", GravitySpdLogConfigPB_LoggerType_GravityConsoleLogger, GravitySpdLogConfigPB_LoggerLevel_debug); + sendConfigMessage(gn, dataProductID,"SimpleGravityComponentID1", GravitySpdLogConfigPB_LoggerType_GravityFileLogger, GravitySpdLogConfigPB_LoggerLevel_trace); sleep(5000); - + logAllAppLevels(); // nothing from application should log + /* // Nothing changes as component ID does not work sendConfigMessage(gn, dataProductID, "NotARealID", GravitySpdLogConfigPB_LoggerType_ApplicationFileLogger, GravitySpdLogConfigPB_LoggerLevel_error); - logAllAppLevels(); sleep(5000); + logAllAppLevels(); + */ // Change ID1 ApplicationNetwork to critical, any subscribed component ApplicationConsole to info sendConfigMessage(gn, dataProductID, "SimpleGravityComponentID1", GravitySpdLogConfigPB_LoggerType_ApplicationNetworkLogger, GravitySpdLogConfigPB_LoggerLevel_critical); - sendConfigMessage(gn, dataProductID, "", GravitySpdLogConfigPB_LoggerType_ApplicationConsoleLogger, GravitySpdLogConfigPB_LoggerLevel_info); - logAllAppLevels(); + //sendConfigMessage(gn, dataProductID, "", GravitySpdLogConfigPB_LoggerType_ApplicationConsoleLogger, GravitySpdLogConfigPB_LoggerLevel_info); sleep(5000); + logAllAppLevels(); // Change all logger's changed back to off sendConfigMessage(gn, dataProductID,"SimpleGravityComponentID1", GravitySpdLogConfigPB_LoggerType_GravityConsoleLogger, GravitySpdLogConfigPB_LoggerLevel_off); sendConfigMessage(gn, dataProductID,"SimpleGravityComponentID1", GravitySpdLogConfigPB_LoggerType_GravityFileLogger, GravitySpdLogConfigPB_LoggerLevel_off); - sendConfigMessage(gn, dataProductID, "SimpleGravityComponentID1", GravitySpdLogConfigPB_LoggerType_ApplicationNetworkLogger, GravitySpdLogConfigPB_LoggerLevel_off); + //sendConfigMessage(gn, dataProductID, "SimpleGravityComponentID1", GravitySpdLogConfigPB_LoggerType_ApplicationNetworkLogger, GravitySpdLogConfigPB_LoggerLevel_off); sendConfigMessage(gn, dataProductID, "", GravitySpdLogConfigPB_LoggerType_ApplicationConsoleLogger, GravitySpdLogConfigPB_LoggerLevel_off); - logAllAppLevels(); sleep(5000); + logAllAppLevels(); gn.waitForExit(); - gn.unsubscribe(gravity::constants::GRAVITY_LOGGER_DPID, simpleSubscriber); } void SimpleSubscriber::subscriptionFilled(const std::vector< std::shared_ptr >& dataProducts) { + std::cout << "GRAVITY_LOGGER data product message received"; for(std::vector< std::shared_ptr >::const_iterator i = dataProducts.begin(); i != dataProducts.end(); i++) { From 67242f32412e979a54e02556f09401f4d1ec68f6 Mon Sep 17 00:00:00 2001 From: Annie Smith Date: Fri, 14 Jul 2023 08:41:55 -0400 Subject: [PATCH 15/21] Change test structure --- src/api/cpp/GravitySpdLogConfigSubscriber.cpp | 3 - src/api/cpp/GravitySubscriptionManager.cpp | 2 +- .../SpdlogConfigurationPublisherTest.cpp | 57 ++++++++++++------- .../15-SpdlogDynamicConfiguration/run.sh.in | 12 ++-- 4 files changed, 45 insertions(+), 29 deletions(-) diff --git a/src/api/cpp/GravitySpdLogConfigSubscriber.cpp b/src/api/cpp/GravitySpdLogConfigSubscriber.cpp index e1a7f426f..e3b3330bd 100644 --- a/src/api/cpp/GravitySpdLogConfigSubscriber.cpp +++ b/src/api/cpp/GravitySpdLogConfigSubscriber.cpp @@ -9,12 +9,10 @@ namespace gravity { SpdLogConfigSubscriber::SpdLogConfigSubscriber(){} void SpdLogConfigSubscriber::init(std::string compID) { - std::cout<< "Set up ConfigSub for " << compID << "\n"; componentID = compID; } void SpdLogConfigSubscriber::subscriptionFilled(const std::vector< std::shared_ptr >& dataProducts) { - std::cout<< "Receiving subscription " << componentID << "\n"; for(std::vector< std::shared_ptr >::const_iterator i = dataProducts.begin(); i != dataProducts.end(); i++) { //Get the protobuf object from the message @@ -34,7 +32,6 @@ namespace gravity { return; } - std::cout<<"Going to reconfigure " << spdLogConfigPB.logger_id() << " to " << spdLogConfigPB.logger_level() << "\n"; if (spdLogConfigPB.logger_id() == GravitySpdLogConfigPB_LoggerType_GravityConsoleLogger || spdLogConfigPB.logger_id() == GravitySpdLogConfigPB_LoggerType_GravityFileLogger) { auto log = spdlog::get("GravityLogger"); diff --git a/src/api/cpp/GravitySubscriptionManager.cpp b/src/api/cpp/GravitySubscriptionManager.cpp index 6089a93be..cd8aab739 100755 --- a/src/api/cpp/GravitySubscriptionManager.cpp +++ b/src/api/cpp/GravitySubscriptionManager.cpp @@ -345,7 +345,7 @@ void GravitySubscriptionManager::start() // Loop through all subscribers and deliver the messages if(dataProducts.size() != 0) { - logger->trace("received {} gdp's, about to send {} to {} subscribers", dataProducts.size(),subDetails->dataProductID, subDetails->subscribers.size()); + logger->trace("received {} gdp's to {} subscribers", dataProducts.size(), subDetails->subscribers.size()); for (set::iterator iter = subDetails->subscribers.begin(); iter != subDetails->subscribers.end(); iter++) { diff --git a/test/examples/15-SpdlogDynamicConfiguration/SpdlogConfigurationPublisherTest.cpp b/test/examples/15-SpdlogDynamicConfiguration/SpdlogConfigurationPublisherTest.cpp index 3b7f0bdbc..e762ac5c2 100644 --- a/test/examples/15-SpdlogDynamicConfiguration/SpdlogConfigurationPublisherTest.cpp +++ b/test/examples/15-SpdlogDynamicConfiguration/SpdlogConfigurationPublisherTest.cpp @@ -21,6 +21,8 @@ class SimpleSubscriber : public GravitySubscriber { void logAllAppLevels() { + // Wait to ensure it has been sent and received + sleep(3000); spdlog::trace("App"); spdlog::debug("App"); spdlog::info("App"); @@ -77,39 +79,52 @@ int main() gn.registerSpdlogConfiguration(); SimpleSubscriber simpleSubscriber; gn.subscribe(gravity::constants::GRAVITY_LOGGER_DPID, simpleSubscriber); + + std::cout<<"Begin testing GravityLogger\n"; - // Change SimpleGravityComponentID1's GravityFile to trace and GravityConsole to debug - // sendConfigMessage(gn, dataProductID,"SimpleGravityComponentID1", GravitySpdLogConfigPB_LoggerType_GravityConsoleLogger, GravitySpdLogConfigPB_LoggerLevel_debug); + // Change SimpleGravityComponentID1's File to trace level + // for gravity and trace level for the console sendConfigMessage(gn, dataProductID,"SimpleGravityComponentID1", GravitySpdLogConfigPB_LoggerType_GravityFileLogger, GravitySpdLogConfigPB_LoggerLevel_trace); - sleep(5000); - logAllAppLevels(); // nothing from application should log - /* - // Nothing changes as component ID does not work + sendConfigMessage(gn, dataProductID,"SimpleGravityComponentID1", GravitySpdLogConfigPB_LoggerType_GravityConsoleLogger, GravitySpdLogConfigPB_LoggerLevel_trace); + + logAllAppLevels(); // nothing prints + + // Turns off file and console for GravityLogger + // for SimpleGravityComponentID1 and ServiceDirectory + sendConfigMessage(gn, dataProductID,"SimpleGravityComponentID1", GravitySpdLogConfigPB_LoggerType_GravityConsoleLogger, GravitySpdLogConfigPB_LoggerLevel_off); + sendConfigMessage(gn, dataProductID,"", GravitySpdLogConfigPB_LoggerType_GravityFileLogger, GravitySpdLogConfigPB_LoggerLevel_off); + + std::cout<<"End testing GravityLogger\n"; + + // Nothing changes as NotARealID does not work sendConfigMessage(gn, dataProductID, "NotARealID", GravitySpdLogConfigPB_LoggerType_ApplicationFileLogger, GravitySpdLogConfigPB_LoggerLevel_error); - sleep(5000); logAllAppLevels(); - */ - // Change ID1 ApplicationNetwork to critical, any subscribed component ApplicationConsole to info + + std::cout<<"Begin testing ApplicationLogger\n"; + + // Change SimpleGravityComponentID1's network to critical level + // for ApplicationLogger and any subscribed components' console to info level + // and file to warn level sendConfigMessage(gn, dataProductID, "SimpleGravityComponentID1", GravitySpdLogConfigPB_LoggerType_ApplicationNetworkLogger, GravitySpdLogConfigPB_LoggerLevel_critical); - //sendConfigMessage(gn, dataProductID, "", GravitySpdLogConfigPB_LoggerType_ApplicationConsoleLogger, GravitySpdLogConfigPB_LoggerLevel_info); - sleep(5000); + sendConfigMessage(gn, dataProductID, "", GravitySpdLogConfigPB_LoggerType_ApplicationConsoleLogger, GravitySpdLogConfigPB_LoggerLevel_info); + sendConfigMessage(gn, dataProductID, "", GravitySpdLogConfigPB_LoggerType_ApplicationFileLogger, GravitySpdLogConfigPB_LoggerLevel_warn); logAllAppLevels(); // Change all logger's changed back to off - sendConfigMessage(gn, dataProductID,"SimpleGravityComponentID1", GravitySpdLogConfigPB_LoggerType_GravityConsoleLogger, GravitySpdLogConfigPB_LoggerLevel_off); - sendConfigMessage(gn, dataProductID,"SimpleGravityComponentID1", GravitySpdLogConfigPB_LoggerType_GravityFileLogger, GravitySpdLogConfigPB_LoggerLevel_off); - //sendConfigMessage(gn, dataProductID, "SimpleGravityComponentID1", GravitySpdLogConfigPB_LoggerType_ApplicationNetworkLogger, GravitySpdLogConfigPB_LoggerLevel_off); + sendConfigMessage(gn, dataProductID, "SimpleGravityComponentID1", GravitySpdLogConfigPB_LoggerType_ApplicationNetworkLogger, GravitySpdLogConfigPB_LoggerLevel_off); sendConfigMessage(gn, dataProductID, "", GravitySpdLogConfigPB_LoggerType_ApplicationConsoleLogger, GravitySpdLogConfigPB_LoggerLevel_off); - sleep(5000); + sendConfigMessage(gn, dataProductID, "", GravitySpdLogConfigPB_LoggerType_ApplicationFileLogger, GravitySpdLogConfigPB_LoggerLevel_off); + logAllAppLevels(); - gn.waitForExit(); + std::cout<<"End testing ApplicationLogger\n"; + + gn.unsubscribe(gravity::constants::GRAVITY_LOGGER_DPID, simpleSubscriber); } void SimpleSubscriber::subscriptionFilled(const std::vector< std::shared_ptr >& dataProducts) { - std::cout << "GRAVITY_LOGGER data product message received"; for(std::vector< std::shared_ptr >::const_iterator i = dataProducts.begin(); i != dataProducts.end(); i++) { @@ -117,11 +132,11 @@ void SimpleSubscriber::subscriptionFilled(const std::vector< std::shared_ptrpopulateMessage(logMessage); - std::cout << "Received Application network log message"; - if(logMessage.message() == "App" && logMessage.level() == "critical") + std::string message = logMessage.message(); + // Use a substring to cut off the time and level info (metadata) included in log string + if(message.substr(message.length()-4,3) == "App" && logMessage.level() == "critical") { - std::string isValid("The correct level and message were published"); - std::cout << isValid; + std::cout << "The correct level and message were published for Application Network Logger\n"; } } } \ No newline at end of file diff --git a/test/examples/15-SpdlogDynamicConfiguration/run.sh.in b/test/examples/15-SpdlogDynamicConfiguration/run.sh.in index 3259aadda..384d1bcd6 100644 --- a/test/examples/15-SpdlogDynamicConfiguration/run.sh.in +++ b/test/examples/15-SpdlogDynamicConfiguration/run.sh.in @@ -25,16 +25,16 @@ ZMQ_LIB_DIR=@ZEROMQ_LIBDIR@ export PATH=$PATH:../../../src/components/cpp/bin export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:../../../src/api/cpp:../../../src/keyvalue_parser:$ZMQ_LIB_DIR:$PROTOBUF_LIB_DIR - control_c() + cleanup() # run if user hits control-c { kill -9 $SDPID - kill -9 $PUBPID + kill -9 $PUBID exit $? } # trap keyboard interrupt (control-c) -trap control_c SIGINT +trap cleanup SIGINT ServiceDirectory & SDPID=$! @@ -43,4 +43,8 @@ SDPID=$! sleep 1 ./SpdlogConfigurationPublisherTest & -PUBPID=$! +PUBID=$! + +sleep 30 + +cleanup \ No newline at end of file From c494b9ba5ba04e86b478f6fda999fbe9e83cf56d Mon Sep 17 00:00:00 2001 From: Annie Smith Date: Fri, 14 Jul 2023 08:44:35 -0400 Subject: [PATCH 16/21] fixed subscription manager --- src/api/cpp/GravitySubscriptionManager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/api/cpp/GravitySubscriptionManager.cpp b/src/api/cpp/GravitySubscriptionManager.cpp index cd8aab739..9de5094aa 100755 --- a/src/api/cpp/GravitySubscriptionManager.cpp +++ b/src/api/cpp/GravitySubscriptionManager.cpp @@ -345,7 +345,7 @@ void GravitySubscriptionManager::start() // Loop through all subscribers and deliver the messages if(dataProducts.size() != 0) { - logger->trace("received {} gdp's to {} subscribers", dataProducts.size(), subDetails->subscribers.size()); + logger->trace("received {} gdp's, about to send to {} subscribers", dataProducts.size(), subDetails->subscribers.size()); for (set::iterator iter = subDetails->subscribers.begin(); iter != subDetails->subscribers.end(); iter++) { From 8ba6fe16507a5cab21a8c34685fec96796c2607b Mon Sep 17 00:00:00 2001 From: Annie Smith Date: Mon, 17 Jul 2023 07:48:48 -0400 Subject: [PATCH 17/21] initial changes for file creation --- src/api/cpp/GravityNode.cpp | 30 +++++++++++-------- src/api/cpp/GravityNode.h | 7 ++--- src/api/cpp/GravitySpdLogConfigSubscriber.cpp | 28 ++++++++++++++++- src/api/cpp/GravitySpdLogConfigSubscriber.h | 3 +- .../SpdlogConfigurationPublisherTest.cpp | 4 +-- 5 files changed, 51 insertions(+), 21 deletions(-) diff --git a/src/api/cpp/GravityNode.cpp b/src/api/cpp/GravityNode.cpp index 7251fd83c..35eb11d10 100755 --- a/src/api/cpp/GravityNode.cpp +++ b/src/api/cpp/GravityNode.cpp @@ -25,6 +25,7 @@ #include #include +#include #include #include #ifdef WIN32 @@ -594,7 +595,6 @@ void GravityNode::configSpdLoggers() console_proxy_for_app->set_level(app_console_level); app_sink_list.push_back(console_proxy_for_app); - string filename = getStringParam("LogDirectory", ".") + file_separator + componentID + ".log"; auto sharedFileSink = std::make_shared(filename); @@ -638,6 +638,7 @@ void GravityNode::configSpdLoggers() // Set the ApplicationLogger as the default spdlog::set_default_logger(app_logger); + std::cout<< " DONE SETTING LOGGERS \n"; } GravityReturnCode GravityNode::init() @@ -1000,6 +1001,17 @@ GravityReturnCode GravityNode::init(std::string componentID) logger->warn("Gravity.ini specifies both Domain and URL. Using URL."); } + std::cout<<"About to configure subscriber for " << componentID; + if(componentID != "ServiceDirectory") + { + // Register subscriber to allow for dynamic logging changes + GravityReturnCode ret = registerSpdlogDynamicConfiguration(); + if (ret!=GravityReturnCodes::SUCCESS) + { + logger->error(" {}'s Dynamic SpdLog Subscriber not registered ( code: {})", componentID, ret); + } + } + initLock.Unlock(); return ret; @@ -1593,7 +1605,6 @@ GravityReturnCode GravityNode::ServiceDirectoryDataProductLookup(std::string dat // Send request to service directory GravityReturnCode ret = sendRequestToServiceDirectory(request, response); - if (ret == GravityReturnCodes::SUCCESS) { ComponentDataLookupResponsePB pb; @@ -1669,7 +1680,7 @@ GravityReturnCode GravityNode::subscribeInternal(string dataProductID, const Gra GravityReturnCode ret; ret = ServiceDirectoryDataProductLookup(dataProductID, publisherInfoPBs, domain); - if(ret != GravityReturnCodes::SUCCESS) { + if(ret != GravityReturnCodes::SUCCESS) { return ret; } @@ -2495,18 +2506,13 @@ GravityReturnCode GravityNode::unregisterHeartbeatListener(string componentID, s return GravityReturnCodes::SUCCESS; } -GravityReturnCode GravityNode::registerSpdlogConfiguration() +GravityReturnCode GravityNode::registerSpdlogDynamicConfiguration() { // Set up the subscriber for any reconfiguration messages const std::string dataProductID = "GravitySpdLogConfig"; - spdLogConfigSub.init(componentID); - GravityReturnCode ret = GravityReturnCodes::SUCCESS; - ret = this->subscribe(dataProductID, spdLogConfigSub); - if (ret!=GravityReturnCodes::SUCCESS) - { - spdlog::error("Unsuccessfully registered data product {}", ret); - } - return ret; + spdLogConfigSub.init(componentID, getStringParam("LogDirectory", ".") + file_separator + componentID + ".log"); + sleep(700); // wait to see if domain changing + return this->subscribe(dataProductID, spdLogConfigSub); } GravityReturnCode GravityNode::registerRelay(string dataProductID, const GravitySubscriber& subscriber, bool localOnly, GravityTransportType transportType) diff --git a/src/api/cpp/GravityNode.h b/src/api/cpp/GravityNode.h index 45cb11016..f72c87753 100755 --- a/src/api/cpp/GravityNode.h +++ b/src/api/cpp/GravityNode.h @@ -504,12 +504,11 @@ class GravityNode GRAVITY_API GravityReturnCode unregisterHeartbeatListener(std::string componentID, std::string domain = ""); - /** - * Sets up the ability to reconfigure spdlog levels - * potentially add in params?? + /** + * Unregisters a callback for when we get a heartbeat from another component. * \return success flag */ - GRAVITY_API GravityReturnCode registerSpdlogConfiguration(); + GRAVITY_API GravityReturnCode registerSpdlogDynamicConfiguration(); /** * Register a Relay that will act as a pass-through for the given dataProductID. It will be a publisher and subscriber diff --git a/src/api/cpp/GravitySpdLogConfigSubscriber.cpp b/src/api/cpp/GravitySpdLogConfigSubscriber.cpp index e3b3330bd..e14693832 100644 --- a/src/api/cpp/GravitySpdLogConfigSubscriber.cpp +++ b/src/api/cpp/GravitySpdLogConfigSubscriber.cpp @@ -1,5 +1,6 @@ #include #include +#include #include "GravitySpdLogConfigSubscriber.h" #include "spdlog/spdlog.h" #include "protobuf/GravitySpdLogConfigPB.pb.h" @@ -7,9 +8,10 @@ namespace gravity { SpdLogConfigSubscriber::SpdLogConfigSubscriber(){} - void SpdLogConfigSubscriber::init(std::string compID) + void SpdLogConfigSubscriber::init(std::string compID,std::string fname) { componentID = compID; + filename = fname; } void SpdLogConfigSubscriber::subscriptionFilled(const std::vector< std::shared_ptr >& dataProducts) { @@ -23,6 +25,27 @@ namespace gravity { } } +/* + void checkFile(GravitySpdLogConfigPB_LoggerType lt,GravitySpdLogConfigPB_LoggerLevel ll,std::string filename) + { + bool fileLogger = (lt == GravitySpdLogConfigPB_LoggerType_GravityFileLogger) + || (lt == GravitySpdLogConfigPB_LoggerType_ApplicationFileLogger); + bool levelOff = ll == GravitySpdLogConfigPB_LoggerLevel_off; + if(fileLogger && !levelOff) + { + FILE *pfile = fopen(filename.c_str(),"a"); + if (pfile==NULL) + { + spdlog::error("Could not open/create file"); + } + else + { + fclose(pfile); + } + } + } +*/ + // Determines if correct ID and reconfigures accordingly void SpdLogConfigSubscriber::reconfigSpdLoggers(GravitySpdLogConfigPB spdLogConfigPB) { @@ -32,6 +55,9 @@ namespace gravity { return; } + // Create a file if necessary + //checkFile(spdLogConfigPB.logger_id(),spdLogConfigPB.logger_level(), filename); + if (spdLogConfigPB.logger_id() == GravitySpdLogConfigPB_LoggerType_GravityConsoleLogger || spdLogConfigPB.logger_id() == GravitySpdLogConfigPB_LoggerType_GravityFileLogger) { auto log = spdlog::get("GravityLogger"); diff --git a/src/api/cpp/GravitySpdLogConfigSubscriber.h b/src/api/cpp/GravitySpdLogConfigSubscriber.h index 854602d6d..4b99f853d 100644 --- a/src/api/cpp/GravitySpdLogConfigSubscriber.h +++ b/src/api/cpp/GravitySpdLogConfigSubscriber.h @@ -9,10 +9,11 @@ namespace gravity { { private: std::string componentID; + std::string filename; void reconfigSpdLoggers(GravitySpdLogConfigPB spdLogConfigPB); public: SpdLogConfigSubscriber(); - void init(std::string compID); + void init(std::string compID,std::string fname); void subscriptionFilled(const std::vector< std::shared_ptr >& dataProducts); }; diff --git a/test/examples/15-SpdlogDynamicConfiguration/SpdlogConfigurationPublisherTest.cpp b/test/examples/15-SpdlogDynamicConfiguration/SpdlogConfigurationPublisherTest.cpp index e762ac5c2..e861111c4 100644 --- a/test/examples/15-SpdlogDynamicConfiguration/SpdlogConfigurationPublisherTest.cpp +++ b/test/examples/15-SpdlogDynamicConfiguration/SpdlogConfigurationPublisherTest.cpp @@ -74,9 +74,7 @@ int main() exit(1); } - // Register the subscriber for spdlog regconfiguration // Set up a subscriber to the Application Publisher Logger - gn.registerSpdlogConfiguration(); SimpleSubscriber simpleSubscriber; gn.subscribe(gravity::constants::GRAVITY_LOGGER_DPID, simpleSubscriber); @@ -84,7 +82,7 @@ int main() // Change SimpleGravityComponentID1's File to trace level // for gravity and trace level for the console - sendConfigMessage(gn, dataProductID,"SimpleGravityComponentID1", GravitySpdLogConfigPB_LoggerType_GravityFileLogger, GravitySpdLogConfigPB_LoggerLevel_trace); + sendConfigMessage(gn, dataProductID,"", GravitySpdLogConfigPB_LoggerType_GravityFileLogger, GravitySpdLogConfigPB_LoggerLevel_trace); sendConfigMessage(gn, dataProductID,"SimpleGravityComponentID1", GravitySpdLogConfigPB_LoggerType_GravityConsoleLogger, GravitySpdLogConfigPB_LoggerLevel_trace); logAllAppLevels(); // nothing prints From a6dbed7ec61bea1cf481e81962ba27d07fe6729c Mon Sep 17 00:00:00 2001 From: Annie Smith Date: Mon, 17 Jul 2023 15:30:32 -0400 Subject: [PATCH 18/21] changes to clean up example --- src/api/cpp/CommUtil.h | 1 + src/api/cpp/GravityNode.cpp | 7 +- src/api/cpp/GravitySpdLogConfigSubscriber.cpp | 26 +--- src/api/cpp/GravitySpdLogConfigSubscriber.h | 2 +- .../15-SpdlogDynamicConfiguration/Makefile.in | 8 +- .../SpdlogConfigurationPublisherTest.cpp | 140 ------------------ .../SpdlogDynamicConfiguration.cpp | 139 +++++++++++++++++ .../15-SpdlogDynamicConfiguration/run.sh.in | 4 +- 8 files changed, 152 insertions(+), 175 deletions(-) delete mode 100644 test/examples/15-SpdlogDynamicConfiguration/SpdlogConfigurationPublisherTest.cpp create mode 100644 test/examples/15-SpdlogDynamicConfiguration/SpdlogDynamicConfiguration.cpp diff --git a/src/api/cpp/CommUtil.h b/src/api/cpp/CommUtil.h index 2c80b79b8..9296284aa 100755 --- a/src/api/cpp/CommUtil.h +++ b/src/api/cpp/CommUtil.h @@ -60,6 +60,7 @@ namespace gravity const std::string METRICS_DATA_DPID = "GravityMetricsData"; const std::string GRAVITY_SETTINGS_DPID = "GRAVITY_SETTINGS"; const std::string GRAVITY_LOGGER_DPID = "GRAVITY_LOGGER"; + const std::string SPD_LOG_CONFIG_DPID = "GravitySpdLogConfig"; } /** diff --git a/src/api/cpp/GravityNode.cpp b/src/api/cpp/GravityNode.cpp index 35eb11d10..470607344 100755 --- a/src/api/cpp/GravityNode.cpp +++ b/src/api/cpp/GravityNode.cpp @@ -638,7 +638,6 @@ void GravityNode::configSpdLoggers() // Set the ApplicationLogger as the default spdlog::set_default_logger(app_logger); - std::cout<< " DONE SETTING LOGGERS \n"; } GravityReturnCode GravityNode::init() @@ -1001,7 +1000,6 @@ GravityReturnCode GravityNode::init(std::string componentID) logger->warn("Gravity.ini specifies both Domain and URL. Using URL."); } - std::cout<<"About to configure subscriber for " << componentID; if(componentID != "ServiceDirectory") { // Register subscriber to allow for dynamic logging changes @@ -2509,10 +2507,9 @@ GravityReturnCode GravityNode::unregisterHeartbeatListener(string componentID, s GravityReturnCode GravityNode::registerSpdlogDynamicConfiguration() { // Set up the subscriber for any reconfiguration messages - const std::string dataProductID = "GravitySpdLogConfig"; - spdLogConfigSub.init(componentID, getStringParam("LogDirectory", ".") + file_separator + componentID + ".log"); + spdLogConfigSub.init(componentID); sleep(700); // wait to see if domain changing - return this->subscribe(dataProductID, spdLogConfigSub); + return this->subscribe(gravity::constants::SPD_LOG_CONFIG_DPID, spdLogConfigSub); } GravityReturnCode GravityNode::registerRelay(string dataProductID, const GravitySubscriber& subscriber, bool localOnly, GravityTransportType transportType) diff --git a/src/api/cpp/GravitySpdLogConfigSubscriber.cpp b/src/api/cpp/GravitySpdLogConfigSubscriber.cpp index e14693832..ad5d37e8b 100644 --- a/src/api/cpp/GravitySpdLogConfigSubscriber.cpp +++ b/src/api/cpp/GravitySpdLogConfigSubscriber.cpp @@ -8,11 +8,12 @@ namespace gravity { SpdLogConfigSubscriber::SpdLogConfigSubscriber(){} - void SpdLogConfigSubscriber::init(std::string compID,std::string fname) + + void SpdLogConfigSubscriber::init(std::string compID) { componentID = compID; - filename = fname; } + void SpdLogConfigSubscriber::subscriptionFilled(const std::vector< std::shared_ptr >& dataProducts) { for(std::vector< std::shared_ptr >::const_iterator i = dataProducts.begin(); i != dataProducts.end(); i++) @@ -25,27 +26,6 @@ namespace gravity { } } -/* - void checkFile(GravitySpdLogConfigPB_LoggerType lt,GravitySpdLogConfigPB_LoggerLevel ll,std::string filename) - { - bool fileLogger = (lt == GravitySpdLogConfigPB_LoggerType_GravityFileLogger) - || (lt == GravitySpdLogConfigPB_LoggerType_ApplicationFileLogger); - bool levelOff = ll == GravitySpdLogConfigPB_LoggerLevel_off; - if(fileLogger && !levelOff) - { - FILE *pfile = fopen(filename.c_str(),"a"); - if (pfile==NULL) - { - spdlog::error("Could not open/create file"); - } - else - { - fclose(pfile); - } - } - } -*/ - // Determines if correct ID and reconfigures accordingly void SpdLogConfigSubscriber::reconfigSpdLoggers(GravitySpdLogConfigPB spdLogConfigPB) { diff --git a/src/api/cpp/GravitySpdLogConfigSubscriber.h b/src/api/cpp/GravitySpdLogConfigSubscriber.h index 4b99f853d..d114ece1e 100644 --- a/src/api/cpp/GravitySpdLogConfigSubscriber.h +++ b/src/api/cpp/GravitySpdLogConfigSubscriber.h @@ -13,7 +13,7 @@ namespace gravity { void reconfigSpdLoggers(GravitySpdLogConfigPB spdLogConfigPB); public: SpdLogConfigSubscriber(); - void init(std::string compID,std::string fname); + void init(std::string compID); void subscriptionFilled(const std::vector< std::shared_ptr >& dataProducts); }; diff --git a/test/examples/15-SpdlogDynamicConfiguration/Makefile.in b/test/examples/15-SpdlogDynamicConfiguration/Makefile.in index 6ced12d92..aad42f40f 100644 --- a/test/examples/15-SpdlogDynamicConfiguration/Makefile.in +++ b/test/examples/15-SpdlogDynamicConfiguration/Makefile.in @@ -78,10 +78,10 @@ INCLUDES=-I$(GRAVLIB_DIR) $(AC_CPPFLAGS) CFLAGS=-std=c++11 -L$(GRAVLIB_DIR) -L../../../src/keyvalue_parser/ $(AC_LDFLAGS) $(AC_CFLAGS) LIBS=-lgravity -lkeyvalue_parser -lprotobuf $(OS_SPECIFIC_LIBS) -all: SpdlogConfigurationPublisherTest$(OS_EXE_EXT) +all: SpdlogDynamicConfiguration$(OS_EXE_EXT) #Compile each cpp file to a separate executable. -SpdlogConfigurationPublisherTest$(OS_EXE_EXT):SpdlogConfigurationPublisherTest.cpp +SpdlogDynamicConfiguration$(OS_EXE_EXT):SpdlogDynamicConfiguration.cpp $(CC) -o $@ $< $(INCLUDES) $(CFLAGS) $(LIBS) components: ServiceDirectory$(OS_EXE_EXT) @@ -91,7 +91,7 @@ ServiceDirectory$(OS_EXE_EXT): make clean: - @rm -rf *.o *.exe SpdlogConfigurationPublisherTest + @rm -rf *.o *.exe SpdlogDynamicConfiguration -run: components SpdlogConfigurationPublisherTest$(OS_EXE_EXT) +run: components SpdlogDynamicConfiguration$(OS_EXE_EXT) ./run.sh \ No newline at end of file diff --git a/test/examples/15-SpdlogDynamicConfiguration/SpdlogConfigurationPublisherTest.cpp b/test/examples/15-SpdlogDynamicConfiguration/SpdlogConfigurationPublisherTest.cpp deleted file mode 100644 index e861111c4..000000000 --- a/test/examples/15-SpdlogDynamicConfiguration/SpdlogConfigurationPublisherTest.cpp +++ /dev/null @@ -1,140 +0,0 @@ -#include -#include -#include -#include "protobuf/GravitySpdLogConfigPB.pb.h" -#include "protobuf/GravityLogMessagePB.pb.h" - -using namespace std; -using namespace gravity; - -#ifdef WIN32 -#include -#define sleep Sleep -#else -#include -#endif - -class SimpleSubscriber : public GravitySubscriber { -public: - virtual void subscriptionFilled(const std::vector< std::shared_ptr >& dataProducts); -}; - -void logAllAppLevels() -{ - // Wait to ensure it has been sent and received - sleep(3000); - spdlog::trace("App"); - spdlog::debug("App"); - spdlog::info("App"); - spdlog::warn("App"); - spdlog::error("App"); - spdlog::critical("App"); -} - -void sendConfigMessage(GravityNode &gn,std::string dataProductID,std::string compID, GravitySpdLogConfigPB_LoggerType lt, GravitySpdLogConfigPB_LoggerLevel ll) -{ - //Create a data product to send across the network - GravityDataProduct gravityConfigDP(dataProductID); - - //Initialize our message - GravitySpdLogConfigPB spdLogConfigPB; - if(compID != "") - { - spdLogConfigPB.set_component_id(compID); - } - - spdLogConfigPB.set_logger_id(lt); - spdLogConfigPB.set_logger_level(ll); - gravityConfigDP.setData(spdLogConfigPB); - - //Publish the data product. - if (gn.publish(gravityConfigDP) != GravityReturnCodes::SUCCESS) - { - spdlog::error("Could not publish data product with id {}", dataProductID); - - } -} - -int main() -{ - GravityNode gn; - - //Initialize gravity, giving this node a componentID. - if (gn.init("SimpleGravityComponentID1") != GravityReturnCodes::SUCCESS) - { - spdlog::critical("Could not initialize GravityNode"); - exit(1); - } - - //Register a data product - const std::string dataProductID = "GravitySpdLogConfig"; - if (gn.registerDataProduct(dataProductID, GravityTransportTypes::TCP) != GravityReturnCodes::SUCCESS) - { - spdlog::critical("Could not register data product with id {}", dataProductID); - exit(1); - } - - // Set up a subscriber to the Application Publisher Logger - SimpleSubscriber simpleSubscriber; - gn.subscribe(gravity::constants::GRAVITY_LOGGER_DPID, simpleSubscriber); - - std::cout<<"Begin testing GravityLogger\n"; - - // Change SimpleGravityComponentID1's File to trace level - // for gravity and trace level for the console - sendConfigMessage(gn, dataProductID,"", GravitySpdLogConfigPB_LoggerType_GravityFileLogger, GravitySpdLogConfigPB_LoggerLevel_trace); - sendConfigMessage(gn, dataProductID,"SimpleGravityComponentID1", GravitySpdLogConfigPB_LoggerType_GravityConsoleLogger, GravitySpdLogConfigPB_LoggerLevel_trace); - - logAllAppLevels(); // nothing prints - - // Turns off file and console for GravityLogger - // for SimpleGravityComponentID1 and ServiceDirectory - sendConfigMessage(gn, dataProductID,"SimpleGravityComponentID1", GravitySpdLogConfigPB_LoggerType_GravityConsoleLogger, GravitySpdLogConfigPB_LoggerLevel_off); - sendConfigMessage(gn, dataProductID,"", GravitySpdLogConfigPB_LoggerType_GravityFileLogger, GravitySpdLogConfigPB_LoggerLevel_off); - - std::cout<<"End testing GravityLogger\n"; - - // Nothing changes as NotARealID does not work - sendConfigMessage(gn, dataProductID, "NotARealID", GravitySpdLogConfigPB_LoggerType_ApplicationFileLogger, GravitySpdLogConfigPB_LoggerLevel_error); - logAllAppLevels(); - - - std::cout<<"Begin testing ApplicationLogger\n"; - - // Change SimpleGravityComponentID1's network to critical level - // for ApplicationLogger and any subscribed components' console to info level - // and file to warn level - sendConfigMessage(gn, dataProductID, "SimpleGravityComponentID1", GravitySpdLogConfigPB_LoggerType_ApplicationNetworkLogger, GravitySpdLogConfigPB_LoggerLevel_critical); - sendConfigMessage(gn, dataProductID, "", GravitySpdLogConfigPB_LoggerType_ApplicationConsoleLogger, GravitySpdLogConfigPB_LoggerLevel_info); - sendConfigMessage(gn, dataProductID, "", GravitySpdLogConfigPB_LoggerType_ApplicationFileLogger, GravitySpdLogConfigPB_LoggerLevel_warn); - logAllAppLevels(); - - // Change all logger's changed back to off - sendConfigMessage(gn, dataProductID, "SimpleGravityComponentID1", GravitySpdLogConfigPB_LoggerType_ApplicationNetworkLogger, GravitySpdLogConfigPB_LoggerLevel_off); - sendConfigMessage(gn, dataProductID, "", GravitySpdLogConfigPB_LoggerType_ApplicationConsoleLogger, GravitySpdLogConfigPB_LoggerLevel_off); - sendConfigMessage(gn, dataProductID, "", GravitySpdLogConfigPB_LoggerType_ApplicationFileLogger, GravitySpdLogConfigPB_LoggerLevel_off); - - logAllAppLevels(); - - std::cout<<"End testing ApplicationLogger\n"; - - gn.unsubscribe(gravity::constants::GRAVITY_LOGGER_DPID, simpleSubscriber); -} - -void SimpleSubscriber::subscriptionFilled(const std::vector< std::shared_ptr >& dataProducts) -{ - for(std::vector< std::shared_ptr >::const_iterator i = dataProducts.begin(); - i != dataProducts.end(); i++) - { - //Get the protobuf object from the message - GravityLogMessagePB logMessage; - (*i)->populateMessage(logMessage); - - std::string message = logMessage.message(); - // Use a substring to cut off the time and level info (metadata) included in log string - if(message.substr(message.length()-4,3) == "App" && logMessage.level() == "critical") - { - std::cout << "The correct level and message were published for Application Network Logger\n"; - } - } -} \ No newline at end of file diff --git a/test/examples/15-SpdlogDynamicConfiguration/SpdlogDynamicConfiguration.cpp b/test/examples/15-SpdlogDynamicConfiguration/SpdlogDynamicConfiguration.cpp new file mode 100644 index 000000000..a3bfc5ad5 --- /dev/null +++ b/test/examples/15-SpdlogDynamicConfiguration/SpdlogDynamicConfiguration.cpp @@ -0,0 +1,139 @@ +#include +#include +#include +#include "protobuf/GravitySpdLogConfigPB.pb.h" +#include "protobuf/GravityLogMessagePB.pb.h" + +using namespace std; +using namespace gravity; + +#ifdef WIN32 +#include +#define sleep Sleep +#else +#include +#endif + +class ApplicationLogSubscriber : public GravitySubscriber { +public: + virtual void subscriptionFilled(const std::vector< std::shared_ptr >& dataProducts); +}; + +void logAllAppLevels() +{ + // Wait to ensure it has been sent and received + sleep(2000); + spdlog::trace("App"); + spdlog::debug("App"); + spdlog::info("App"); + spdlog::warn("App"); + spdlog::error("App"); + spdlog::critical("App"); +} + +void sendConfigMessage(GravityNode &gn, std::string compID, GravitySpdLogConfigPB_LoggerType lt, GravitySpdLogConfigPB_LoggerLevel ll) +{ + //Create a data product to send across the network + GravityDataProduct gravityConfigDP(gravity::constants::SPD_LOG_CONFIG_DPID); + + //Initialize our message + GravitySpdLogConfigPB spdLogConfigPB; + if(compID != "") + { + spdLogConfigPB.set_component_id(compID); + } + + spdLogConfigPB.set_logger_id(lt); + spdLogConfigPB.set_logger_level(ll); + gravityConfigDP.setData(spdLogConfigPB); + + //Publish the data product. + if (gn.publish(gravityConfigDP) != GravityReturnCodes::SUCCESS) + { + spdlog::error("Could not publish data product with id {}", gravity::constants::SPD_LOG_CONFIG_DPID); + + } +} + +int main() +{ + GravityNode gn; + + //Initialize gravity, giving this node a componentID. + if (gn.init("SimpleGravityComponentID") != GravityReturnCodes::SUCCESS) + { + spdlog::critical("Could not initialize GravityNode"); + exit(1); + } + + //Register a data product + if (gn.registerDataProduct(gravity::constants::SPD_LOG_CONFIG_DPID, GravityTransportTypes::TCP) != GravityReturnCodes::SUCCESS) + { + spdlog::critical("Could not register data product with id {}", gravity::constants::SPD_LOG_CONFIG_DPID); + exit(1); + } + + // Set up a subscriber to the Application Publisher Logger + ApplicationLogSubscriber simpleSubscriber; + gn.subscribe(gravity::constants::GRAVITY_LOGGER_DPID, simpleSubscriber); + + std::cout<<"Begin testing GravityLogger\n"; + + // Change SimpleGravityComponentID's File to trace level + // for gravity and trace level for the console + sendConfigMessage(gn,"", GravitySpdLogConfigPB_LoggerType_GravityFileLogger, GravitySpdLogConfigPB_LoggerLevel_trace); + sendConfigMessage(gn,"SimpleGravityComponentID", GravitySpdLogConfigPB_LoggerType_GravityConsoleLogger, GravitySpdLogConfigPB_LoggerLevel_trace); + + logAllAppLevels(); // nothing prints + + // Turns off file and console for GravityLogger + // for SimpleGravityComponentID and ServiceDirectory + sendConfigMessage(gn, "SimpleGravityComponentID", GravitySpdLogConfigPB_LoggerType_GravityConsoleLogger, GravitySpdLogConfigPB_LoggerLevel_off); + sendConfigMessage(gn, "", GravitySpdLogConfigPB_LoggerType_GravityFileLogger, GravitySpdLogConfigPB_LoggerLevel_off); + + std::cout << "End testing GravityLogger\n"; + + // Nothing changes as NotARealID does not work + sendConfigMessage(gn, "NotARealID", GravitySpdLogConfigPB_LoggerType_ApplicationFileLogger, GravitySpdLogConfigPB_LoggerLevel_error); + logAllAppLevels(); + + + std::cout << "Begin testing ApplicationLogger\n"; + + // Change SimpleGravityComponentID's network to critical level + // for ApplicationLogger and any subscribed components' console to info level + // and file to warn level + sendConfigMessage(gn, "SimpleGravityComponentID", GravitySpdLogConfigPB_LoggerType_ApplicationNetworkLogger, GravitySpdLogConfigPB_LoggerLevel_critical); + sendConfigMessage(gn, "", GravitySpdLogConfigPB_LoggerType_ApplicationConsoleLogger, GravitySpdLogConfigPB_LoggerLevel_info); + sendConfigMessage(gn, "", GravitySpdLogConfigPB_LoggerType_ApplicationFileLogger, GravitySpdLogConfigPB_LoggerLevel_warn); + logAllAppLevels(); + + // Change all logger's changed back to off + sendConfigMessage(gn, "SimpleGravityComponentID1", GravitySpdLogConfigPB_LoggerType_ApplicationNetworkLogger, GravitySpdLogConfigPB_LoggerLevel_off); + sendConfigMessage(gn, "", GravitySpdLogConfigPB_LoggerType_ApplicationConsoleLogger, GravitySpdLogConfigPB_LoggerLevel_off); + sendConfigMessage(gn, "", GravitySpdLogConfigPB_LoggerType_ApplicationFileLogger, GravitySpdLogConfigPB_LoggerLevel_off); + + logAllAppLevels(); + + std::cout<<"End testing ApplicationLogger\n"; + + gn.unsubscribe(gravity::constants::GRAVITY_LOGGER_DPID, simpleSubscriber); +} + +void ApplicationLogSubscriber::subscriptionFilled(const std::vector< std::shared_ptr >& dataProducts) +{ + for(std::vector< std::shared_ptr >::const_iterator i = dataProducts.begin(); + i != dataProducts.end(); i++) + { + //Get the protobuf object from the message + GravityLogMessagePB logMessage; + (*i)->populateMessage(logMessage); + + std::string message = logMessage.message(); + // Use a substring to cut off the time and level info (metadata) included in log string + if(message.substr(message.length()-4,3) == "App" && logMessage.level() == "critical") + { + std::cout << "The correct level and message were published for Application Network Logger\n"; + } + } +} \ No newline at end of file diff --git a/test/examples/15-SpdlogDynamicConfiguration/run.sh.in b/test/examples/15-SpdlogDynamicConfiguration/run.sh.in index 384d1bcd6..eae064be8 100644 --- a/test/examples/15-SpdlogDynamicConfiguration/run.sh.in +++ b/test/examples/15-SpdlogDynamicConfiguration/run.sh.in @@ -42,9 +42,9 @@ SDPID=$! # sleep for a second to give the service directory a chance to start up sleep 1 -./SpdlogConfigurationPublisherTest & +./SpdlogDynamicConfiguration & PUBID=$! -sleep 30 +sleep 25 cleanup \ No newline at end of file From be3ef769d76bd76efae664cd44d85d8569e6ec2f Mon Sep 17 00:00:00 2001 From: Annie Smith Date: Mon, 17 Jul 2023 15:43:09 -0400 Subject: [PATCH 19/21] fixed comments --- src/api/cpp/GravityNode.h | 2 +- src/api/cpp/GravitySpdLogConfigSubscriber.cpp | 4 ---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/src/api/cpp/GravityNode.h b/src/api/cpp/GravityNode.h index f72c87753..7712d41a7 100755 --- a/src/api/cpp/GravityNode.h +++ b/src/api/cpp/GravityNode.h @@ -505,7 +505,7 @@ class GravityNode /** - * Unregisters a callback for when we get a heartbeat from another component. + * Registers a subscriber to receuve messages about dynamic spdlog changes * \return success flag */ GRAVITY_API GravityReturnCode registerSpdlogDynamicConfiguration(); diff --git a/src/api/cpp/GravitySpdLogConfigSubscriber.cpp b/src/api/cpp/GravitySpdLogConfigSubscriber.cpp index ad5d37e8b..245f4b64c 100644 --- a/src/api/cpp/GravitySpdLogConfigSubscriber.cpp +++ b/src/api/cpp/GravitySpdLogConfigSubscriber.cpp @@ -34,10 +34,6 @@ namespace gravity { { return; } - - // Create a file if necessary - //checkFile(spdLogConfigPB.logger_id(),spdLogConfigPB.logger_level(), filename); - if (spdLogConfigPB.logger_id() == GravitySpdLogConfigPB_LoggerType_GravityConsoleLogger || spdLogConfigPB.logger_id() == GravitySpdLogConfigPB_LoggerType_GravityFileLogger) { auto log = spdlog::get("GravityLogger"); From a45e25124be07b7df3174af1cfb6a17c7ea1336d Mon Sep 17 00:00:00 2001 From: Annie Smith Date: Tue, 18 Jul 2023 09:46:22 -0400 Subject: [PATCH 20/21] fixed cmakelists.txt for updated name --- src/api/cpp/GravityNode.cpp | 8 ++++---- src/api/cpp/GravityNode.h | 2 +- .../examples/15-SpdlogDynamicConfiguration/CMakeLists.txt | 8 ++++---- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/api/cpp/GravityNode.cpp b/src/api/cpp/GravityNode.cpp index 470607344..aed8784f0 100755 --- a/src/api/cpp/GravityNode.cpp +++ b/src/api/cpp/GravityNode.cpp @@ -25,7 +25,6 @@ #include #include -#include #include #include #ifdef WIN32 @@ -597,7 +596,7 @@ void GravityNode::configSpdLoggers() string filename = getStringParam("LogDirectory", ".") + file_separator + componentID + ".log"; auto sharedFileSink = std::make_shared(filename); - + auto file_proxy_for_gravity = std::make_shared(); file_proxy_for_gravity->add_sink(sharedFileSink); file_proxy_for_gravity->set_level(gravity_file_level); @@ -1678,11 +1677,13 @@ GravityReturnCode GravityNode::subscribeInternal(string dataProductID, const Gra GravityReturnCode ret; ret = ServiceDirectoryDataProductLookup(dataProductID, publisherInfoPBs, domain); - if(ret != GravityReturnCodes::SUCCESS) { + if(ret != GravityReturnCodes::SUCCESS) + { return ret; } logger->trace("Subscribing to [{}] and receiving cached values: {}", dataProductID, receiveLastCachedValue); + vector registeredPublishersInfo; int tries = 5; while (registeredPublishersInfo.size() == 0 && tries-- > 0) @@ -2508,7 +2509,6 @@ GravityReturnCode GravityNode::registerSpdlogDynamicConfiguration() { // Set up the subscriber for any reconfiguration messages spdLogConfigSub.init(componentID); - sleep(700); // wait to see if domain changing return this->subscribe(gravity::constants::SPD_LOG_CONFIG_DPID, spdLogConfigSub); } diff --git a/src/api/cpp/GravityNode.h b/src/api/cpp/GravityNode.h index 7712d41a7..fdbb87792 100755 --- a/src/api/cpp/GravityNode.h +++ b/src/api/cpp/GravityNode.h @@ -505,7 +505,7 @@ class GravityNode /** - * Registers a subscriber to receuve messages about dynamic spdlog changes + * Registers a subscriber to receive messages about dynamic spdlog changes * \return success flag */ GRAVITY_API GravityReturnCode registerSpdlogDynamicConfiguration(); diff --git a/test/examples/15-SpdlogDynamicConfiguration/CMakeLists.txt b/test/examples/15-SpdlogDynamicConfiguration/CMakeLists.txt index 76bac35ef..1c154ae57 100644 --- a/test/examples/15-SpdlogDynamicConfiguration/CMakeLists.txt +++ b/test/examples/15-SpdlogDynamicConfiguration/CMakeLists.txt @@ -10,7 +10,7 @@ find_package(GravityKeyValueParser REQUIRED) find_package(Gravity REQUIRED) set(CMAKE_DEBUG_POSTFIX _d) -add_executable(SpdlogConfigurationPublisherTest SpdlogConfigurationPublisherTest.cpp) -set_target_properties(SpdlogConfigurationPublisherTest PROPERTIES DEBUG_POSTFIX ${CMAKE_DEBUG_POSTFIX}) -target_link_libraries(SpdlogConfigurationPublisherTest gravity) -install(TARGETS SpdlogConfigurationPublisherTest DESTINATION bin) \ No newline at end of file +add_executable(SpdlogDynamicConfiguration SpdlogDynamicConfiguration.cpp) +set_target_properties(SpdlogDynamicConfiguration PROPERTIES DEBUG_POSTFIX ${CMAKE_DEBUG_POSTFIX}) +target_link_libraries(SpdlogDynamicConfiguration gravity) +install(TARGETS SpdlogDynamicConfiguration DESTINATION bin) \ No newline at end of file From c1051f8f4e8b67ca058dc4d31b5f01f8e2840f48 Mon Sep 17 00:00:00 2001 From: Annie Smith Date: Tue, 18 Jul 2023 12:56:13 -0400 Subject: [PATCH 21/21] took filename out of header --- src/api/cpp/GravitySpdLogConfigSubscriber.h | 1 - 1 file changed, 1 deletion(-) diff --git a/src/api/cpp/GravitySpdLogConfigSubscriber.h b/src/api/cpp/GravitySpdLogConfigSubscriber.h index d114ece1e..854602d6d 100644 --- a/src/api/cpp/GravitySpdLogConfigSubscriber.h +++ b/src/api/cpp/GravitySpdLogConfigSubscriber.h @@ -9,7 +9,6 @@ namespace gravity { { private: std::string componentID; - std::string filename; void reconfigSpdLoggers(GravitySpdLogConfigPB spdLogConfigPB); public: SpdLogConfigSubscriber();