This is an automated email from the ASF dual-hosted git repository.

mmerli pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/pulsar.git


The following commit(s) were added to refs/heads/master by this push:
     new 1ab2bfc  [C++] Add C++ single file logger factory (#10712)
1ab2bfc is described below

commit 1ab2bfc0427d50afa7c43c5f8a03aa26f90a9647
Author: Yunze Xu <[email protected]>
AuthorDate: Sun May 30 02:24:18 2021 +0800

    [C++] Add C++ single file logger factory (#10712)
    
    * Add SampleFileLogger C++ example
    
    * Expose SingleFileLoggerFactory as the public interface
    
    * Make logger factory public
    
    * Change logger factory's name
    
    * Use PImpl idiom for LoggerFactory classes
---
 pulsar-client-cpp/examples/CMakeLists.txt          |  6 ++++
 pulsar-client-cpp/examples/SampleAsyncProducer.cc  |  2 +-
 pulsar-client-cpp/examples/SampleConsumer.cc       |  2 +-
 .../examples/SampleConsumerListener.cc             |  2 +-
 .../{SampleProducer.cc => SampleFileLogger.cc}     | 26 ++++-----------
 pulsar-client-cpp/examples/SampleProducer.cc       |  2 +-
 pulsar-client-cpp/include/pulsar/Client.h          |  2 ++
 ...impleLoggerFactory.h => ConsoleLoggerFactory.h} | 15 +++++----
 .../{SimpleLoggerFactory.h => FileLoggerFactory.h} | 29 ++++++++++-------
 pulsar-client-cpp/lib/ClientImpl.cc                |  6 ++--
 .../ConsoleLoggerFactory.cc}                       | 29 +++++------------
 .../ConsoleLoggerFactoryImpl.h}                    | 32 +++++++------------
 .../SampleProducer.cc => lib/FileLoggerFactory.cc} | 30 +++++-------------
 .../FileLoggerFactoryImpl.h}                       | 37 +++++++++++-----------
 pulsar-client-cpp/lib/LogUtils.cc                  |  4 +--
 .../lib/{SimpleLoggerFactory.cc => SimpleLogger.h} | 12 +++----
 pulsar-client-cpp/tests/CustomLoggerTest.cc        | 12 +++----
 17 files changed, 109 insertions(+), 139 deletions(-)

diff --git a/pulsar-client-cpp/examples/CMakeLists.txt 
b/pulsar-client-cpp/examples/CMakeLists.txt
index ec4f8de..bd12464 100644
--- a/pulsar-client-cpp/examples/CMakeLists.txt
+++ b/pulsar-client-cpp/examples/CMakeLists.txt
@@ -37,6 +37,10 @@ set(SAMPLE_PRODUCER_SOURCES
   SampleProducer.cc
 )
 
+set(SAMPLE_FILE_LOGGER_SOURCES
+  SampleFileLogger.cc
+)
+
 set(SAMPLE_PRODUCER_C_SOURCES
     SampleProducerCApi.c
 )
@@ -57,6 +61,7 @@ add_executable(SampleAsyncProducer    
${SAMPLE_ASYNC_PRODUCER_SOURCES})
 add_executable(SampleConsumer         ${SAMPLE_CONSUMER_SOURCES})
 add_executable(SampleConsumerListener ${SAMPLE_CONSUMER_LISTENER_SOURCES})
 add_executable(SampleProducer         ${SAMPLE_PRODUCER_SOURCES})
+add_executable(SampleFileLogger       ${SAMPLE_FILE_LOGGER_SOURCES})
 add_executable(SampleProducerCApi         ${SAMPLE_PRODUCER_C_SOURCES})
 add_executable(SampleConsumerCApi         ${SAMPLE_CONSUMER_C_SOURCES})
 add_executable(SampleConsumerListenerCApi         
${SAMPLE_CONSUMER_LISTENER_C_SOURCES})
@@ -66,6 +71,7 @@ target_link_libraries(SampleAsyncProducer    ${CLIENT_LIBS} 
pulsarShared)
 target_link_libraries(SampleConsumer         ${CLIENT_LIBS} pulsarShared)
 target_link_libraries(SampleConsumerListener ${CLIENT_LIBS} pulsarShared)
 target_link_libraries(SampleProducer         ${CLIENT_LIBS} pulsarShared)
