Commit 4315fb5bfbad751700708ebd6d15e1bb833e16a5
1 parent
4ee42838
Start of simple logger
Showing
4 changed files
with
114 additions
and
0 deletions
CMakeLists.txt
FlashMQTests/FlashMQTests.pro
| ... | ... | @@ -25,6 +25,7 @@ SOURCES += tst_maintests.cpp \ |
| 25 | 25 | ../threaddata.cpp \ |
| 26 | 26 | ../types.cpp \ |
| 27 | 27 | ../utils.cpp \ |
| 28 | + ../logger.cpp \ | |
| 28 | 29 | mainappthread.cpp \ |
| 29 | 30 | twoclienttestcontext.cpp |
| 30 | 31 | |
| ... | ... | @@ -42,5 +43,6 @@ HEADERS += \ |
| 42 | 43 | ../threaddata.h \ |
| 43 | 44 | ../types.h \ |
| 44 | 45 | ../utils.h \ |
| 46 | + ../logger.h \ | |
| 45 | 47 | mainappthread.h \ |
| 46 | 48 | twoclienttestcontext.h | ... | ... |
logger.cpp
0 → 100644
| 1 | +#include "logger.h" | |
| 2 | +#include <ctime> | |
| 3 | +#include <sstream> | |
| 4 | +#include <iomanip> | |
| 5 | + | |
| 6 | +Logger *Logger::instance = nullptr; | |
| 7 | + | |
| 8 | +Logger::Logger() | |
| 9 | +{ | |
| 10 | + | |
| 11 | +} | |
| 12 | + | |
| 13 | +std::string Logger::getLogLevelString(int level) const | |
| 14 | +{ | |
| 15 | + switch (level) | |
| 16 | + { | |
| 17 | + case LOG_NONE: | |
| 18 | + return "NONE"; | |
| 19 | + case LOG_INFO: | |
| 20 | + return "INFO"; | |
| 21 | + case LOG_NOTICE: | |
| 22 | + return "NOTICE"; | |
| 23 | + case LOG_WARNING: | |
| 24 | + return "WARNING"; | |
| 25 | + case LOG_ERR: | |
| 26 | + return "ERROR"; | |
| 27 | + case LOG_DEBUG: | |
| 28 | + return "DEBUG"; | |
| 29 | + default: | |
| 30 | + return "UNKNOWN LOG LEVEL"; | |
| 31 | + } | |
| 32 | +} | |
| 33 | + | |
| 34 | +Logger *Logger::getInstance() | |
| 35 | +{ | |
| 36 | + if (instance == nullptr) | |
| 37 | + instance = new Logger(); | |
| 38 | + return instance; | |
| 39 | +} | |
| 40 | + | |
| 41 | +void Logger::logf(int level, const char *str, ...) | |
| 42 | +{ | |
| 43 | + if (level > curLogLevel) | |
| 44 | + return; | |
| 45 | + | |
| 46 | + std::lock_guard<std::mutex> locker(logMutex); | |
| 47 | + | |
| 48 | + time_t time = std::time(nullptr); | |
| 49 | + struct tm tm = *std::localtime(&time); | |
| 50 | + std::ostringstream oss; | |
| 51 | + | |
| 52 | + std::string str_(str); | |
| 53 | + oss << "[" << std::put_time(&tm, "%Y-%m-%d %H:%M:%S") << "] [" << getLogLevelString(level) << "] " << str_; | |
| 54 | + oss.flush(); | |
| 55 | + const std::string s = oss.str(); | |
| 56 | + const char *logfmtstring = s.c_str(); | |
| 57 | + | |
| 58 | + va_list valist; | |
| 59 | + va_start(valist, str); | |
| 60 | + if (this->file) | |
| 61 | + { | |
| 62 | + vfprintf(this->file, logfmtstring, valist); | |
| 63 | + fprintf(this->file, "\n"); | |
| 64 | + fflush(this->file); | |
| 65 | + } | |
| 66 | + else | |
| 67 | + { | |
| 68 | +#ifdef TESTING | |
| 69 | + vfprintf(stderr, logfmtstring, valist); // the stdout interfers with Qt test XML output, so using stderr. | |
| 70 | + fprintf(stderr, "\n"); | |
| 71 | + fflush(stderr); | |
| 72 | +#else | |
| 73 | + vfprintf(stdout, logfmtstring, valist); | |
| 74 | + fprintf(stdout, "\n"); | |
| 75 | + fflush(stdout); | |
| 76 | +#endif | |
| 77 | + } | |
| 78 | + va_end(valist); | |
| 79 | +} | ... | ... |
logger.h
0 → 100644
| 1 | +#ifndef LOGGER_H | |
| 2 | +#define LOGGER_H | |
| 3 | + | |
| 4 | +#include <stdio.h> | |
| 5 | +#include <stdarg.h> | |
| 6 | +#include <mutex> | |
| 7 | + | |
| 8 | +// Compatible with Mosquitto, for auth plugin compatability. | |
| 9 | +#define LOG_NONE 0x00 | |
| 10 | +#define LOG_INFO 0x01 | |
| 11 | +#define LOG_NOTICE 0x02 | |
| 12 | +#define LOG_WARNING 0x04 | |
| 13 | +#define LOG_ERR 0x08 | |
| 14 | +#define LOG_DEBUG 0x10 | |
| 15 | + | |
| 16 | +class Logger | |
| 17 | +{ | |
| 18 | + static Logger *instance; | |
| 19 | + int curLogLevel = LOG_DEBUG; | |
| 20 | + std::mutex logMutex; | |
| 21 | + FILE *file = nullptr; | |
| 22 | + | |
| 23 | + Logger(); | |
| 24 | + std::string getLogLevelString(int level) const; | |
| 25 | + | |
| 26 | +public: | |
| 27 | + static Logger *getInstance(); | |
| 28 | + void logf(int level, const char *str, ...); | |
| 29 | + | |
| 30 | +}; | |
| 31 | + | |
| 32 | +#endif // LOGGER_H | ... | ... |