Commit 84738f568d9723e7ee720b775e7568cf7d4d01b7

Authored by Peter M. Groen
1 parent 25b0d2f8

Setting up the logger

include/log.h
... ... @@ -195,6 +195,16 @@ private:
195 195 static std::string fileinfoMessage(const char* file, int line,
196 196 const std::string &message);
197 197  
  198 + /**
  199 + * @brief Replace the characters in a std::string with other characters.
  200 + * @param strToReplace The string we want to replace characters in
  201 + * @param from_chars The characters we want to replace
  202 + * @param to_chars The characters we want to replace with.
  203 + * @return strToReplace This is the original string with the replaced characters.
  204 + */
  205 + static void ReplaceAll( std::string &strToReplace, const std::string& from_chars, const std::string& to_chars );
  206 +
  207 +
198 208 //! The main context.
199 209 static std::string s_context;
200 210  
... ...
include/threadcontext.h
... ... @@ -45,10 +45,16 @@ class ThreadContext
45 45 public:
46 46 static ThreadContext& instance();
47 47  
  48 + const std::string& context() const
  49 + {
  50 + return m_context;
  51 + }
  52 +
  53 +private:
48 54 /**
49   - * @briefReturn the thread context.
  55 + * @brief Set the thread context.
50 56 */
51   - void setContext( const std::string &contextString)
  57 + void setContext( const std::string &contextString )
52 58 {
53 59 m_context = contextString;
54 60 }
... ...
src/log.cpp
1 1 #include "log.h"
2 2  
3   -// std
4   -
  3 +#include "threadcontext.h"
5 4  
  5 +// std
  6 +#include <ios>
  7 +#include <iomanip>
  8 +#include <sstream>
  9 +#include <syslog.h>
  10 +#include <sys/types.h>
  11 +#include <thread>
  12 +#include <unistd.h>
6 13  
7 14 using namespace osdev::components::mqtt;
8 15  
... ... @@ -63,8 +70,39 @@ void Log::log( const std::string &amp;category, const std::string &amp;message, LogLevel
63 70 else
64 71 {
65 72 // Replace % signs
66   - logMessage.replace( '%', "%%");
  73 + ReplaceAll( logMessage, "%", "%%" );
67 74 }
68 75  
69 76 writeLog( logCategory, logMessage, level );
70 77 }
  78 +
  79 +void Log::writeLog(const std::string &category, const std::string &message, LogLevel level)
  80 +{
  81 + if( s_fileName.empty() )
  82 + {
  83 + (void)level;
  84 + // To be implemented.
  85 + return;
  86 + }
  87 + else
  88 + {
  89 + setlogmask( LOG_UPTO( LOG_NOTICE ) );
  90 + openlog( category.c_str(), LOG_CONS | LOG_PID | LOG_NDELAY, LOG_LOCAL1 );
  91 +
  92 + syslog( LOG_NOTICE, "%s", message.c_str() );
  93 +
  94 + closelog();
  95 + }
  96 +}
  97 +
  98 +void Log::ReplaceAll( std::string &strToReplace,
  99 + const std::string& from_chars,
  100 + const std::string& to_chars )
  101 +{
  102 + size_t start_pos = 0;
  103 + while( ( start_pos = strToReplace.find( from_chars, start_pos ) ) != std::string::npos )
  104 + {
  105 + strToReplace.replace( start_pos, from_chars.length(), to_chars );
  106 + start_pos += to_chars.length(); // Handles case where 'to' is a substring of 'from'
  107 + }
  108 +}
... ...
src/mqttclient.cpp
... ... @@ -26,8 +26,7 @@
26 26 #include "mqttutil.h"
27 27 #include "mqttidgenerator.h"
28 28 #include "mqtttypeconverter.h"
29   -
30   -// mlogic::common
  29 +#include "log.h"
