From 21c20b075f3a56153aaa40bc86ff1ec71d8f00c6 Mon Sep 17 00:00:00 2001 From: Adam Gu Date: Thu, 7 Jun 2018 10:18:26 +0800 Subject: [PATCH] Switch log level control from runtime to compile time --- CMakeLists.txt | 1 + example/http/async_client/main.cc | 2 +- example/http/client/main.cc | 2 +- example/rest/book_async_client/main.cc | 2 +- example/rest/book_client/main.cc | 2 +- example/rest/book_server/main.cc | 2 +- example/soap/calc_client/main.cc | 2 +- example/soap/calc_server/main.cc | 2 +- src/webcc/logger.cc | 10 +-- src/webcc/logger.h | 87 +++++++++++++++++++------- src/webcc/soap_response.h | 8 +++ 11 files changed, 83 insertions(+), 37 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 82d64b6..4d5097a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,6 +8,7 @@ option(WEBCC_BUILD_EXAMPLE "Build examples?" ON) if(WEBCC_ENABLE_LOG) add_definitions(-DWEBCC_ENABLE_LOG) + add_definitions(-DWEBCC_LOG_LEVEL=0) endif() if(WEBCC_ENABLE_SOAP) diff --git a/example/http/async_client/main.cc b/example/http/async_client/main.cc index 60b8840..3bf0e07 100644 --- a/example/http/async_client/main.cc +++ b/example/http/async_client/main.cc @@ -35,7 +35,7 @@ void Test(boost::asio::io_context& ioc) { } int main() { - LOG_INIT(webcc::ERRO, 0); + LOG_INIT(0); boost::asio::io_context ioc; diff --git a/example/http/client/main.cc b/example/http/client/main.cc index d84f664..83a2cf0 100644 --- a/example/http/client/main.cc +++ b/example/http/client/main.cc @@ -28,7 +28,7 @@ void Test() { } int main() { - LOG_INIT(webcc::ERRO, 0); + LOG_INIT(0); Test(); Test(); diff --git a/example/rest/book_async_client/main.cc b/example/rest/book_async_client/main.cc index 3f9db53..6f26bf5 100644 --- a/example/rest/book_async_client/main.cc +++ b/example/rest/book_async_client/main.cc @@ -101,7 +101,7 @@ int main(int argc, char* argv[]) { return 1; } - LOG_INIT(webcc::ERRO, 0); + LOG_INIT(0); std::string host = argv[1]; std::string port = argv[2]; diff --git a/example/rest/book_client/main.cc b/example/rest/book_client/main.cc index 9512caf..10afa3c 100644 --- a/example/rest/book_client/main.cc +++ b/example/rest/book_client/main.cc @@ -160,7 +160,7 @@ int main(int argc, char* argv[]) { return 1; } - LOG_INIT(webcc::VERB, 0); + LOG_INIT(0); std::string host = argv[1]; std::string port = argv[2]; diff --git a/example/rest/book_server/main.cc b/example/rest/book_server/main.cc index b6fbb2d..4c40b31 100644 --- a/example/rest/book_server/main.cc +++ b/example/rest/book_server/main.cc @@ -21,7 +21,7 @@ int main(int argc, char* argv[]) { return 1; } - LOG_INIT(webcc::VERB, 0); + LOG_INIT(0); unsigned short port = std::atoi(argv[1]); diff --git a/example/soap/calc_client/main.cc b/example/soap/calc_client/main.cc index 20977f6..095cd46 100644 --- a/example/soap/calc_client/main.cc +++ b/example/soap/calc_client/main.cc @@ -3,7 +3,7 @@ #include "calc_client.h" int main() { - LOG_INIT(webcc::VERB, 0); + LOG_INIT(0); CalcClient calc; diff --git a/example/soap/calc_server/main.cc b/example/soap/calc_server/main.cc index 4cfeff1..e1f3920 100644 --- a/example/soap/calc_server/main.cc +++ b/example/soap/calc_server/main.cc @@ -17,7 +17,7 @@ int main(int argc, char* argv[]) { return 1; } - LOG_INIT(webcc::INFO, 0); + LOG_INIT(0); unsigned short port = std::atoi(argv[1]); diff --git a/src/webcc/logger.cc b/src/webcc/logger.cc index 5ebc986..d2b7329 100644 --- a/src/webcc/logger.cc +++ b/src/webcc/logger.cc @@ -14,13 +14,12 @@ namespace webcc { struct Logger { - int level; int modes; std::mutex mutex; }; // Global logger. -static Logger g_logger{ VERB }; +static Logger g_logger{ 0 }; static std::thread::id g_main_thread_id; @@ -28,9 +27,8 @@ static const char* kLevelNames[] = { "VERB", "INFO", "WARN", "ERRO", "FATA" }; -void LogInit(int level, int modes) { +void LogInit(int modes) { g_logger.modes = modes; - g_logger.level = level; // Suppose LogInit() is called from the main thread. g_main_thread_id = std::this_thread::get_id(); @@ -76,10 +74,6 @@ static std::string GetThreadID() { void LogWrite(int level, const char* file, int line, const char* format, ...) { assert(format != nullptr); - if (g_logger.level > level) { - return; - } - std::lock_guard lock(g_logger.mutex); va_list va_ptr_console; diff --git a/src/webcc/logger.h b/src/webcc/logger.h index 8cf736e..a8daad5 100644 --- a/src/webcc/logger.h +++ b/src/webcc/logger.h @@ -7,75 +7,118 @@ #include // for strrchr() -namespace webcc { +#define WEBCC_VERB 0 +#define WEBCC_INFO 1 +#define WEBCC_WARN 2 +#define WEBCC_ERRO 3 +#define WEBCC_FATA 4 -enum LogLevel { - VERB = 0, - INFO, - WARN, - ERRO, - FATA, -}; +// Default log level. +#ifndef WEBCC_LOG_LEVEL +#define WEBCC_LOG_LEVEL WEBCC_WARN +#endif + +namespace webcc { enum LogMode { FLUSH = 1, }; -void LogInit(int level, int modes); +void LogInit(int modes); void LogWrite(int level, const char* file, int line, const char* format, ...); } // namespace webcc // Initialize the logger with a level. -// E.g., LOG_INIT(ERRO, FLUSH) -#define LOG_INIT(level, modes) webcc::LogInit(level, modes); +// E.g., LOG_INIT(FLUSH) +#define LOG_INIT(modes) webcc::LogInit(modes); #if (defined(WIN32) || defined(_WIN64)) // See: https://stackoverflow.com/a/8488201 #define __FILENAME__ std::strrchr("\\" __FILE__, '\\') + 1 +#if WEBCC_LOG_LEVEL <= WEBCC_VERB #define LOG_VERB(format, ...) \ - webcc::LogWrite(webcc::VERB, __FILENAME__, __LINE__, format, ##__VA_ARGS__); + webcc::LogWrite(WEBCC_VERB, __FILENAME__, __LINE__, format, ##__VA_ARGS__); +#else +#define LOG_VERB(format, ...) +#endif +#if WEBCC_LOG_LEVEL <= WEBCC_INFO #define LOG_INFO(format, ...) \ - webcc::LogWrite(webcc::INFO, __FILENAME__, __LINE__, format, ##__VA_ARGS__); + webcc::LogWrite(WEBCC_INFO, __FILENAME__, __LINE__, format, ##__VA_ARGS__); +#else +#define LOG_INFO(format, ...) +#endif +#if WEBCC_LOG_LEVEL <= WEBCC_WARN #define LOG_WARN(format, ...) \ - webcc::LogWrite(webcc::WARN, __FILENAME__, __LINE__, format, ##__VA_ARGS__); + webcc::LogWrite(WEBCC_WARN, __FILENAME__, __LINE__, format, ##__VA_ARGS__); +#else +#define LOG_WARN(format, ...) +#endif +#if WEBCC_LOG_LEVEL <= WEBCC_ERRO #define LOG_ERRO(format, ...) \ - webcc::LogWrite(webcc::ERRO, __FILENAME__, __LINE__, format, ##__VA_ARGS__); + webcc::LogWrite(WEBCC_ERRO, __FILENAME__, __LINE__, format, ##__VA_ARGS__); +#else +#define LOG_ERRO(format, ...) +#endif +#if WEBCC_LOG_LEVEL <= WEBCC_FATA #define LOG_FATA(format, ...) \ - webcc::LogWrite(webcc::FATA, __FILENAME__, __LINE__, format, ##__VA_ARGS__); + webcc::LogWrite(WEBCC_FATA, __FILENAME__, __LINE__, format, ##__VA_ARGS__); +#else +#define LOG_FATA(format, ...) +#endif #else // See: https://stackoverflow.com/a/8488201 #define __FILENAME__ std::strrchr("/" __FILE__, '/') + 1 +#if WEBCC_LOG_LEVEL <= WEBCC_VERB #define LOG_VERB(format, args...) \ - webcc::LogWrite(webcc::VERB, __FILENAME__, __LINE__, format, ##args); + webcc::LogWrite(WEBCC_VERB, __FILENAME__, __LINE__, format, ##args); +#else +#define LOG_VERB(format, args...) +#endif +#if WEBCC_LOG_LEVEL <= WEBCC_INFO #define LOG_INFO(format, args...) \ - webcc::LogWrite(webcc::INFO, __FILENAME__, __LINE__, format, ##args); + webcc::LogWrite(WEBCC_INFO, __FILENAME__, __LINE__, format, ##args); +#else +#define LOG_INFO(format, args...) +#endif +#if WEBCC_LOG_LEVEL <= WEBCC_WARN #define LOG_WARN(format, args...) \ - webcc::LogWrite(webcc::WARN, __FILENAME__, __LINE__, format, ##args); + webcc::LogWrite(WEBCC_WARN, __FILENAME__, __LINE__, format, ##args); +#else +#define LOG_WARN(format, args...) +#endif +#if WEBCC_LOG_LEVEL <= WEBCC_ERRO #define LOG_ERRO(format, args...) \ - webcc::LogWrite(webcc::ERRO, __FILENAME__, __LINE__, format, ##args); + webcc::LogWrite(WEBCC_ERRO, __FILENAME__, __LINE__, format, ##args); +#else +#define LOG_ERRO(format, args...) +#endif +#if WEBCC_LOG_LEVEL <= WEBCC_FATA #define LOG_FATA(format, args...) \ - webcc::LogWrite(webcc::FATA, __FILENAME__, __LINE__, format, ##args); + webcc::LogWrite(WEBCC_FATA, __FILENAME__, __LINE__, format, ##args); +#else +#define LOG_FATA(format, args...) +#endif #endif // defined(WIN32) || defined(_WIN64) #else // WEBCC_ENABLE_LOG == 0 -#define LOG_INIT(level, modes) +#define LOG_INIT(modes) #if (defined(WIN32) || defined(_WIN64)) #define LOG_VERB(format, ...) diff --git a/src/webcc/soap_response.h b/src/webcc/soap_response.h index bed6159..a7499dd 100644 --- a/src/webcc/soap_response.h +++ b/src/webcc/soap_response.h @@ -18,6 +18,14 @@ class SoapResponse : public SoapMessage { result_name_ = result_name; } + void set_result(const std::string& result) { + result_ = result; + } + + void set_result(std::string&& result) { + result_ = std::move(result); + } + std::string result_moved() { return std::move(result_); }