From f47a8a522364937db03748a9a0c4918994a7476e Mon Sep 17 00:00:00 2001 From: Adam Simpkins Date: Thu, 15 Jun 2017 11:04:00 -0700 Subject: [PATCH] logging: add initialization convenience functions Summary: Add a logging/Init.h header file with a couple convenience functions for initializing log levels and log handlers. This is pretty basic for now, but simplifies usage for small programs that just want to easily initialize the logging library. Reviewed By: wez Differential Revision: D5083106 fbshipit-source-id: 73c1fd00df2eaf506b9c1485d6afd12570412a0f --- folly/Makefile.am | 1 + folly/experimental/logging/Init.cpp | 76 ++++++++++++++++++++++++++ folly/experimental/logging/Init.h | 65 ++++++++++++++++++++++ folly/experimental/logging/Makefile.am | 1 + 4 files changed, 143 insertions(+) create mode 100644 folly/experimental/logging/Init.cpp create mode 100644 folly/experimental/logging/Init.h diff --git a/folly/Makefile.am b/folly/Makefile.am index 734be3dd..558a4859 100644 --- a/folly/Makefile.am +++ b/folly/Makefile.am @@ -124,6 +124,7 @@ nobase_follyinclude_HEADERS = \ experimental/logging/AsyncFileWriter.h \ experimental/logging/GlogStyleFormatter.h \ experimental/logging/ImmediateFileWriter.h \ + experimental/logging/Init.h \ experimental/logging/LogCategory.h \ experimental/logging/LogFormatter.h \ experimental/logging/Logger.h \ diff --git a/folly/experimental/logging/Init.cpp b/folly/experimental/logging/Init.cpp new file mode 100644 index 00000000..d1e6a6a9 --- /dev/null +++ b/folly/experimental/logging/Init.cpp @@ -0,0 +1,76 @@ +/* + * Copyright 2004-present Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#include + +#include +#include +#include +#include +#include +#include + +using std::shared_ptr; +using std::string; +using std::vector; + +namespace folly { + +void initLogLevels(StringPiece configString, LogLevel defaultRootLevel) { + // Set the default root category log level first + LoggerDB::get()->getCategory(".")->setLevel(defaultRootLevel); + + // Then apply the configuration string + if (!configString.empty()) { + auto ret = LoggerDB::get()->processConfigString(configString); + if (!ret.empty()) { + throw LoggingConfigError(ret); + } + } +} + +void initLoggingGlogStyle( + StringPiece configString, + LogLevel defaultRootLevel, + bool asyncWrites) { + // Configure log levels + initLogLevels(configString, defaultRootLevel); + + // Create the LogHandler + std::shared_ptr writer; + folly::File file{STDERR_FILENO, false}; + if (asyncWrites) { + writer = std::make_shared(std::move(file)); + } else { + writer = std::make_shared(std::move(file)); + } + auto handler = std::make_shared( + std::make_shared(), std::move(writer)); + + // Add the handler to the root category. + LoggerDB::get()->getCategory(".")->addHandler(std::move(handler)); +} + +LoggingConfigError::LoggingConfigError(const vector& errors) + : invalid_argument{computeMessage(errors)} {} + +std::string LoggingConfigError::computeMessage(const vector& errors) { + string msg = "error parsing logging configuration:"; + for (const auto& error : errors) { + msg += "\n" + error; + } + return msg; +} +} diff --git a/folly/experimental/logging/Init.h b/folly/experimental/logging/Init.h new file mode 100644 index 00000000..5491974a --- /dev/null +++ b/folly/experimental/logging/Init.h @@ -0,0 +1,65 @@ +/* + * Copyright 2004-present Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#pragma once + +/* + * This file contains function to help configure the logging library behavior + * during program start-up. + */ + +#include +#include +#include + +#include +#include + +namespace folly { + +/** + * Configure log category levels based on a configuration string. + * + * This can be used to process a logging configuration string (such as received + * via a command line flag) during program start-up. + */ +void initLogLevels( + folly::StringPiece configString = "", + LogLevel defaultRootLevel = LogLevel::WARNING); + +/** + * Initialize the logging library to write glog-style messages to stderr. + * + * This initializes the log category levels as specified (using + * initLogLevels()), and adds a log handler that prints messages in glog-style + * format to stderr. + */ +void initLoggingGlogStyle( + folly::StringPiece configString = "", + LogLevel defaultRootLevel = LogLevel::WARNING, + bool asyncWrites = true); + +/** + * LoggingConfigError may be thrown by initLogLevels() if an error occurs + * parsing the configuration string. + */ +class LoggingConfigError : public std::invalid_argument { + public: + explicit LoggingConfigError(const std::vector& errors); + + private: + std::string computeMessage(const std::vector& errors); +}; +} diff --git a/folly/experimental/logging/Makefile.am b/folly/experimental/logging/Makefile.am index c3fc0219..bd38e611 100644 --- a/folly/experimental/logging/Makefile.am +++ b/folly/experimental/logging/Makefile.am @@ -6,6 +6,7 @@ libfollylogging_la_SOURCES = \ AsyncFileWriter.cpp \ GlogStyleFormatter.cpp \ ImmediateFileWriter.cpp \ + Init.cpp \ LogCategory.cpp \ Logger.cpp \ LoggerDB.cpp \ -- 2.34.1