You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@rocketmq.apache.org by if...@apache.org on 2020/12/29 03:36:42 UTC
[rocketmq-client-cpp] 25/29: refactor: logger
This is an automated email from the ASF dual-hosted git repository.
ifplusor pushed a commit to branch re_dev
in repository https://gitbox.apache.org/repos/asf/rocketmq-client-cpp.git
commit 2af15ead43fbc6e2c801fb572f0ea8d88d76d51b
Author: James Yin <yw...@hotmail.com>
AuthorDate: Thu Sep 24 11:09:51 2020 +0800
refactor: logger
---
src/common/UtilAll.cpp | 14 +++----
src/extern/CProducer.cpp | 4 +-
src/extern/CPushConsumer.cpp | 4 +-
src/log/Logging.cpp | 87 ++++++++++++++++++++++++--------------------
src/log/Logging.h | 33 ++++++++++-------
5 files changed, 78 insertions(+), 64 deletions(-)
diff --git a/src/common/UtilAll.cpp b/src/common/UtilAll.cpp
index 90dec5b..7da66f2 100644
--- a/src/common/UtilAll.cpp
+++ b/src/common/UtilAll.cpp
@@ -278,17 +278,17 @@ uint32_t UtilAll::getIP() {
std::string UtilAll::getHomeDirectory() {
#ifndef WIN32
- char* homeEnv = std::getenv("HOME");
- std::string homeDir;
- if (homeEnv == NULL) {
- homeDir.append(getpwuid(getuid())->pw_dir);
+ char* home_env = std::getenv("HOME");
+ std::string home_dir;
+ if (home_env == NULL) {
+ home_dir.append(getpwuid(getuid())->pw_dir);
} else {
- homeDir.append(homeEnv);
+ home_dir.append(home_env);
}
#else
- std::string homeDir(std::getenv("USERPROFILE"));
+ std::string home_dir(std::getenv("USERPROFILE"));
#endif
- return homeDir;
+ return home_dir;
}
static bool createDirectoryInner(const char* dir) {
diff --git a/src/extern/CProducer.cpp b/src/extern/CProducer.cpp
index edf6072..7629594 100644
--- a/src/extern/CProducer.cpp
+++ b/src/extern/CProducer.cpp
@@ -511,7 +511,7 @@ int SetProducerLogFileNumAndSize(CProducer* producer, int fileNum, long fileSize
if (producer == NULL) {
return NULL_POINTER;
}
- DEFAULT_LOG_ADAPTER->setLogFileNumAndSize(fileNum, fileSize);
+ DEFAULT_LOGGER_INSTANCE->setLogFileNumAndSize(fileNum, fileSize);
return OK;
}
@@ -519,7 +519,7 @@ int SetProducerLogLevel(CProducer* producer, CLogLevel level) {
if (producer == NULL) {
return NULL_POINTER;
}
- DEFAULT_LOG_ADAPTER->set_log_level((LogLevel)level);
+ DEFAULT_LOGGER_INSTANCE->set_log_level((LogLevel)level);
return OK;
}
diff --git a/src/extern/CPushConsumer.cpp b/src/extern/CPushConsumer.cpp
index 0ba977e..f90802e 100644
--- a/src/extern/CPushConsumer.cpp
+++ b/src/extern/CPushConsumer.cpp
@@ -258,7 +258,7 @@ int SetPushConsumerLogFileNumAndSize(CPushConsumer* consumer, int fileNum, long
if (consumer == NULL) {
return NULL_POINTER;
}
- DEFAULT_LOG_ADAPTER->setLogFileNumAndSize(fileNum, fileSize);
+ DEFAULT_LOGGER_INSTANCE->setLogFileNumAndSize(fileNum, fileSize);
return OK;
}
@@ -266,6 +266,6 @@ int SetPushConsumerLogLevel(CPushConsumer* consumer, CLogLevel level) {
if (consumer == NULL) {
return NULL_POINTER;
}
- DEFAULT_LOG_ADAPTER->set_log_level((LogLevel)level);
+ DEFAULT_LOGGER_INSTANCE->set_log_level((LogLevel)level);
return OK;
}
diff --git a/src/log/Logging.cpp b/src/log/Logging.cpp
index 8b77528..3fc2b9c 100644
--- a/src/log/Logging.cpp
+++ b/src/log/Logging.cpp
@@ -29,12 +29,30 @@
namespace rocketmq {
-LogAdapter* LogAdapter::getLogInstance() {
- static LogAdapter singleton_;
+Logger* Logger::getLoggerInstance() {
+ static Logger singleton_("default");
return &singleton_;
}
-LogAdapter::LogAdapter() : log_level_(LOG_LEVEL_INFO) {
+Logger::Logger(const std::string& name) : log_level_(LOG_LEVEL_INFO) {
+ try {
+ init_log_dir_();
+ init_spdlog_env_();
+ logger_ = create_rotating_logger_(name, log_file_, 1024 * 1024 * 100, 3);
+ set_log_level_(log_level_);
+ } catch (std::exception& e) {
+ std::cerr << "initialite logger failed" << std::endl;
+ exit(-1);
+ }
+}
+
+Logger::~Logger() {
+ if (logger_ != nullptr) {
+ spdlog::drop(logger_->name());
+ }
+}
+
+void Logger::init_log_dir_() {
std::string log_dir;
const char* dir = std::getenv(ROCKETMQ_CPP_LOG_DIR_ENV.c_str());
if (dir != nullptr && dir[0] != '\0') {
@@ -47,51 +65,34 @@ LogAdapter::LogAdapter() : log_level_(LOG_LEVEL_INFO) {
if (log_dir[log_dir.size() - 1] != '/') {
log_dir.append("/");
}
+ std::string log_file_name = UtilAll::to_string(UtilAll::getProcessId()) + "_" + "rocketmq-cpp.log";
+ log_file_ = log_dir + log_file_name;
+}
- if (!UtilAll::existDirectory(log_dir)) {
- UtilAll::createDirectory(log_dir);
- }
- if (!UtilAll::existDirectory(log_dir)) {
- std::cerr << "create log dir error, will exit" << std::endl;
- exit(1);
- }
-
- std::string fileName = UtilAll::to_string(UtilAll::getProcessId()) + "_" + "rocketmq-cpp.log";
- log_file_ = log_dir + fileName;
-
-#if SPDLOG_VER_MAJOR >= 1
- spdlog::init_thread_pool(8192, 1);
-
- auto rotating_sink = std::make_shared<spdlog::sinks::rotating_file_sink_mt>(log_file_, 1024 * 1024 * 100, 3);
- rotating_sink->set_level(spdlog::level::debug);
- rotating_sink->set_pattern("[%Y-%m-%d %H:%M:%S.%e] [%l] [thread@%t] - %v");
- log_sinks_.push_back(rotating_sink);
-
- logger_ = std::make_shared<spdlog::async_logger>("default", log_sinks_.begin(), log_sinks_.end(),
- spdlog::thread_pool(), spdlog::async_overflow_policy::block);
-
- // register it if you need to access it globally
- spdlog::register_logger(logger_);
-
+void Logger::init_spdlog_env_() {
+ spdlog::set_pattern("[%Y-%m-%d %H:%M:%S.%e] [%l] [thread@%t] - %v");
// when an error occurred, flush disk immediately
- logger_->flush_on(spdlog::level::err);
-
+ spdlog::flush_on(spdlog::level::err);
+#if SPDLOG_VER_MAJOR >= 1
+ spdlog::init_thread_pool(spdlog::details::default_async_q_size, 1);
spdlog::flush_every(std::chrono::seconds(3));
#else
- size_t q_size = 4096;
- spdlog::set_async_mode(q_size);
- logger_ = spdlog::rotating_logger_mt("default", log_file_, 1024 * 1024 * 100, 3);
- logger_->set_pattern("[%Y-%m-%d %H:%M:%S.%e] [%l] [thread@%t] - %v");
+ spdlog::set_async_mode(8192, async_overflow_policy::block_retry, nullptr, std::chrono::milliseconds(3000), nullptr);
#endif
-
- setLogLevelInner(log_level_);
}
-LogAdapter::~LogAdapter() {
- spdlog::drop("default");
+std::shared_ptr<spdlog::logger> Logger::create_rotating_logger_(const std::string& name,
+ const std::string& filepath,
+ std::size_t max_size,
+ std::size_t max_files) {
+#if SPDLOG_VER_MAJOR >= 1
+ return spdlog::create_async<spdlog::sinks::rotating_file_sink_mt>(name, filepath, max_size, max_files);
+#else
+ return spdlog::rotating_logger_mt(name, filepath, max_size, max_files);
+#endif
}
-void LogAdapter::setLogLevelInner(LogLevel log_level) {
+void Logger::set_log_level_(LogLevel log_level) {
switch (log_level) {
case LOG_LEVEL_FATAL:
logger_->set_level(spdlog::level::critical);
@@ -117,6 +118,12 @@ void LogAdapter::setLogLevelInner(LogLevel log_level) {
}
}
-void LogAdapter::setLogFileNumAndSize(int logNum, int sizeOfPerFile) {}
+void Logger::setLogFileNumAndSize(int logNum, int sizeOfPerFile) {
+ // FIXME: set after clients started
+ auto name = logger_->name();
+ spdlog::drop(name);
+ logger_ = create_rotating_logger_(name, log_file_, sizeOfPerFile, logNum);
+ set_log_level_(log_level_);
+}
} // namespace rocketmq
diff --git a/src/log/Logging.h b/src/log/Logging.h
index 5afcc56..42b1f3b 100644
--- a/src/log/Logging.h
+++ b/src/log/Logging.h
@@ -42,38 +42,45 @@ enum LogLevel {
LOG_LEVEL_LEVEL_NUM = 7
};
-class LogAdapter {
+class Logger {
public:
- virtual ~LogAdapter();
+ static Logger* getLoggerInstance();
- static LogAdapter* getLogInstance();
+ public:
+ virtual ~Logger();
inline spdlog::logger* getSeverityLogger() { return logger_.get(); }
void setLogFileNumAndSize(int logNum, int sizeOfPerFile);
inline LogLevel log_level() const { return log_level_; }
- inline void set_log_level(LogLevel logLevel) {
- log_level_ = logLevel;
- setLogLevelInner(logLevel);
+ inline void set_log_level(LogLevel log_level) {
+ log_level_ = log_level;
+ set_log_level_(log_level);
}
private:
- LogAdapter();
- void setLogLevelInner(LogLevel logLevel);
+ Logger(const std::string& name);
+
+ void init_log_dir_();
+ void init_spdlog_env_();
+
+ std::shared_ptr<spdlog::logger> create_rotating_logger_(const std::string& name,
+ const std::string& filepath,
+ std::size_t max_size,
+ std::size_t max_files);
+
+ void set_log_level_(LogLevel log_level);
private:
LogLevel log_level_;
std::string log_file_;
std::shared_ptr<spdlog::logger> logger_;
-#if SPDLOG_VER_MAJOR >= 1
- std::vector<spdlog::sink_ptr> log_sinks_;
-#endif
};
-#define DEFAULT_LOG_ADAPTER LogAdapter::getLogInstance()
-#define DEFAULT_LOGGER DEFAULT_LOG_ADAPTER->getSeverityLogger()
+#define DEFAULT_LOGGER_INSTANCE Logger::getLoggerInstance()
+#define DEFAULT_LOGGER DEFAULT_LOGGER_INSTANCE->getSeverityLogger()
#define SPDLOG_PRINTF(logger, level, format, ...) \
do { \