From b391792e011e82e3bfe32922f135b21e0cdaf101 Mon Sep 17 00:00:00 2001 From: Piotr Sikora Date: Fri, 7 Oct 2016 16:37:26 -0700 Subject: [PATCH 1/2] logging: update to work with spdlog 0.11.0 --- include/envoy/server/options.h | 4 +- source/common/common/assert.h | 5 +- source/common/mongo/proxy.cc | 2 +- source/exe/hot_restart.cc | 2 +- source/exe/main.cc | 2 +- source/precompiled/precompiled.h | 3 ++ .../config/network/http_connection_manager.cc | 6 +-- source/server/configuration_impl.cc | 18 +++---- source/server/drain_manager_impl.cc | 2 +- source/server/options_impl.cc | 22 +++++++-- source/server/options_impl.h | 4 +- source/server/server.cc | 47 ++++++++++--------- test/example_configs_test.cc | 2 +- test/integration/server.h | 2 +- test/main.cc | 2 +- test/mocks/server/mocks.h | 2 +- test/server/options_impl_test.cc | 6 +-- 17 files changed, 76 insertions(+), 55 deletions(-) diff --git a/include/envoy/server/options.h b/include/envoy/server/options.h index a429a0a19388b..8e0e378c5587c 100644 --- a/include/envoy/server/options.h +++ b/include/envoy/server/options.h @@ -30,9 +30,9 @@ class Options { virtual const std::string& configPath() PURE; /** - * @return uint64_t the default log level for the server. + * @return spdlog::level::level_enum the default log level for the server. */ - virtual uint64_t logLevel() PURE; + virtual spdlog::level::level_enum logLevel() PURE; /** * @return the restart epoch. 0 indicates the first server start, 1 the second, and so on. diff --git a/source/common/common/assert.h b/source/common/common/assert.h index 8bf6483ea6e2f..513feca7c2bf9 100644 --- a/source/common/common/assert.h +++ b/source/common/common/assert.h @@ -11,7 +11,7 @@ { \ if (!(X)) { \ Logger::Registry::getLog(Logger::Id::assert) \ - .emerg("assert failure: {}: {}:{}", #X, __FILE__, __LINE__); \ + .critical("assert failure: {}: {}:{}", #X, __FILE__, __LINE__); \ abort(); \ } \ } @@ -29,7 +29,8 @@ * Indicate a panic situation and exit. */ #define PANIC(X) \ - Logger::Registry::getLog(Logger::Id::assert).emerg("panic: {}: {}:{}", X, __FILE__, __LINE__); \ + Logger::Registry::getLog(Logger::Id::assert) \ + .critical("panic: {}: {}:{}", X, __FILE__, __LINE__); \ abort(); #define NOT_IMPLEMENTED PANIC("not implemented") diff --git a/source/common/mongo/proxy.cc b/source/common/mongo/proxy.cc index d2454dbf34b1d..c3b4f3e3a49dd 100644 --- a/source/common/mongo/proxy.cc +++ b/source/common/mongo/proxy.cc @@ -201,7 +201,7 @@ void ProxyFilter::doDecode(Buffer::Instance& buffer) { try { decoder_->onData(buffer); } catch (EnvoyException& e) { - log().notice("mongo decoding error: {}", e.what()); + log().info("mongo decoding error: {}", e.what()); stats_.decoding_error_.inc(); sniffing_ = false; } diff --git a/source/exe/hot_restart.cc b/source/exe/hot_restart.cc index d2ce6812985c2..2a37ca44f289b 100644 --- a/source/exe/hot_restart.cc +++ b/source/exe/hot_restart.cc @@ -318,7 +318,7 @@ void HotRestartImpl::onSocketEvent() { } case RpcMessageType::TerminateRequest: { - log().notice("shutting down due to child request"); + log().warn("shutting down due to child request"); kill(getpid(), SIGTERM); break; } diff --git a/source/exe/main.cc b/source/exe/main.cc index 318513b6eed46..ba40d0c4a8baf 100644 --- a/source/exe/main.cc +++ b/source/exe/main.cc @@ -27,7 +27,7 @@ class ProdComponentFactory : public ComponentFactory { int main(int argc, char** argv) { Event::Libevent::Global::initialize(); Ssl::OpenSsl::initialize(); - OptionsImpl options(argc, argv, Server::SharedMemory::version(), spdlog::level::notice); + OptionsImpl options(argc, argv, Server::SharedMemory::version(), spdlog::level::warn); std::unique_ptr restarter; try { diff --git a/source/precompiled/precompiled.h b/source/precompiled/precompiled.h index 3a4457f78482a..66059ea0668b8 100644 --- a/source/precompiled/precompiled.h +++ b/source/precompiled/precompiled.h @@ -18,4 +18,7 @@ #include #include +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wold-style-cast" #include +#pragma GCC diagnostic pop diff --git a/source/server/config/network/http_connection_manager.cc b/source/server/config/network/http_connection_manager.cc index 8dba73cc53334..feb6ec9547f8e 100644 --- a/source/server/config/network/http_connection_manager.cc +++ b/source/server/config/network/http_connection_manager.cc @@ -135,9 +135,9 @@ HttpConnectionManagerConfig::HttpConnectionManagerConfig(const Json::Object& con std::string string_name = filters[i].getString("name"); Json::Object config = filters[i].getObject("config"); - log().notice(" filter #{}", i); - log().notice(" type: {}", string_type); - log().notice(" name: {}", string_name); + log().info(" filter #{}", i); + log().info(" type: {}", string_type); + log().info(" name: {}", string_name); HttpFilterType type = stringToType(string_type); bool found_filter = false; diff --git a/source/server/configuration_impl.cc b/source/server/configuration_impl.cc index 87e035479451b..d043d1cc14292 100644 --- a/source/server/configuration_impl.cc +++ b/source/server/configuration_impl.cc @@ -25,9 +25,9 @@ void MainImpl::initialize(const std::string& file_path) { server_.options().serviceZone(), server_.getLocalAddress())); std::vector listeners = loader.getObjectArray("listeners"); - log().notice("loading {} listener(s)", listeners.size()); + log().info("loading {} listener(s)", listeners.size()); for (size_t i = 0; i < listeners.size(); i++) { - log().notice("listener #{}:", i); + log().info("listener #{}:", i); listeners_.emplace_back( Server::Configuration::ListenerPtr{new ListenerConfig(*this, listeners[i])}); } @@ -61,7 +61,7 @@ void MainImpl::initialize(const std::string& file_path) { } void MainImpl::initializeTracers(const Json::Object& tracing_configuration_) { - log().notice("loading tracing configuration"); + log().info("loading tracing configuration"); // Initialize http sinks if (tracing_configuration_.hasObject("http")) { @@ -71,11 +71,11 @@ void MainImpl::initializeTracers(const Json::Object& tracing_configuration_) { if (http_tracer_config.hasObject("sinks")) { std::vector sinks = http_tracer_config.getObjectArray("sinks"); - log().notice(fmt::format(" loading {} http sink(s):", sinks.size())); + log().info(fmt::format(" loading {} http sink(s):", sinks.size())); for (const Json::Object& sink : sinks) { std::string type = sink.getString("type"); - log().notice(fmt::format(" loading {}", type)); + log().info(fmt::format(" loading {}", type)); if (type == "lightstep") { ::Runtime::RandomGenerator& rand = server_.random(); @@ -105,7 +105,7 @@ const std::list& MainImpl::listeners() { ret MainImpl::ListenerConfig::ListenerConfig(MainImpl& parent, Json::Object& json) : parent_(parent), port_(json.getInteger("port")) { - log().notice(" port={}", port_); + log().info(" port={}", port_); if (json.hasObject("ssl_context")) { Ssl::ContextConfigImpl context_config(json.getObject("ssl_context")); @@ -122,9 +122,9 @@ MainImpl::ListenerConfig::ListenerConfig(MainImpl& parent, Json::Object& json) std::string string_type = filters[i].getString("type"); std::string string_name = filters[i].getString("name"); Json::Object config = filters[i].getObject("config"); - log().notice(" filter #{}:", i); - log().notice(" type: {}", string_type); - log().notice(" name: {}", string_name); + log().info(" filter #{}:", i); + log().info(" type: {}", string_type); + log().info(" name: {}", string_name); // Map filter type string to enum. NetworkFilterType type; diff --git a/source/server/drain_manager_impl.cc b/source/server/drain_manager_impl.cc index 97860b525ad30..7e2b42fa95502 100644 --- a/source/server/drain_manager_impl.cc +++ b/source/server/drain_manager_impl.cc @@ -49,7 +49,7 @@ void DrainManagerImpl::startParentShutdownSequence() { ASSERT(!parent_shutdown_timer_); parent_shutdown_timer_ = server_.dispatcher().createTimer([this]() -> void { // Shut down the parent now. It should have already been draining. - log().notice("shutting down parent after drain"); + log().warn("shutting down parent after drain"); server_.hotRestart().terminateParent(); }); diff --git a/source/server/options_impl.cc b/source/server/options_impl.cc index c755c469b51f3..b9712c5e51da6 100644 --- a/source/server/options_impl.cc +++ b/source/server/options_impl.cc @@ -1,11 +1,20 @@ #include "options_impl.h" +#include "common/common/macros.h" #include "common/common/version.h" #include "tclap/CmdLine.h" OptionsImpl::OptionsImpl(int argc, char** argv, const std::string& hot_restart_version, spdlog::level::level_enum default_log_level) { + std::string log_levels_string = "Log levels: "; + for (size_t i = 0; i < ARRAY_SIZE(spdlog::level::level_names); i++) { + log_levels_string += fmt::format("[{}]", spdlog::level::level_names[i]); + } + log_levels_string += + fmt::format("\nDefault is [{}]", spdlog::level::level_names[default_log_level]); + log_levels_string += "\n[trace] and [debug] are only available on debug builds"; + TCLAP::CmdLine cmd("envoy", ' ', VersionInfo::version()); TCLAP::ValueArg base_id( "", "base-id", "base ID so that multiple envoys can run on the same host if needed", false, 0, @@ -14,8 +23,9 @@ OptionsImpl::OptionsImpl(int argc, char** argv, const std::string& hot_restart_v std::thread::hardware_concurrency(), "uint32_t", cmd); TCLAP::ValueArg config_path("c", "config-path", "Path to configuration file", false, "", "string", cmd); - TCLAP::ValueArg log_level("l", "log-level", "Log level", false, default_log_level, - "uint64_t", cmd); + TCLAP::ValueArg log_level("l", "log-level", log_levels_string, false, + spdlog::level::level_names[default_log_level], "string", + cmd); TCLAP::ValueArg restart_epoch("", "restart-epoch", "hot restart epoch #", false, 0, "uint64_t", cmd); TCLAP::SwitchArg hot_restart_version_option("", "hot-restart-version", @@ -42,11 +52,17 @@ OptionsImpl::OptionsImpl(int argc, char** argv, const std::string& hot_restart_v exit(0); } + log_level_ = default_log_level; + for (size_t i = 0; i < ARRAY_SIZE(spdlog::level::level_names); i++) { + if (log_level.getValue() == spdlog::level::level_names[i]) { + log_level_ = static_cast(i); + } + } + // For base ID, scale what the user inputs by 10 so that we have spread for domain sockets. base_id_ = base_id.getValue() * 10; concurrency_ = concurrency.getValue(); config_path_ = config_path.getValue(); - log_level_ = log_level.getValue(); restart_epoch_ = restart_epoch.getValue(); service_cluster_ = service_cluster.getValue(); service_node_ = service_node.getValue(); diff --git a/source/server/options_impl.h b/source/server/options_impl.h index 4957668c8a43a..c509554ade1c5 100644 --- a/source/server/options_impl.h +++ b/source/server/options_impl.h @@ -14,7 +14,7 @@ class OptionsImpl : public Server::Options { uint64_t baseId() { return base_id_; } uint32_t concurrency() override { return concurrency_; } const std::string& configPath() override { return config_path_; } - uint64_t logLevel() override { return log_level_; } + spdlog::level::level_enum logLevel() override { return log_level_; } uint64_t restartEpoch() override { return restart_epoch_; } const std::string& serviceClusterName() override { return service_cluster_; } const std::string& serviceNodeName() override { return service_node_; } @@ -25,7 +25,7 @@ class OptionsImpl : public Server::Options { uint64_t base_id_; uint32_t concurrency_; std::string config_path_; - uint64_t log_level_; + spdlog::level::level_enum log_level_; uint64_t restart_epoch_; std::string service_cluster_; std::string service_node_; diff --git a/source/server/server.cc b/source/server/server.cc index b59c265284bda..bcda57fc9d353 100644 --- a/source/server/server.cc +++ b/source/server/server.cc @@ -49,7 +49,7 @@ InstanceImpl::InstanceImpl(Options& options, TestHooks& hooks, HotRestart& resta try { initialize(options, hooks, component_factory); } catch (const EnvoyException& e) { - log().emerg("error initializing configuration '{}': {}", options.configPath(), e.what()); + log().critical("error initializing configuration '{}': {}", options.configPath(), e.what()); exit(1); } } @@ -59,7 +59,7 @@ Upstream::ClusterManager& InstanceImpl::clusterManager() { return config_->clust Tracing::HttpTracer& InstanceImpl::httpTracer() { return config_->httpTracer(); } void InstanceImpl::drainListeners() { - log().notice("closing and draining listeners"); + log().warn("closing and draining listeners"); for (const auto& worker : workers_) { Worker& worker_ref = *worker; worker->dispatcher().post([&worker_ref]() -> void { worker_ref.handler()->closeListeners(); }); @@ -125,12 +125,12 @@ bool InstanceImpl::healthCheckFailed() { return server_stats_.live_.value() == 0 void InstanceImpl::initialize(Options& options, TestHooks& hooks, ComponentFactory& component_factory) { - log().notice("initializing epoch {} (hot restart version={})", options.restartEpoch(), - restarter_.version()); + log().warn("initializing epoch {} (hot restart version={})", options.restartEpoch(), + restarter_.version()); // Handle configuration that needs to take place prior to the main configuration load. Configuration::InitialImpl initial_config(options.configPath()); - log().notice("admin port: {}", initial_config.admin().port()); + log().info("admin port: {}", initial_config.admin().port()); HotRestart::ShutdownParentAdminInfo info; info.original_start_time_ = original_start_time_; @@ -182,25 +182,25 @@ void InstanceImpl::initialize(Options& options, TestHooks& hooks, // Setup signals. sigterm_ = handler_.dispatcher().listenForSignal(SIGTERM, [this]() -> void { - log().notice("caught SIGTERM"); + log().warn("caught SIGTERM"); restarter_.terminateParent(); handler_.dispatcher().exit(); }); sig_usr_1_ = handler_.dispatcher().listenForSignal(SIGUSR1, [this]() -> void { - log().notice("caught SIGUSR1"); + log().warn("caught SIGUSR1"); access_log_manager_.reopen(); }); sig_hup_ = handler_.dispatcher().listenForSignal(SIGHUP, [this]() -> void { - log().notice("caught and eating SIGHUP. See documentation for how to hot restart."); + log().warn("caught and eating SIGHUP. See documentation for how to hot restart."); }); // Register for cluster manager init notification. We don't start serving worker traffic until // upstream clusters are initialized which may involve running the event loop. Note however that // if there are only static clusters this will fire immediately. clusterManager().setInitializedCb([this, &hooks]() -> void { - log().notice("all clusters initialized. starting workers"); + log().warn("all clusters initialized. starting workers"); for (const WorkerPtr& worker : workers_) { try { worker->initializeConfiguration(*config_, socket_map_); @@ -209,7 +209,8 @@ void InstanceImpl::initialize(Options& options, TestHooks& hooks, // bind to it above. This happens when there is a race between two applications to listen // on the same port. In general if we can't initialize the worker configuration just print // the error and exit cleanly without crashing. - log().emerg("shutting down due to error initializing worker configuration: {}", e.what()); + log().critical("shutting down due to error initializing worker configuration: {}", + e.what()); shutdown(); } } @@ -231,12 +232,12 @@ void InstanceImpl::initialize(Options& options, TestHooks& hooks, Runtime::LoaderPtr InstanceUtil::createRuntime(Instance& server, Server::Configuration::Initial& config) { if (config.runtime()) { - log().notice("runtime symlink: {}", config.runtime()->symlinkRoot()); - log().notice("runtime subdirectory: {}", config.runtime()->subdirectory()); + log().info("runtime symlink: {}", config.runtime()->symlinkRoot()); + log().info("runtime subdirectory: {}", config.runtime()->subdirectory()); std::string override_subdirectory = config.runtime()->overrideSubdirectory() + "/" + server.options().serviceClusterName(); - log().notice("runtime override subdirectory: {}", override_subdirectory); + log().info("runtime override subdirectory: {}", override_subdirectory); return Runtime::LoaderPtr{new Runtime::LoaderImpl( server.dispatcher(), server.threadLocal(), config.runtime()->symlinkRoot(), @@ -248,13 +249,13 @@ Runtime::LoaderPtr InstanceUtil::createRuntime(Instance& server, void InstanceImpl::initializeStatSinks() { if (config_->statsdUdpPort().valid()) { - log().notice("statsd UDP port: {}", config_->statsdUdpPort().value()); + log().info("statsd UDP port: {}", config_->statsdUdpPort().value()); stat_sinks_.emplace_back(new Stats::Statsd::UdpStatsdSink(config_->statsdUdpPort().value())); stats_store_.addSink(*stat_sinks_.back()); } if (config_->statsdTcpClusterName().valid()) { - log().notice("statsd TCP cluster: {}", config_->statsdTcpClusterName().value()); + log().info("statsd TCP cluster: {}", config_->statsdTcpClusterName().value()); stat_sinks_.emplace_back(new Stats::Statsd::TcpStatsdSink( options_.serviceClusterName(), options_.serviceNodeName(), config_->statsdTcpClusterName().value(), thread_local_, config_->clusterManager())); @@ -267,9 +268,9 @@ void InstanceImpl::loadServerFlags(const Optional& flags_path) { return; } - log().notice("server flags path: {}", flags_path.value()); + log().info("server flags path: {}", flags_path.value()); if (handler_.api().fileExists(flags_path.value() + "/drain")) { - log().notice("starting server in drain mode"); + log().warn("starting server in drain mode"); failHealthcheck(true); } } @@ -287,10 +288,10 @@ uint64_t InstanceImpl::numConnections() { void InstanceImpl::run() { // Run the main dispatch loop waiting to exit. - log().notice("starting main dispatch loop"); + log().warn("starting main dispatch loop"); handler_.startWatchdog(); handler_.dispatcher().run(Event::Dispatcher::RunType::Block); - log().notice("main dispatch loop exited"); + log().warn("main dispatch loop exited"); // Shutdown all the listeners now that the main dispatch loop is done. for (const WorkerPtr& worker : workers_) { @@ -305,7 +306,7 @@ void InstanceImpl::run() { config_->clusterManager().shutdown(); handler_.closeConnections(); thread_local_.shutdownThread(); - log().notice("exiting"); + log().warn("exiting"); log().flush(); } @@ -314,17 +315,17 @@ Runtime::Loader& InstanceImpl::runtime() { return *runtime_loader_; } InstanceImpl::~InstanceImpl() {} void InstanceImpl::shutdown() { - log().notice("shutdown invoked. sending SIGTERM to self"); + log().warn("shutdown invoked. sending SIGTERM to self"); kill(getpid(), SIGTERM); } void InstanceImpl::shutdownAdmin() { - log().notice("shutting down admin due to child startup"); + log().warn("shutting down admin due to child startup"); stat_flush_timer_.reset(); handler_.closeListeners(); admin_->socket().close(); - log().notice("terminating parent process"); + log().warn("terminating parent process"); restarter_.terminateParent(); } diff --git a/test/example_configs_test.cc b/test/example_configs_test.cc index 173f143b8828b..10b0ddd6658d4 100644 --- a/test/example_configs_test.cc +++ b/test/example_configs_test.cc @@ -68,7 +68,7 @@ void runConfigTest(const std::string& dir_path) { } std::string file_name = fmt::format("{}/{}", dir_path, std::string(entry->d_name)); - Logger::Registry::getLog(Logger::Id::testing).notice("testing config: {}", file_name); + Logger::Registry::getLog(Logger::Id::testing).info("testing config: {}", file_name); ConfigTest config(file_name); } diff --git a/test/integration/server.h b/test/integration/server.h index 59513942c201c..7244f479700c6 100644 --- a/test/integration/server.h +++ b/test/integration/server.h @@ -22,7 +22,7 @@ class TestOptionsImpl : public Options { uint64_t baseId() override { return 0; } uint32_t concurrency() override { return 1; } const std::string& configPath() override { return config_path_; } - uint64_t logLevel() override { NOT_IMPLEMENTED; } + spdlog::level::level_enum logLevel() override { NOT_IMPLEMENTED; } uint64_t restartEpoch() override { return 0; } const std::string& serviceClusterName() override { return cluster_name_; } const std::string& serviceNodeName() override { return node_name_; } diff --git a/test/main.cc b/test/main.cc index dc01f8542753d..570c557d70d4c 100644 --- a/test/main.cc +++ b/test/main.cc @@ -12,7 +12,7 @@ int main(int argc, char** argv) { Ssl::OpenSsl::initialize(); Event::Libevent::Global::initialize(); - OptionsImpl options(argc, argv, "1", spdlog::level::warn); + OptionsImpl options(argc, argv, "1", spdlog::level::err); Thread::MutexBasicLockable lock; Logger::Registry::initialize(options.logLevel(), lock); BaseIntegrationTest::default_log_level_ = diff --git a/test/mocks/server/mocks.h b/test/mocks/server/mocks.h index 5f1e2328753ea..2cb0763f9b2d6 100644 --- a/test/mocks/server/mocks.h +++ b/test/mocks/server/mocks.h @@ -32,7 +32,7 @@ class MockOptions : public Options { MOCK_METHOD0(baseId, uint64_t()); MOCK_METHOD0(concurrency, uint32_t()); MOCK_METHOD0(configPath, const std::string&()); - MOCK_METHOD0(logLevel, uint64_t()); + MOCK_METHOD0(logLevel, spdlog::level::level_enum()); MOCK_METHOD0(restartEpoch, uint64_t()); MOCK_METHOD0(serviceClusterName, const std::string&()); MOCK_METHOD0(serviceNodeName, const std::string&()); diff --git a/test/server/options_impl_test.cc b/test/server/options_impl_test.cc index 05b8cddaf939d..9935fb8808c18 100644 --- a/test/server/options_impl_test.cc +++ b/test/server/options_impl_test.cc @@ -10,7 +10,7 @@ TEST(OptionsImplTest, All) { argv.push_back("--restart-epoch"); argv.push_back("1"); argv.push_back("-l"); - argv.push_back("3"); + argv.push_back("info"); argv.push_back("--service-cluster"); argv.push_back("cluster"); argv.push_back("--service-node"); @@ -19,11 +19,11 @@ TEST(OptionsImplTest, All) { argv.push_back("zone"); argv.push_back("--file-flush-interval-msec"); argv.push_back("9000"); - OptionsImpl options(argv.size(), const_cast(&argv[0]), "1", spdlog::level::notice); + OptionsImpl options(argv.size(), const_cast(&argv[0]), "1", spdlog::level::warn); EXPECT_EQ(2U, options.concurrency()); EXPECT_EQ("hello", options.configPath()); EXPECT_EQ(1U, options.restartEpoch()); - EXPECT_EQ(3U, options.logLevel()); + EXPECT_EQ(spdlog::level::info, options.logLevel()); EXPECT_EQ("cluster", options.serviceClusterName()); EXPECT_EQ("node", options.serviceNodeName()); EXPECT_EQ("zone", options.serviceZone()); From ccd7f0ff304fc438daf1acc124fc0679af655550 Mon Sep 17 00:00:00 2001 From: Matt Klein Date: Wed, 19 Oct 2016 10:30:44 -0700 Subject: [PATCH 2/2] docs --- docs/install/requirements.rst | 6 +++--- docs/operations/cli.rst | 5 +++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/docs/install/requirements.rst b/docs/install/requirements.rst index f5f67b83ce12c..1431f03ebe3fc 100644 --- a/docs/install/requirements.rst +++ b/docs/install/requirements.rst @@ -8,14 +8,14 @@ Envoy has the following requirements: * GCC 4.9+ (for C++11 regex support) * `cotire `_ (last tested with 1.7.8) -* `spdlog `_ (last tested with 319a62) +* `spdlog `_ (last tested with 0.11.0) * `http-parser `_ (last tested with 2.7.0) -* `nghttp2 `_ (last tested with 1.9.2) +* `nghttp2 `_ (last tested with 1.14.1) * `libevent `_ (last tested with 2.0.22) * `tclap `_ (last tested with 1.2.1) * `gperftools `_ (last tested with 2.5.0) * `jansson `_ (last tesed with 2.7) -* `openssl `_ (last tesed with 1.0.2h) +* `openssl `_ (last tesed with 1.0.2i) * `protobuf `_ (last tested with 3.0.0) In order to compile and run the tests the following is required: diff --git a/docs/operations/cli.rst b/docs/operations/cli.rst index 1dcb695cc73c5..f6d4a55d0a351 100644 --- a/docs/operations/cli.rst +++ b/docs/operations/cli.rst @@ -20,9 +20,10 @@ following are the command line options that Envoy supports. *(optional)* The number of :ref:`worker threads ` to run. If not specified defaults to the number of hardware threads on the machine. -.. option:: -l , --log-level +.. option:: -l , --log-level - *(optional)* The logging level. Defaults to *NOTICE*. Non developers should never set this option. + *(optional)* The logging level. Non developers should generally never set this option. See the + help text for the available log levels and the default. .. option:: --restart-epoch