31 30 #include "lockguard.h"
32 31 #include "uriparser.h"
33 32  
... ... @@ -63,28 +62,31 @@ MqttClient::MqttClient(const std::string&amp; _clientId, const std::function&lt;void(co
63 62 , m_principalClient()
64 63 , m_additionalClients()
65 64 , m_eventQueue(_clientId)
66   - , m_workerThread(std::thread(&MqttClient::eventHandler, this))
  65 + , m_workerThread( std::thread( &MqttClient::eventHandler, this ) )
67 66 {
  67 + // Initialize the logger.
  68 + Log::init( "mqtt-cpp", "", LogLevel::Info );
68 69 }
69 70  
70 71 MqttClient::~MqttClient()
71 72 {
72   - // DebugLogToFIle ("MqttClient", "%1 - dtor", m_clientId);
  73 + LogDebug( "MqttClient", std::string( m_clientId + " - disconnect" ) );
73 74 {
74   - // DebugLogToFIle ("MqttClient", "%1 - disconnect", m_clientId);
  75 + LogDebug( "MqttClient", std::string( m_clientId + " - disconnect" ) );
75 76 this->disconnect();
76 77 decltype(m_principalClient) principalClient{};
77 78  
78 79 OSDEV_COMPONENTS_LOCKGUARD(m_internalMutex);
79   - // DebugLogToFIle ("MqttClient", "%1 - cleanup principal client", m_clientId);
  80 + LogDebug( "MqttClient", std::string( m_clientId + " - cleanup principal client" ) );
80 81 m_principalClient.swap(principalClient);
81 82 }
82   - // DebugLogToFIle ("MqttClient", "%1 - dtor stop queue", m_clientId);
  83 +
  84 + LogDebug( "MqttClient", std::string( m_clientId + " - dtor stop queue" ) );
83 85 m_eventQueue.stop();
84 86 if (m_workerThread.joinable()) {
85 87 m_workerThread.join();
86 88 }
87   - // DebugLogToFIle ("MqttClient", "%1 - dtor ready", m_clientId);
  89 + LogDebug( "MqttClient", std::string( m_clientId + " - dtor ready" ) );
88 90 }
89 91  
90 92 std::string MqttClient::clientId() const
... ... @@ -135,7 +137,8 @@ void MqttClient::connect(const std::string&amp; host, int port, const Credentials&amp; c
135 137  
136 138 void MqttClient::connect(const std::string& _endpoint)
137 139 {
138   - // InfoLogToFIle ("MqttClient", "%1 - Request connect", m_clientId);
  140 + LogInfo( "MqttClient", std::string( m_clientId + " - Request connect" ) );
  141 +
139 142 OSDEV_COMPONENTS_LOCKGUARD(m_interfaceMutex);
140 143 IMqttClientImpl* client(nullptr);
141 144 {
... ... @@ -148,8 +151,8 @@ void MqttClient::connect(const std::string&amp; _endpoint)
148 151 }
149 152 else
150 153 {
151   - // ErrorLogToFIle ("MqttClient", "%1 - Cannot connect to different endpoint. Disconnect first.", m_clientId);
152   - // Normally a throw (Yuck!) (MqttException, "Cannot connect while already connected");
  154 + LogError( "MqttClient", std::string( m_clientId + " - Cannot connect to different endpoint. Disconnect first." ) );
  155 + return;
153 156 }
154 157 }
155 158 m_endpoint = _endpoint;
... ... @@ -168,26 +171,31 @@ void MqttClient::connect(const std::string&amp; _endpoint)
168 171  
169 172 void MqttClient::disconnect()
170 173 {
171   - // InfoLogToFIle ("MqttClient", "%1 - Request disconnect", m_clientId);
  174 + LogInfo( "MqttClient", std::string( m_clientId + " - Request disconnect" ) );
172 175 OSDEV_COMPONENTS_LOCKGUARD(m_interfaceMutex);
173 176  
174 177 decltype(m_additionalClients) additionalClients{};
175 178 std::vector<IMqttClientImpl*> clients{};
176 179 {
177 180 OSDEV_COMPONENTS_LOCKGUARD(m_internalMutex);
178   - if (!m_principalClient || m_principalClient->connectionStatus() == ConnectionStatus::Disconnected || m_principalClient->connectionStatus() == ConnectionStatus::DisconnectInProgress) {
  181 + if (!m_principalClient || m_principalClient->connectionStatus() == ConnectionStatus::Disconnected || m_principalClient->connectionStatus() == ConnectionStatus::DisconnectInProgress)
  182 + {
179 183 return;
180 184 }
181   - m_additionalClients.swap(additionalClients);
  185 + m_additionalClients.swap( additionalClients );
182 186  
183   - for (const auto& c : additionalClients) {
184   - clients.push_back(c.get());
  187 + for (const auto& c : additionalClients)
  188 + {
  189 + clients.push_back( c.get() );
185 190 }
186   - clients.push_back(m_principalClient.get());
  191 + clients.push_back( m_principalClient.get() );
187 192 }
188 193  
  194 +
  195 + LogDebug( "MqttClient", std::string( m_clientId + " - Unsubscribe and disconnect clients" ) );
189 196 // DebugLogToFIle ("MqttClient", "%1 - Unsubscribe and disconnect clients", m_clientId);
190   - for (auto& cl : clients) {
  197 + for ( auto& cl : clients )
  198 + {
191 199 cl->unsubscribeAll();
192 200 }
193 201 this->waitForCompletionInternal(clients, std::chrono::milliseconds(2000), std::set<Token>{});
... ...