+target_link_libraries(SampleFileLogger       ${CLIENT_LIBS} pulsarShared)
 target_link_libraries(SampleProducerCApi     ${CLIENT_LIBS} pulsarShared)
 target_link_libraries(SampleConsumerCApi     ${CLIENT_LIBS} pulsarShared)
 target_link_libraries(SampleConsumerListenerCApi     ${CLIENT_LIBS} 
pulsarShared)
diff --git a/pulsar-client-cpp/examples/SampleAsyncProducer.cc 
b/pulsar-client-cpp/examples/SampleAsyncProducer.cc
index ccc2c0f..9701ccb 100644
--- a/pulsar-client-cpp/examples/SampleAsyncProducer.cc
+++ b/pulsar-client-cpp/examples/SampleAsyncProducer.cc
@@ -35,7 +35,7 @@ int main() {
     Client client("pulsar://localhost:6650");
 
     Producer producer;
-    Result result = client.createProducer("persistent://prop/r1/ns1/my-topic", 
producer);
+    Result result = 
client.createProducer("persistent://public/default/my-topic", producer);
     if (result != ResultOk) {
         LOG_ERROR("Error creating producer: " << result);
         return -1;
diff --git a/pulsar-client-cpp/examples/SampleConsumer.cc 
b/pulsar-client-cpp/examples/SampleConsumer.cc
index e61b793..1dcc550 100644
--- a/pulsar-client-cpp/examples/SampleConsumer.cc
+++ b/pulsar-client-cpp/examples/SampleConsumer.cc
@@ -30,7 +30,7 @@ int main() {
     Client client("pulsar://localhost:6650");
 
     Consumer consumer;
-    Result result = client.subscribe("persistent://prop/r1/ns1/my-topic", 
"consumer-1", consumer);
+    Result result = client.subscribe("persistent://public/default/my-topic", 
"consumer-1", consumer);
     if (result != ResultOk) {
         LOG_ERROR("Failed to subscribe: " << result);
         return -1;
diff --git a/pulsar-client-cpp/examples/SampleConsumerListener.cc 
b/pulsar-client-cpp/examples/SampleConsumerListener.cc
index 5d60ccd..9ce2291 100644
--- a/pulsar-client-cpp/examples/SampleConsumerListener.cc
+++ b/pulsar-client-cpp/examples/SampleConsumerListener.cc
@@ -38,7 +38,7 @@ int main() {
     Consumer consumer;
     ConsumerConfiguration config;
     config.setMessageListener(listener);
-    Result result = client.subscribe("persistent://prop/r1/ns1/my-topic", 
"consumer-1", config, consumer);
+    Result result = client.subscribe("persistent://public/default/my-topic", 
"consumer-1", config, consumer);
     if (result != ResultOk) {
         LOG_ERROR("Failed to subscribe: " << result);
         return -1;
diff --git a/pulsar-client-cpp/examples/SampleProducer.cc 
b/pulsar-client-cpp/examples/SampleFileLogger.cc
similarity index 64%
copy from pulsar-client-cpp/examples/SampleProducer.cc
copy to pulsar-client-cpp/examples/SampleFileLogger.cc
index bc1ece2..fcc3d41 100644
--- a/pulsar-client-cpp/examples/SampleProducer.cc
+++ b/pulsar-client-cpp/examples/SampleFileLogger.cc
@@ -16,30 +16,18 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-#include <iostream>
-
 #include <pulsar/Client.h>
 
-#include <lib/LogUtils.h>
-
-DECLARE_LOG_OBJECT()
-
 using namespace pulsar;
 
-int main() {
-    Client client("pulsar://localhost:6650");
+int main(int argc, char* argv[]) {
+    ClientConfiguration clientConf;
+    // The logs whose level is >= INFO will be written to pulsar-cpp-client.log
+    clientConf.setLogger(new FileLoggerFactory(Logger::Level::LEVEL_INFO, 
"pulsar-cpp-client.log"));
 
+    Client client("pulsar://localhost:6650", clientConf);
     Producer producer;
-    Result result = client.createProducer("persistent://prop/r1/ns1/my-topic", 
producer);
-    if (result != ResultOk) {
-        LOG_ERROR("Error creating producer: " << result);
-        return -1;
-    }
-
-    // Send synchronously
-    Message msg = MessageBuilder().setContent("content").build();
-    Result res = producer.send(msg);
-    LOG_INFO("Message sent: " << res);
-
+    client.createProducer("my-topic", producer);  // just to create some logs
     client.close();
+    return 0;
 }
diff --git a/pulsar-client-cpp/examples/SampleProducer.cc 
b/pulsar-client-cpp/examples/SampleProducer.cc
index bc1ece2..ff50487 100644
--- a/pulsar-client-cpp/examples/SampleProducer.cc
+++ b/pulsar-client-cpp/examples/SampleProducer.cc
@@ -30,7 +30,7 @@ int main() {
     Client client("pulsar://localhost:6650");
 
     Producer producer;
-    Result result = client.createProducer("persistent://prop/r1/ns1/my-topic", 
producer);
+    Result result = 
client.createProducer("persistent://public/default/my-topic", producer);
     if (result != ResultOk) {
         LOG_ERROR("Error creating producer: " << result);
         return -1;
diff --git a/pulsar-client-cpp/include/pulsar/Client.h 
b/pulsar-client-cpp/include/pulsar/Client.h
index 881d484..1bc2614 100644
--- a/pulsar-client-cpp/include/pulsar/Client.h
+++ b/pulsar-client-cpp/include/pulsar/Client.h
@@ -28,6 +28,8 @@
 #include <pulsar/MessageBuilder.h>
 #include <pulsar/ClientConfiguration.h>
 #include <pulsar/Schema.h>
+#include <pulsar/ConsoleLoggerFactory.h>
+#include <pulsar/FileLoggerFactory.h>
 #include <string>
 
 namespace pulsar {
diff --git a/pulsar-client-cpp/include/pulsar/SimpleLoggerFactory.h 
b/pulsar-client-cpp/include/pulsar/ConsoleLoggerFactory.h
similarity index 80%
copy from pulsar-client-cpp/include/pulsar/SimpleLoggerFactory.h
copy to pulsar-client-cpp/include/pulsar/ConsoleLoggerFactory.h
index 1ab11dd..7f3f407 100644
--- a/pulsar-client-cpp/include/pulsar/SimpleLoggerFactory.h
+++ b/pulsar-client-cpp/include/pulsar/ConsoleLoggerFactory.h
@@ -23,6 +23,8 @@
 
 namespace pulsar {
 
+class ConsoleLoggerFactoryImpl;
+
 /**
  * The default LoggerFactory of Client if `USE_LOG4CXX` macro was not defined 
during compilation.
  *
@@ -37,22 +39,23 @@ namespace pulsar {
  * level simply.
  *
  * ```c++
- * #include <pulsar/SimpleLoggerFactory.h>
+ * #include <pulsar/ConsoleLoggerFactory.h>
  *
  * ClientConfiguration conf;
- * conf.setLogger(new SimpleLoggerFactory(Logger::LEVEL_DEBUG));
+ * conf.setLogger(new ConsoleLoggerFactory(Logger::LEVEL_DEBUG));
  * Client client("pulsar://localhost:6650", conf);
  * ```
  */
-class SimpleLoggerFactory : public LoggerFactory {
+class PULSAR_PUBLIC ConsoleLoggerFactory : public LoggerFactory {
    public:
-    explicit SimpleLoggerFactory() = default;
-    explicit SimpleLoggerFactory(Logger::Level level) : level_(level) {}
+    explicit ConsoleLoggerFactory(Logger::Level level = Logger::LEVEL_INFO);
+
+    ~ConsoleLoggerFactory();
 
     Logger* getLogger(const std::string& fileName) override;
 
    private:
-    Logger::Level level_{Logger::LEVEL_INFO};
+    std::unique_ptr<ConsoleLoggerFactoryImpl> impl_;
 };
 
 }  // namespace pulsar
diff --git a/pulsar-client-cpp/include/pulsar/SimpleLoggerFactory.h 
b/pulsar-client-cpp/include/pulsar/FileLoggerFactory.h
similarity index 65%
rename from pulsar-client-cpp/include/pulsar/SimpleLoggerFactory.h
rename to pulsar-client-cpp/include/pulsar/FileLoggerFactory.h
index 1ab11dd..aa6282e 100644
--- a/pulsar-client-cpp/include/pulsar/SimpleLoggerFactory.h
+++ b/pulsar-client-cpp/include/pulsar/FileLoggerFactory.h
@@ -23,9 +23,10 @@
 
 namespace pulsar {
 
+class FileLoggerFactoryImpl;
+
 /**
- * The default LoggerFactory of Client if `USE_LOG4CXX` macro was not defined 
during compilation.
- *
+ * A logger factory that is appending logs to a single file.
  *
  * The log format is "yyyy-mm-dd hh:MM:ss.xxx <level> <thread-id> 
<file>:<line> | <msg>", like
  *
@@ -33,26 +34,32 @@ namespace pulsar {
  * 2021-03-24 17:35:46.571 INFO  [0x10a951e00] ConnectionPool:85 | Created 
connection for ...
  * ```
  *
- * It uses `std::cout` to prints logs to standard output. You can use this 
factory class to change your log
- * level simply.
+ * Example:
  *
  * ```c++
- * #include <pulsar/SimpleLoggerFactory.h>
+ * #include <pulsar/FileLoggerFactory.h>
  *
  * ClientConfiguration conf;
- * conf.setLogger(new SimpleLoggerFactory(Logger::LEVEL_DEBUG));
+ * conf.setLogger(new FileLoggerFactory(Logger::LEVEL_DEBUG, 
"pulsar-client-cpp.log"));
  * Client client("pulsar://localhost:6650", conf);
  * ```
  */
-class SimpleLoggerFactory : public LoggerFactory {
+class PULSAR_PUBLIC FileLoggerFactory : public pulsar::LoggerFactory {
    public:
-    explicit SimpleLoggerFactory() = default;
-    explicit SimpleLoggerFactory(Logger::Level level) : level_(level) {}
+    /**
+     * Create a FileLoggerFactory instance.
+     *
+     * @param level the log level
+     * @param logFilePath the log file's path
+     */
+    FileLoggerFactory(Logger::Level level, const std::string& logFilePath);
+
+    ~FileLoggerFactory();
 
-    Logger* getLogger(const std::string& fileName) override;
+    pulsar::Logger* getLogger(const std::string& filename) override;
 
    private:
-    Logger::Level level_{Logger::LEVEL_INFO};
+    std::unique_ptr<FileLoggerFactoryImpl> impl_;
 };
 
 }  // namespace pulsar
diff --git a/pulsar-client-cpp/lib/ClientImpl.cc 
b/pulsar-client-cpp/lib/ClientImpl.cc
index 5edda08..d9a2b57 100644
--- a/pulsar-client-cpp/lib/ClientImpl.cc
+++ b/pulsar-client-cpp/lib/ClientImpl.cc
@@ -26,7 +26,7 @@
 #include "PartitionedConsumerImpl.h"
 #include "MultiTopicsConsumerImpl.h"
 #include "PatternMultiTopicsConsumerImpl.h"
-#include <pulsar/SimpleLoggerFactory.h>
+#include <pulsar/ConsoleLoggerFactory.h>
 #include <boost/algorithm/string/predicate.hpp>
 #include <sstream>
 #include <lib/HTTPLookupService.h>
@@ -101,11 +101,11 @@ ClientImpl::ClientImpl(const std::string& serviceUrl, 
const ClientConfiguration&
             loggerFactory = 
Log4CxxLoggerFactory::create(clientConfiguration_.getLogConfFilePath());
         } else {
             // Use default simple console logger
-            loggerFactory.reset(new SimpleLoggerFactory);
+            loggerFactory.reset(new ConsoleLoggerFactory);
         }
 #else
         // Use default simple console logger
-        loggerFactory.reset(new SimpleLoggerFactory);
+        loggerFactory.reset(new ConsoleLoggerFactory);
 #endif
     }
     LogUtils::setLoggerFactory(std::move(loggerFactory));
diff --git a/pulsar-client-cpp/examples/SampleProducer.cc 
b/pulsar-client-cpp/lib/ConsoleLoggerFactory.cc
similarity index 57%
copy from pulsar-client-cpp/examples/SampleProducer.cc
copy to pulsar-client-cpp/lib/ConsoleLoggerFactory.cc
index bc1ece2..397c7fe 100644
--- a/pulsar-client-cpp/examples/SampleProducer.cc
+++ b/pulsar-client-cpp/lib/ConsoleLoggerFactory.cc
@@ -16,30 +16,17 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-#include <iostream>
 
-#include <pulsar/Client.h>
+#include <pulsar/ConsoleLoggerFactory.h>
+#include "lib/ConsoleLoggerFactoryImpl.h"
 
-#include <lib/LogUtils.h>
+namespace pulsar {
 
-DECLARE_LOG_OBJECT()
+ConsoleLoggerFactory::ConsoleLoggerFactory(Logger::Level level)
+    : impl_(new ConsoleLoggerFactoryImpl(level)) {}
 
-using namespace pulsar;
+ConsoleLoggerFactory::~ConsoleLoggerFactory() {}
 
-int main() {
-    Client client("pulsar://localhost:6650");
+Logger* ConsoleLoggerFactory::getLogger(const std::string& fileName) { return 
impl_->getLogger(fileName); }
 
-    Producer producer;
-    Result result = client.createProducer("persistent://prop/r1/ns1/my-topic", 
producer);
-    if (result != ResultOk) {
-        LOG_ERROR("Error creating producer: " << result);
-        return -1;
-    }
-
-    // Send synchronously
-    Message msg = MessageBuilder().setContent("content").build();
-    Result res = producer.send(msg);
-    LOG_INFO("Message sent: " << res);
-
-    client.close();
-}
+}  // namespace pulsar
diff --git a/pulsar-client-cpp/examples/SampleProducer.cc 
b/pulsar-client-cpp/lib/ConsoleLoggerFactoryImpl.h
similarity index 57%
copy from pulsar-client-cpp/examples/SampleProducer.cc
copy to pulsar-client-cpp/lib/ConsoleLoggerFactoryImpl.h
index bc1ece2..61c1d90 100644
--- a/pulsar-client-cpp/examples/SampleProducer.cc
+++ b/pulsar-client-cpp/lib/ConsoleLoggerFactoryImpl.h
@@ -16,30 +16,22 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-#include <iostream>
 
-#include <pulsar/Client.h>
+#pragma once
 
-#include <lib/LogUtils.h>
+#include <pulsar/Logger.h>
+#include "lib/SimpleLogger.h"
 
-DECLARE_LOG_OBJECT()
+namespace pulsar {
 
-using namespace pulsar;
+class ConsoleLoggerFactoryImpl {
+   public:
+    ConsoleLoggerFactoryImpl(Logger::Level level) : level_(level) {}
 
-int main() {
-    Client client("pulsar://localhost:6650");
+    Logger* getLogger(const std::string& fileName) { return new 
SimpleLogger(std::cout, fileName, level_); }
 
-    Producer producer;
-    Result result = client.createProducer("persistent://prop/r1/ns1/my-topic", 
producer);
-    if (result != ResultOk) {
-        LOG_ERROR("Error creating producer: " << result);
-        return -1;
-    }
+   private:
+    Logger::Level level_;
+};
 
-    // Send synchronously
-    Message msg = MessageBuilder().setContent("content").build();
-    Result res = producer.send(msg);
-    LOG_INFO("Message sent: " << res);
-
-    client.close();
-}
+}  // namespace pulsar
diff --git a/pulsar-client-cpp/examples/SampleProducer.cc 
b/pulsar-client-cpp/lib/FileLoggerFactory.cc
similarity index 57%
copy from pulsar-client-cpp/examples/SampleProducer.cc
copy to pulsar-client-cpp/lib/FileLoggerFactory.cc
index bc1ece2..a82613f 100644
--- a/pulsar-client-cpp/examples/SampleProducer.cc
+++ b/pulsar-client-cpp/lib/FileLoggerFactory.cc
@@ -16,30 +16,16 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-#include <iostream>
+#include <pulsar/FileLoggerFactory.h>
+#include "lib/FileLoggerFactoryImpl.h"
 
-#include <pulsar/Client.h>
+namespace pulsar {
 
-#include <lib/LogUtils.h>
+FileLoggerFactory::FileLoggerFactory(Logger::Level level, const std::string& 
logFilePath)
+    : impl_(new FileLoggerFactoryImpl(level, logFilePath)) {}
 
-DECLARE_LOG_OBJECT()
+FileLoggerFactory::~FileLoggerFactory() {}
 
-using namespace pulsar;
+Logger* FileLoggerFactory::getLogger(const std::string& filename) { return 
impl_->getLogger(filename); }
 
-int main() {
-    Client client("pulsar://localhost:6650");
-
-    Producer producer;
-    Result result = client.createProducer("persistent://prop/r1/ns1/my-topic", 
producer);
-    if (result != ResultOk) {
-        LOG_ERROR("Error creating producer: " << result);
-        return -1;
-    }
-
-    // Send synchronously
-    Message msg = MessageBuilder().setContent("content").build();
-    Result res = producer.send(msg);
-    LOG_INFO("Message sent: " << res);
-
-    client.close();
-}
+}  // namespace pulsar
diff --git a/pulsar-client-cpp/examples/SampleProducer.cc 
b/pulsar-client-cpp/lib/FileLoggerFactoryImpl.h
similarity index 57%
copy from pulsar-client-cpp/examples/SampleProducer.cc
copy to pulsar-client-cpp/lib/FileLoggerFactoryImpl.h
index bc1ece2..75329c6 100644
--- a/pulsar-client-cpp/examples/SampleProducer.cc
+++ b/pulsar-client-cpp/lib/FileLoggerFactoryImpl.h
@@ -16,30 +16,29 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-#include <iostream>
+#pragma once
 
-#include <pulsar/Client.h>
+#include <fstream>
+#include <ios>
+#include <string>
+#include <pulsar/Logger.h>
 
-#include <lib/LogUtils.h>
+#include "lib/SimpleLogger.h"
 
-DECLARE_LOG_OBJECT()
+namespace pulsar {
 
-using namespace pulsar;
+class FileLoggerFactoryImpl {
+   public:
+    FileLoggerFactoryImpl(Logger::Level level, const std::string& logFilePath)
+        : level_(level), os_(logFilePath, std::ios_base::out | 
std::ios_base::app) {}
 
-int main() {
-    Client client("pulsar://localhost:6650");
+    ~FileLoggerFactoryImpl() { os_.close(); }
 
-    Producer producer;
-    Result result = client.createProducer("persistent://prop/r1/ns1/my-topic", 
producer);
-    if (result != ResultOk) {
-        LOG_ERROR("Error creating producer: " << result);
-        return -1;
-    }
+    Logger* getLogger(const std::string& filename) { return new 
SimpleLogger(os_, filename, level_); }
 
-    // Send synchronously
-    Message msg = MessageBuilder().setContent("content").build();
-    Result res = producer.send(msg);
-    LOG_INFO("Message sent: " << res);
+   private:
+    const Logger::Level level_;
+    std::ofstream os_;
+};
 
-    client.close();
-}
+}  // namespace pulsar
diff --git a/pulsar-client-cpp/lib/LogUtils.cc 
b/pulsar-client-cpp/lib/LogUtils.cc
index 60e7d51..7967fbe 100644
--- a/pulsar-client-cpp/lib/LogUtils.cc
+++ b/pulsar-client-cpp/lib/LogUtils.cc
@@ -20,7 +20,7 @@
 
 #include <atomic>
 #include <iostream>
-#include <pulsar/SimpleLoggerFactory.h>
+#include <pulsar/ConsoleLoggerFactory.h>
 
 #include "Log4CxxLogger.h"
 
@@ -50,7 +50,7 @@ void 
LogUtils::setLoggerFactory(std::unique_ptr<LoggerFactory> loggerFactory) {
 
 LoggerFactory* LogUtils::getLoggerFactory() {
     if (s_loggerFactory.load() == nullptr) {
-        std::unique_ptr<LoggerFactory> newFactory(new SimpleLoggerFactory());
+        std::unique_ptr<LoggerFactory> newFactory(new ConsoleLoggerFactory());
         setLoggerFactory(std::move(newFactory));
     }
     return s_loggerFactory.load();
diff --git a/pulsar-client-cpp/lib/SimpleLoggerFactory.cc 
b/pulsar-client-cpp/lib/SimpleLogger.h
similarity index 89%
rename from pulsar-client-cpp/lib/SimpleLoggerFactory.cc
rename to pulsar-client-cpp/lib/SimpleLogger.h
index 5fb5b67..b750336 100644
--- a/pulsar-client-cpp/lib/SimpleLoggerFactory.cc
+++ b/pulsar-client-cpp/lib/SimpleLogger.h
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-#include <pulsar/SimpleLoggerFactory.h>
+#pragma once
 
 #include <iostream>
 #include <sstream>
@@ -48,7 +48,8 @@ inline std::ostream &operator<<(std::ostream &s, 
Logger::Level level) {
 
 class SimpleLogger : public Logger {
    public:
-    SimpleLogger(const std::string &filename, Level level) : 
filename_(filename), level_(level) {}
+    SimpleLogger(std::ostream &os, const std::string &filename, Level level)
+        : os_(os), filename_(filename), level_(level) {}
 
     bool isEnabled(Level level) { return level >= level_; }
 
@@ -59,11 +60,12 @@ class SimpleLogger : public Logger {
         ss << " " << level << " [" << std::this_thread::get_id() << "] " << 
filename_ << ":" << line << " | "
            << message << "\n";
 
-        std::cout << ss.str();
-        std::cout.flush();
+        os_ << ss.str();
+        os_.flush();
     }
 
    private:
+    std::ostream &os_;
     const std::string filename_;
     const Level level_;
 
@@ -81,6 +83,4 @@ class SimpleLogger : public Logger {
     }
 };
 
-Logger *SimpleLoggerFactory::getLogger(const std::string &file) { return new 
SimpleLogger(file, level_); }
-
 }  // namespace pulsar
diff --git a/pulsar-client-cpp/tests/CustomLoggerTest.cc 
b/pulsar-client-cpp/tests/CustomLoggerTest.cc
index 8b4cd79..f2a97d1 100644
--- a/pulsar-client-cpp/tests/CustomLoggerTest.cc
+++ b/pulsar-client-cpp/tests/CustomLoggerTest.cc
@@ -17,7 +17,7 @@
  * under the License.
  */
 #include <pulsar/Client.h>
-#include <pulsar/SimpleLoggerFactory.h>
+#include <pulsar/ConsoleLoggerFactory.h>
 #include <LogUtils.h>
 #include <gtest/gtest.h>
 #include <thread>
@@ -68,29 +68,29 @@ TEST(CustomLoggerTest, testCustomLogger) {
     ASSERT_EQ(logLines.size(), 2);
 }
 
-TEST(CustomLoggerTest, testSimpleLoggerFactory) {
-    std::unique_ptr<SimpleLoggerFactory> factory(new SimpleLoggerFactory);
+TEST(CustomLoggerTest, testConsoleLoggerFactory) {
+    std::unique_ptr<ConsoleLoggerFactory> factory(new ConsoleLoggerFactory);
     std::unique_ptr<Logger> logger(factory->getLogger(__FILE__));
     ASSERT_FALSE(logger->isEnabled(Logger::LEVEL_DEBUG));
     ASSERT_TRUE(logger->isEnabled(Logger::LEVEL_INFO));
     ASSERT_TRUE(logger->isEnabled(Logger::LEVEL_WARN));
     ASSERT_TRUE(logger->isEnabled(Logger::LEVEL_ERROR));
 
-    factory.reset(new SimpleLoggerFactory(Logger::LEVEL_DEBUG));
+    factory.reset(new ConsoleLoggerFactory(Logger::LEVEL_DEBUG));
     logger.reset(factory->getLogger(__FILE__));
     ASSERT_TRUE(logger->isEnabled(Logger::LEVEL_DEBUG));
     ASSERT_TRUE(logger->isEnabled(Logger::LEVEL_INFO));
     ASSERT_TRUE(logger->isEnabled(Logger::LEVEL_WARN));
     ASSERT_TRUE(logger->isEnabled(Logger::LEVEL_ERROR));
 
-    factory.reset(new SimpleLoggerFactory(Logger::LEVEL_WARN));
+    factory.reset(new ConsoleLoggerFactory(Logger::LEVEL_WARN));
     logger.reset(factory->getLogger(__FILE__));
     ASSERT_FALSE(logger->isEnabled(Logger::LEVEL_DEBUG));
     ASSERT_FALSE(logger->isEnabled(Logger::LEVEL_INFO));
     ASSERT_TRUE(logger->isEnabled(Logger::LEVEL_WARN));
     ASSERT_TRUE(logger->isEnabled(Logger::LEVEL_ERROR));
 
-    factory.reset(new SimpleLoggerFactory(Logger::LEVEL_ERROR));
+    factory.reset(new ConsoleLoggerFactory(Logger::LEVEL_ERROR));
     logger.reset(factory->getLogger(__FILE__));
     ASSERT_FALSE(logger->isEnabled(Logger::LEVEL_DEBUG));
     ASSERT_FALSE(logger->isEnabled(Logger::LEVEL_INFO));

Reply via email to