aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/libs/poco/Util/src/LoggingConfigurator.cpp
diff options
context:
space:
mode:
authorDevtools Arcadia <arcadia-devtools@yandex-team.ru>2022-02-07 18:08:42 +0300
committerDevtools Arcadia <arcadia-devtools@mous.vla.yp-c.yandex.net>2022-02-07 18:08:42 +0300
commit1110808a9d39d4b808aef724c861a2e1a38d2a69 (patch)
treee26c9fed0de5d9873cce7e00bc214573dc2195b7 /contrib/libs/poco/Util/src/LoggingConfigurator.cpp
downloadydb-1110808a9d39d4b808aef724c861a2e1a38d2a69.tar.gz
intermediate changes
ref:cde9a383711a11544ce7e107a78147fb96cc4029
Diffstat (limited to 'contrib/libs/poco/Util/src/LoggingConfigurator.cpp')
-rw-r--r--contrib/libs/poco/Util/src/LoggingConfigurator.cpp203
1 files changed, 203 insertions, 0 deletions
diff --git a/contrib/libs/poco/Util/src/LoggingConfigurator.cpp b/contrib/libs/poco/Util/src/LoggingConfigurator.cpp
new file mode 100644
index 0000000000..82b9d7d331
--- /dev/null
+++ b/contrib/libs/poco/Util/src/LoggingConfigurator.cpp
@@ -0,0 +1,203 @@
+//
+// LoggingConfigurator.cpp
+//
+// Library: Util
+// Package: Configuration
+// Module: LoggingConfigurator
+//
+// Copyright (c) 2004-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Util/LoggingConfigurator.h"
+#include "Poco/Util/AbstractConfiguration.h"
+#include "Poco/AutoPtr.h"
+#include "Poco/Channel.h"
+#include "Poco/FormattingChannel.h"
+#include "Poco/Formatter.h"
+#include "Poco/PatternFormatter.h"
+#include "Poco/Logger.h"
+#include "Poco/LoggingRegistry.h"
+#include "Poco/LoggingFactory.h"
+#include <map>
+
+
+using Poco::AutoPtr;
+using Poco::Formatter;
+using Poco::PatternFormatter;
+using Poco::Channel;
+using Poco::FormattingChannel;
+using Poco::Logger;
+using Poco::LoggingRegistry;
+using Poco::LoggingFactory;
+
+
+namespace Poco {
+namespace Util {
+
+
+LoggingConfigurator::LoggingConfigurator()
+{
+}
+
+
+LoggingConfigurator::~LoggingConfigurator()
+{
+}
+
+
+void LoggingConfigurator::configure(AbstractConfiguration* pConfig)
+{
+ poco_check_ptr (pConfig);
+
+ AutoPtr<AbstractConfiguration> pFormattersConfig(pConfig->createView("logging.formatters"));
+ configureFormatters(pFormattersConfig);
+
+ AutoPtr<AbstractConfiguration> pChannelsConfig(pConfig->createView("logging.channels"));
+ configureChannels(pChannelsConfig);
+
+ AutoPtr<AbstractConfiguration> pLoggersConfig(pConfig->createView("logging.loggers"));
+ configureLoggers(pLoggersConfig);
+}
+
+
+void LoggingConfigurator::configureFormatters(AbstractConfiguration* pConfig)
+{
+ AbstractConfiguration::Keys formatters;
+ pConfig->keys(formatters);
+ for (AbstractConfiguration::Keys::const_iterator it = formatters.begin(); it != formatters.end(); ++it)
+ {
+ AutoPtr<AbstractConfiguration> pFormatterConfig(pConfig->createView(*it));
+ AutoPtr<Formatter> pFormatter(createFormatter(pFormatterConfig));
+ LoggingRegistry::defaultRegistry().registerFormatter(*it, pFormatter);
+ }
+}
+
+
+void LoggingConfigurator::configureChannels(AbstractConfiguration* pConfig)
+{
+ AbstractConfiguration::Keys channels;
+ pConfig->keys(channels);
+ for (AbstractConfiguration::Keys::const_iterator it = channels.begin(); it != channels.end(); ++it)
+ {
+ AutoPtr<AbstractConfiguration> pChannelConfig(pConfig->createView(*it));
+ AutoPtr<Channel> pChannel = createChannel(pChannelConfig);
+ LoggingRegistry::defaultRegistry().registerChannel(*it, pChannel);
+ }
+ for (AbstractConfiguration::Keys::const_iterator it = channels.begin(); it != channels.end(); ++it)
+ {
+ AutoPtr<AbstractConfiguration> pChannelConfig(pConfig->createView(*it));
+ Channel* pChannel = LoggingRegistry::defaultRegistry().channelForName(*it);
+ configureChannel(pChannel, pChannelConfig);
+ }
+}
+
+
+void LoggingConfigurator::configureLoggers(AbstractConfiguration* pConfig)
+{
+ typedef std::map<std::string, AutoPtr<AbstractConfiguration> > LoggerMap;
+
+ AbstractConfiguration::Keys loggers;
+ pConfig->keys(loggers);
+ // use a map to sort loggers by their name, ensuring initialization in correct order (parents before children)
+ LoggerMap loggerMap;
+ for (AbstractConfiguration::Keys::const_iterator it = loggers.begin(); it != loggers.end(); ++it)
+ {
+ AutoPtr<AbstractConfiguration> pLoggerConfig(pConfig->createView(*it));
+ loggerMap[pLoggerConfig->getString("name", "")] = pLoggerConfig;
+ }
+ for (LoggerMap::iterator it = loggerMap.begin(); it != loggerMap.end(); ++it)
+ {
+ configureLogger(it->second);
+ }
+}
+
+
+Formatter* LoggingConfigurator::createFormatter(AbstractConfiguration* pConfig)
+{
+ AutoPtr<Formatter> pFormatter(LoggingFactory::defaultFactory().createFormatter(pConfig->getString("class")));
+ AbstractConfiguration::Keys props;
+ pConfig->keys(props);
+ for (AbstractConfiguration::Keys::const_iterator it = props.begin(); it != props.end(); ++it)
+ {
+ if (*it != "class")
+ pFormatter->setProperty(*it, pConfig->getString(*it));
+ }
+ return pFormatter.duplicate();
+}
+
+
+Channel* LoggingConfigurator::createChannel(AbstractConfiguration* pConfig)
+{
+ AutoPtr<Channel> pChannel(LoggingFactory::defaultFactory().createChannel(pConfig->getString("class")));
+ AutoPtr<Channel> pWrapper(pChannel);
+ AbstractConfiguration::Keys props;
+ pConfig->keys(props);
+ for (AbstractConfiguration::Keys::const_iterator it = props.begin(); it != props.end(); ++it)
+ {
+ if (*it == "pattern")
+ {
+ AutoPtr<Formatter> pPatternFormatter(new PatternFormatter(pConfig->getString(*it)));
+ pWrapper = new FormattingChannel(pPatternFormatter, pChannel);
+ }
+ else if (*it == "formatter")
+ {
+ AutoPtr<FormattingChannel> pFormattingChannel(new FormattingChannel(0, pChannel));
+ if (pConfig->hasProperty("formatter.class"))
+ {
+ AutoPtr<AbstractConfiguration> pFormatterConfig(pConfig->createView(*it));
+ AutoPtr<Formatter> pFormatter(createFormatter(pFormatterConfig));
+ pFormattingChannel->setFormatter(pFormatter);
+ }
+ else pFormattingChannel->setProperty(*it, pConfig->getString(*it));
+#if defined(__GNUC__) && __GNUC__ < 3
+ pWrapper = pFormattingChannel.duplicate();
+#else
+ pWrapper = pFormattingChannel;
+#endif
+ }
+ }
+ return pWrapper.duplicate();
+}
+
+
+void LoggingConfigurator::configureChannel(Channel* pChannel, AbstractConfiguration* pConfig)
+{
+ AbstractConfiguration::Keys props;
+ pConfig->keys(props);
+ for (AbstractConfiguration::Keys::const_iterator it = props.begin(); it != props.end(); ++it)
+ {
+ if (*it != "pattern" && *it != "formatter" && *it != "class")
+ {
+ pChannel->setProperty(*it, pConfig->getString(*it));
+ }
+ }
+}
+
+
+void LoggingConfigurator::configureLogger(AbstractConfiguration* pConfig)
+{
+ Logger& logger = Logger::get(pConfig->getString("name", ""));
+ AbstractConfiguration::Keys props;
+ pConfig->keys(props);
+ for (AbstractConfiguration::Keys::const_iterator it = props.begin(); it != props.end(); ++it)
+ {
+ if (*it == "channel" && pConfig->hasProperty("channel.class"))
+ {
+ AutoPtr<AbstractConfiguration> pChannelConfig(pConfig->createView(*it));
+ AutoPtr<Channel> pChannel(createChannel(pChannelConfig));
+ configureChannel(pChannel, pChannelConfig);
+ Logger::setChannel(logger.name(), pChannel);
+ }
+ else if (*it != "name")
+ {
+ Logger::setProperty(logger.name(), *it, pConfig->getString(*it));
+ }
+ }
+}
+
+
+} } // namespace Poco::Util