diff options
author | Bernard Normier <bernard@zeroc.com> | 2014-08-14 16:38:21 -0400 |
---|---|---|
committer | Bernard Normier <bernard@zeroc.com> | 2014-08-14 16:38:21 -0400 |
commit | 18748d529095d3ab86e3dc42abfd2b5f4946f9a7 (patch) | |
tree | 1f343c0790d98e7fbcff50ad94ea5c1e272b2d4f /cpp/src/Ice/Instance.cpp | |
parent | Fixed ice_invocationTimout usage in IceDiscovery hello demos (diff) | |
download | ice-18748d529095d3ab86e3dc42abfd2b5f4946f9a7.tar.bz2 ice-18748d529095d3ab86e3dc42abfd2b5f4946f9a7.tar.xz ice-18748d529095d3ab86e3dc42abfd2b5f4946f9a7.zip |
Initial merge for ICE-2400:
- added new Logger admin facet (C++ only)
- this Logger facet allows remote application to retrieve the Ice log file, including recently logged events, with optional filters
- this logger facet also allows remote applications to attach RemoteLogger objects to get new logs as they are generated
- added new "show log" feature to icegridadmin, to retrieve Ice log file of Ice server (not yet implemented for IceGrid registry and node)
Diffstat (limited to 'cpp/src/Ice/Instance.cpp')
-rw-r--r-- | cpp/src/Ice/Instance.cpp | 115 |
1 files changed, 75 insertions, 40 deletions
diff --git a/cpp/src/Ice/Instance.cpp b/cpp/src/Ice/Instance.cpp index 8bf1162ce8d..52c29e7d3b9 100644 --- a/cpp/src/Ice/Instance.cpp +++ b/cpp/src/Ice/Instance.cpp @@ -39,7 +39,7 @@ #include <Ice/MetricsAdminI.h> #include <Ice/InstrumentationI.h> #include <Ice/ProtocolInstance.h> - +#include <Ice/LoggerAdminI.h> #include <IceUtil/UUID.h> #include <IceUtil/Mutex.h> #include <IceUtil/MutexPtrLock.h> @@ -1207,44 +1207,6 @@ IceInternal::Instance::Instance(const CommunicatorPtr& communicator, const Initi _wstringConverter = new IceUtil::UnicodeWstringConverter(); } - // - // Add Process and Properties facets - // - - StringSeq facetSeq = _initData.properties->getPropertyAsList("Ice.Admin.Facets"); - - if(!facetSeq.empty()) - { - _adminFacetFilter.insert(facetSeq.begin(), facetSeq.end()); - } - - _adminFacets.insert(FacetMap::value_type("Process", new ProcessI(communicator))); - - PropertiesAdminIPtr props = new PropertiesAdminI("Properties", _initData.properties, _initData.logger); - _adminFacets.insert(FacetMap::value_type("Properties",props)); - - _metricsAdmin = new MetricsAdminI(_initData.properties, _initData.logger); - _adminFacets.insert(FacetMap::value_type("Metrics", _metricsAdmin)); - - // - // Setup the communicator observer only if the user didn't already set an - // Ice observer resolver and if the admininistrative endpoints are set. - // - if((_adminFacetFilter.empty() || _adminFacetFilter.find("Metrics") != _adminFacetFilter.end()) && - _initData.properties->getProperty("Ice.Admin.Endpoints") != "") - { - _observer = new CommunicatorObserverI(_metricsAdmin, _initData.observer); - - // - // Make sure the admin plugin receives property updates. - // - props->addUpdateCallback(_metricsAdmin); - } - else - { - _observer = _initData.observer; - } - __setNoDelete(false); } catch(...) @@ -1303,7 +1265,7 @@ IceInternal::Instance::~Instance() } void -IceInternal::Instance::finishSetup(int& argc, char* argv[]) +IceInternal::Instance::finishSetup(int& argc, char* argv[], const Ice::CommunicatorPtr& communicator) { // // Load plug-ins. @@ -1314,6 +1276,70 @@ IceInternal::Instance::finishSetup(int& argc, char* argv[]) pluginManagerImpl->loadPlugins(argc, argv); // + // Add admin facets + // Note that any logger-dependent admin facet must be created after we load all plugins, + // since one of these plugins can be a Logger plugin that sets a new logger during loading + // + + StringSeq facetSeq = _initData.properties->getPropertyAsList("Ice.Admin.Facets"); + + if(!facetSeq.empty()) + { + _adminFacetFilter.insert(facetSeq.begin(), facetSeq.end()); + } + _adminFacets.insert(FacetMap::value_type("Process", new ProcessI(communicator))); + + string loggerFacetName = _initData.properties->getPropertyWithDefault("Ice.Admin.Logger", "Logger"); + + bool insertLoggerFacet = + (_adminFacetFilter.empty() || _adminFacetFilter.find(loggerFacetName) != _adminFacetFilter.end()) && + _initData.properties->getProperty("Ice.Admin.Endpoints") != ""; + + if(loggerFacetName != "Logger" || insertLoggerFacet) + { + // + // Set up a new Logger + // + Ice::LoggerAdminLoggerPtr logger = createLoggerAdminLogger(loggerFacetName, + _initData.properties, + _initData.logger); + setLogger(logger); + + if(insertLoggerFacet) + { + logger->addAdminFacet(communicator); + } + // + // Else, this new logger & facet is useful for "slave" communicators like IceBox services. + // + } + + PropertiesAdminIPtr props = new PropertiesAdminI("Properties", _initData.properties, _initData.logger); + _adminFacets.insert(FacetMap::value_type("Properties", props)); + + _metricsAdmin = new MetricsAdminI(_initData.properties, _initData.logger); + _adminFacets.insert(FacetMap::value_type("Metrics", _metricsAdmin)); + + // + // Setup the communicator observer only if the user didn't already set an + // Ice observer resolver and if the admininistrative endpoints are set. + // + if((_adminFacetFilter.empty() || _adminFacetFilter.find("Metrics") != _adminFacetFilter.end()) && + _initData.properties->getProperty("Ice.Admin.Endpoints") != "") + { + _observer = new CommunicatorObserverI(_metricsAdmin, _initData.observer); + + // + // Make sure the admin plugin receives property updates. + // + props->addUpdateCallback(_metricsAdmin); + } + else + { + _observer = _initData.observer; + } + + // // Set observer updater // if(_observer) @@ -1491,6 +1517,15 @@ IceInternal::Instance::destroy() _observer->setObserverUpdater(0); // Break cyclic reference count. } } + + Ice::LoggerAdminLoggerPtr logger = Ice::LoggerAdminLoggerPtr::dynamicCast(_initData.logger); + if(logger) + { + // + // This only disables the remote logging; we don't set or reset _initData.logger + // + logger->destroy(); + } ThreadPoolPtr serverThreadPool; ThreadPoolPtr clientThreadPool; |