From 48c76b5efd89b489dd9e313a48cabda1b91bfa03 Mon Sep 17 00:00:00 2001 From: localhorst Date: Fri, 4 Sep 2020 23:57:32 +0200 Subject: [PATCH] added multithreding and milliseconds --- MainExample.cpp | 42 +++++----- README.md | 3 + logger.cpp | 217 ++++++++++++++++++++++++++++++++++-------------- logger.h | 40 +++++---- 4 files changed, 197 insertions(+), 105 deletions(-) diff --git a/MainExample.cpp b/MainExample.cpp index 5b46d27..0ff0e98 100644 --- a/MainExample.cpp +++ b/MainExample.cpp @@ -1,36 +1,38 @@ +/** + * @file MainExample.cpp + * @brief example using logger + * @author hendrik schutter + * @date 04.09.2020 + */ + #include #include "logger.h" - using namespace std; - -// g++ -Wall -o myTest myTest.cpp libftpclient.a -lcurl - - - +/** + * \brief application entry point + * \param void + * \return int + */ int main(void) { cout << "Hello World!\n"; - //CFTPClient* ftp = new CFTPClient(PRINT_LOG); - struct sID id; - id.description = "CCTV_Radar © CopterSicht 2018"; - id.deviceID = "Camera04"; - id.softwareID = "0.1.1.8"; - id.hardwareID = "7.77.9"; - - Logger* logging = new Logger("./test.txt", id); - - logging->info("Alle Systeme laufen!"); - logging->warning("Alle Systeme laufen!"); - logging->error("Alle Systeme laufen!"); - - + id.description = "Software-Name - Copyright Company 2020"; //use your values here + id.deviceID = "Device-Name"; //use your values here + id.softwareID = "0.1.1.8"; //use your values here + id.hardwareID = "7.77.9"; //use your values here + Logger* logging = new Logger("./test.txt", id); //use your path here + logging->info("Alle Systeme laufen!"); //demo + usleep(1465); + logging->warning("Alle Systeme laufen!"); //demo + usleep(51654); + logging->error("Alle Systeme laufen!"); //demo cout << "bye!\n"; diff --git a/README.md b/README.md index 2dc6374..a53c328 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,5 @@ # cppSimpleLogger +## build example + +clear && g++ -Wall logger.cpp MainExample.cpp -o myTest && ./myTest diff --git a/logger.cpp b/logger.cpp index 3e60687..1744ad8 100644 --- a/logger.cpp +++ b/logger.cpp @@ -1,125 +1,214 @@ +/** + * @file logger.cpp + * @brief cppSimpleLogger implementation + * @author hendrik schutter + * @date 04.09.2020 + */ + #include "logger.h" - - using namespace std; -string version = "0.1"; +string version = "0.2"; //logger version -Logger::Logger(string pLogPath,struct sID id) { +/** + * \brief create new logger instance + * \param path to log file + * \param struct with data + * \return instance of Logger + */ +Logger::Logger(string pLogPath,struct sID id) +{ this->logPath =pLogPath; - writeLog("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"); - writeLog("+ +"); - writeLog("+ Device: " + id.deviceID + " -- " + id.description + " +"); - writeLog("+ +"); - writeLog("+ Software ID: " + id.softwareID + " -- Build time: " + __DATE__ + " " + __TIME__ + " +"); - writeLog("+ +"); - writeLog("+ Hardware ID: " + id.hardwareID + " -- MAC: " + getMacAddress() + " +"); - writeLog("+ +"); - writeLog("+ cppSimpleLogger -- available from https://git.mosad.xyz/localhorst/cppSimpleLogger -- Version: " + version + " +"); - writeLog("+ +"); - writeLog("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"); + writeLog(menuLine('+', MENU_LINE_SIZE)); + + writeLog(padStringMenu('+', " ", MENU_LINE_SIZE)); + + writeLog(padStringMenu('+', ("Device: " + id.deviceID + " -- " + id.description), MENU_LINE_SIZE)); + writeLog(padStringMenu('+', " ", MENU_LINE_SIZE)); + + writeLog(padStringMenu('+', ("Software ID: " + id.softwareID + " -- Build time: " + __DATE__ + " " + __TIME__), MENU_LINE_SIZE)); + writeLog(padStringMenu('+', " ", MENU_LINE_SIZE)); + + writeLog(padStringMenu('+', ("Hardware ID: " + id.hardwareID + " -- MAC: " + getMacAddress()), MENU_LINE_SIZE)); + writeLog(padStringMenu('+', " ", MENU_LINE_SIZE)); + + writeLog(padStringMenu('+', ("cppSimpleLogger -- available from https://git.mosad.xyz/localhorst/cppSimpleLogger -- Version: " + version), MENU_LINE_SIZE)); + writeLog(padStringMenu('+', " ", MENU_LINE_SIZE)); + + writeLog(menuLine('+', MENU_LINE_SIZE)); newLine(); info("Created new log file"); newLine(); } - -Logger::~Logger() { +/** + * \brief deconctructor + */ +Logger::~Logger() +{ } - -void Logger::info(string s) { +/** + * \brief log info + * \param log-text as string + * \return void + */ +void Logger::info(string s) +{ string tmp = getTimestamp() + " [INFO] " + s; writeLog(tmp); } -void Logger::warning(string s) { +/** + * \brief log warning + * \param log-text as string + * \return void + */ +void Logger::warning(string s) +{ string tmp = getTimestamp() + " [WARNING] " + s; writeLog(tmp); } -void Logger::error(string s) { +/** + * \brief log error + * \param log-text as string + * \return void + */ +void Logger::error(string s) +{ string tmp = getTimestamp() + " [ERROR] " + s; writeLog(tmp); } - -void Logger::writeLog(string s) { - - +/** + * \brief write to log file + * \param log as string + * \return void + */ +void Logger::writeLog(string s) +{ ofstream logFile; - + Logger::mtxLog.lock(); //lock this section for other threads logFile.open(this->logPath, ios_base::app); - logFile << (s + "\n"); + logFile << (s + "\n"); //append to existing file logFile.close(); - - + Logger::mtxLog.unlock(); //unlock this section for other threads } -void Logger::newLine() { - +/** + * \brief write new line to log file + * \return void + */ +void Logger::newLine() +{ writeLog(" "); - } - -string Logger::getTimestamp() { - time_t rawtime; +/** + * \brief get timestamp (system time) as string + * \param void + * \return string timestamp (formatted) + */ +string Logger::getTimestamp() +{ struct tm * timeinfo; - char buffer [80]; - time (&rawtime); - timeinfo = localtime (&rawtime); - strftime (buffer,80,"%d/%m/%Y %T",timeinfo); + struct timeval tv; + int millisec; + char cpDate [80]; + char buffer [120]; + + gettimeofday(&tv, NULL); + millisec = lrint(tv.tv_usec/1000.0); // Round to nearest millisec + if (millisec>=1000) // Allow for rounding up to nearest second + { + millisec -=1000; + tv.tv_sec++; + } + timeinfo = localtime(&tv.tv_sec); + strftime (cpDate,80,"%d/%m/%Y %T",timeinfo); + sprintf(buffer, "%s.%03d", cpDate, millisec); return buffer; } +/** + * \brief get MAC address (system first eth0 interface) as string + * \param void + * \return string MAC address (formatted) + */ string Logger::getMacAddress() - { - - - struct ifreq ifr; - int s; - if ((s = socket(AF_INET, SOCK_STREAM,0)) < 0) { - //perror("socket"); - //return -1; - } + int s = socket(AF_INET, SOCK_STREAM,0); strcpy(ifr.ifr_name, "eth0"); - if (ioctl(s, SIOCGIFHWADDR, &ifr) < 0) { - //perror("ioctl"); + if (ioctl(s, SIOCGIFHWADDR, &ifr) < 0) + { + strcpy(ifr.ifr_name, "eno1"); - strcpy(ifr.ifr_name, "eno1"); - if (ioctl(s, SIOCGIFHWADDR, &ifr) < 0) { - //perror("ioctl"); - //return -1; } - } unsigned char *hwaddr = (unsigned char *)ifr.ifr_hwaddr.sa_data; - char buffer [80]; - sprintf(buffer,"%02X:%02X:%02X:%02X:%02X:%02X", hwaddr[0], hwaddr[1], hwaddr[2], hwaddr[3], hwaddr[4], hwaddr[5]); close(s); - string tmp = buffer; - - - //cout << tmp << endl; - return tmp; } +/** + * \brief format menu text in center + * \param char for border + * \param menu text + * \param size of menu line + * \return string menu line + */ +string Logger::padStringMenu(char cBorder, string text, uint8_t u8LineLenght) +{ + string result(1,cBorder); + uint8_t u8TextSize = text.length(); + uint8_t u8Padding = ((u8LineLenght-u8TextSize)/2); + + for(uint8_t i = 0 ; i < u8Padding; i++) + { + result.append(" "); + } + + result.append(text); + + while((uint8_t)result.length() < (u8LineLenght-1)) + { + + result.append(" "); + } + + result.append(string(1, cBorder)); + return result; +} + +/** + * \brief format a separator + * \param char for border + * \param size of menu line + * \return string menu line + */ +string Logger::menuLine(char cBorder, uint8_t u8LineLenght) +{ + string result(1,cBorder); + + while((uint8_t)result.length() < u8LineLenght) + { + result.append(string(1, cBorder)); + } + return result; +} + - - diff --git a/logger.h b/logger.h index d15f4e6..62c4bd0 100644 --- a/logger.h +++ b/logger.h @@ -1,3 +1,10 @@ +/** + * @file logger.h + * @brief cppSimpleLogger Header + * @author hendrik schutter + * @date 04.09.2020 + */ + #include #include #include @@ -12,35 +19,32 @@ #include #include #include - - +#include +#include +#include using namespace std; +#define MENU_LINE_SIZE 110 //Size of menu lines - -struct sID { +struct sID +{ string description; string deviceID; string softwareID; string hardwareID; -} ; - - -class Logger { - +}; +class Logger +{ private: - string logPath; - + mutex mtxLog; string getTimestamp(); void writeLog(string s); string getMacAddress(); - - - - + string padStringMenu(char cBorder, string text, uint8_t u8LineLenght); + string menuLine(char cBorder, uint8_t u8LineLenght); public: Logger(string pLogPath, struct sID id); @@ -48,13 +52,7 @@ public: void info(string s); void warning(string s); void error(string s); - void newLine(); - - - - - };