diff --git a/authplugin.cpp b/authplugin.cpp index 60e8e86..882364f 100644 --- a/authplugin.cpp +++ b/authplugin.cpp @@ -50,7 +50,7 @@ void AuthPlugin::loadPlugin(const std::string &pathToSoFile) if (pathToSoFile.empty()) return; - logger->logf(LOG_INFO, "Loading auth plugin %s", pathToSoFile.c_str()); + logger->logf(LOG_NOTICE, "Loading auth plugin %s", pathToSoFile.c_str()); initialized = false; wanted = true; diff --git a/configfileparser.cpp b/configfileparser.cpp index b170d43..8a152dd 100644 --- a/configfileparser.cpp +++ b/configfileparser.cpp @@ -66,6 +66,8 @@ ConfigFileParser::ConfigFileParser(const std::string &path) : validKeys.insert("auth_plugin_serialize_auth_checks"); validKeys.insert("client_initial_buffer_size"); validKeys.insert("max_packet_size"); + validKeys.insert("log_debug"); + validKeys.insert("log_subscriptions"); validListenKeys.insert("port"); validListenKeys.insert("protocol"); @@ -303,6 +305,18 @@ void ConfigFileParser::loadFile(bool test) } tmpSettings->maxPacketSize = newVal; } + + if (key == "log_debug") + { + bool tmp = stringTruthiness(value); + tmpSettings->logDebug = tmp; + } + + if (key == "log_subscriptions") + { + bool tmp = stringTruthiness(value); + tmpSettings->logSubscriptions = tmp; + } } } catch (std::invalid_argument &ex) // catch for the stoi() diff --git a/iowrapper.cpp b/iowrapper.cpp index d882e69..33a11f0 100644 --- a/iowrapper.cpp +++ b/iowrapper.cpp @@ -265,7 +265,7 @@ ssize_t IoWrapper::writeOrSslWrite(int fd, const void *buf, size_t nbytes, IoWra unsigned long error_code = ERR_get_error(); if (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE) { - logger->logf(LOG_DEBUG, "Write is incomplete: %d", err); + logger->logf(LOG_DEBUG, "SSL Write is incomplete: %d. Will be retried later.", err); *error = IoWrapResult::Wouldblock; IncompleteSslWrite sslAction(buf_, nbytes_); this->incompleteSslWrite = sslAction; diff --git a/logger.cpp b/logger.cpp index 7b066cb..cadbca0 100644 --- a/logger.cpp +++ b/logger.cpp @@ -81,9 +81,24 @@ void Logger::setLogPath(const std::string &path) Logger::logPath = path; } +void Logger::setFlags(bool logDebug, bool logSubscriptions) +{ + std::lock_guard locker(logMutex); + + if (logDebug) + curLogLevel |= LOG_DEBUG; + else + curLogLevel &= ~LOG_DEBUG; + + if (logSubscriptions) + curLogLevel |= (LOG_UNSUBSCRIBE & LOG_SUBSCRIBE); + else + curLogLevel &= ~(LOG_UNSUBSCRIBE & LOG_SUBSCRIBE); +} + void Logger::logf(int level, const char *str, va_list valist) { - if (level > curLogLevel) // TODO: wrong: bitmap based + if ((level & curLogLevel) == 0) return; std::lock_guard locker(logMutex); diff --git a/logger.h b/logger.h index 6f167bc..5f5ec79 100644 --- a/logger.h +++ b/logger.h @@ -6,12 +6,15 @@ #include // Compatible with Mosquitto, for auth plugin compatability. +// Can be OR'ed together. #define LOG_NONE 0x00 #define LOG_INFO 0x01 #define LOG_NOTICE 0x02 #define LOG_WARNING 0x04 #define LOG_ERR 0x08 #define LOG_DEBUG 0x10 +#define LOG_SUBSCRIBE 0x20 +#define LOG_UNSUBSCRIBE 0x40 int logSslError(const char *str, size_t len, void *u); @@ -19,7 +22,7 @@ class Logger { static Logger *instance; static std::string logPath; - int curLogLevel = LOG_DEBUG; + int curLogLevel = LOG_ERR | LOG_WARNING | LOG_NOTICE | LOG_INFO | LOG_SUBSCRIBE | LOG_UNSUBSCRIBE ; std::mutex logMutex; FILE *file = nullptr; bool alsoLogToStd = true; @@ -35,6 +38,7 @@ public: void noLongerLogToStd(); void setLogPath(const std::string &path); + void setFlags(bool logDebug, bool logSubscriptions); }; diff --git a/main.cpp b/main.cpp index fd289d3..34f3cf7 100644 --- a/main.cpp +++ b/main.cpp @@ -40,7 +40,7 @@ int register_signal_handers() if (sigaction(SIGHUP, &sa, nullptr) != 0 || sigaction(SIGTERM, &sa, nullptr) != 0 || sigaction(SIGINT, &sa, nullptr) != 0) { Logger *logger = Logger::getInstance(); - logger->logf(LOG_INFO, "Error registering signal handlers"); + logger->logf(LOG_ERR, "Error registering signal handlers"); return -1; } diff --git a/mainapp.cpp b/mainapp.cpp index c659b44..5911b6c 100644 --- a/mainapp.cpp +++ b/mainapp.cpp @@ -585,6 +585,7 @@ void MainApp::loadConfig() logger->setLogPath(settings->logPath); logger->reOpen(); + logger->setFlags(settings->logDebug, settings->logSubscriptions); setlimits(1000000); diff --git a/mqttpacket.cpp b/mqttpacket.cpp index 5f19148..967d40e 100644 --- a/mqttpacket.cpp +++ b/mqttpacket.cpp @@ -360,7 +360,7 @@ void MqttPacket::handleSubscribe() if (qos > 2) throw ProtocolError("QoS is greater than 2, and/or reserved bytes in QoS field are not 0."); - logger->logf(LOG_INFO, "Client '%s' subscribed to '%s'", sender->repr().c_str(), topic.c_str()); + logger->logf(LOG_SUBSCRIBE, "Client '%s' subscribed to '%s'", sender->repr().c_str(), topic.c_str()); sender->getThreadData()->getSubscriptionStore()->addSubscription(sender, topic, qos); subs_reponse_codes.push_back(qos); } @@ -388,7 +388,7 @@ void MqttPacket::handleUnsubscribe() throw ProtocolError("Subscribe topic not valid UTF-8."); sender->getThreadData()->getSubscriptionStore()->removeSubscription(sender, topic); - logger->logf(LOG_INFO, "Client '%s' unsubscribed to '%s'", sender->repr().c_str(), topic.c_str()); + logger->logf(LOG_UNSUBSCRIBE, "Client '%s' unsubscribed from '%s'", sender->repr().c_str(), topic.c_str()); } UnsubAck unsubAck(packet_id); diff --git a/settings.h b/settings.h index f1b8e00..0f05f65 100644 --- a/settings.h +++ b/settings.h @@ -23,6 +23,8 @@ public: bool authPluginSerializeAuthChecks = false; int clientInitialBufferSize = 1024; // Must be power of 2 int maxPacketSize = 268435461; // 256 MB + 5 + bool logDebug = false; + bool logSubscriptions = false; std::list> listeners; // Default one is created later, when none are defined. AuthOptCompatWrap &getAuthOptsCompat();