Compare commits

...

2 Commits

Author SHA1 Message Date
Hendrik Schutter f14919ed5d changed to singelton 2020-09-07 15:31:09 +02:00
Hendrik Schutter 48c76b5efd added multithreding and milliseconds 2020-09-04 23:57:32 +02:00
6 changed files with 254 additions and 113 deletions

View File

@ -1,36 +1,29 @@
/**
* @file MainExample.cpp
* @brief example using logger
* @author hendrik schutter
* @date 04.09.2020
*/
#include <stdio.h> #include <stdio.h>
#include "logger.h" #include "logger.h"
using namespace std; using namespace std;
/**
// g++ -Wall -o myTest myTest.cpp libftpclient.a -lcurl * \brief application entry point
* \param void
* \return int
*/
int main(void) int main(void)
{ {
cout << "Hello World!\n"; cout << "Hello World!\n";
//CFTPClient* ftp = new CFTPClient(PRINT_LOG); Logger::logThis()->info("Alle Systeme laufen!"); //demo
usleep(1465);
struct sID id; Logger::logThis()->warning("Alle Systeme laufen!"); //demo
usleep(51654);
id.description = "CCTV_Radar © CopterSicht 2018"; Logger::logThis()->error("Alle Systeme laufen!"); //demo
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!");
cout << "bye!\n"; cout << "bye!\n";

View File

@ -1,2 +1,5 @@
# cppSimpleLogger # cppSimpleLogger
## build example
rm -f test.txt && clear && g++ -Wall logger.cpp MainExample.cpp -o myTest && ./myTest

View File

@ -1,125 +1,233 @@
/**
* @file logger.cpp
* @brief cppSimpleLogger implementation
* @author hendrik schutter
* @date 04.09.2020
*/
#include "logger.h" #include "logger.h"
using namespace std; using namespace std;
string version = "0.1"; string version = "0.2.1"; //logger version
Logger::Logger(string pLogPath,struct sID id) { bool Logger::instanceFlag = false;
this->logPath =pLogPath; Logger* Logger::single = NULL;
writeLog("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"); /**
writeLog("+ +"); * \brief create new logger instance
writeLog("+ Device: " + id.deviceID + " -- " + id.description + " +"); * \param path to log file
writeLog("+ +"); * \param struct with data
writeLog("+ Software ID: " + id.softwareID + " -- Build time: " + __DATE__ + " " + __TIME__ + " +"); * \return instance of Logger
writeLog("+ +"); */
writeLog("+ Hardware ID: " + id.hardwareID + " -- MAC: " + getMacAddress() + " +"); Logger::Logger()
writeLog("+ +"); {
writeLog("+ cppSimpleLogger -- available from https://git.mosad.xyz/localhorst/cppSimpleLogger -- Version: " + version + " +"); this->logPath = LOG_PATH;
writeLog("+ +");
writeLog("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"); writeLog(menuLine('+', MENU_LINE_SIZE));
writeLog(padStringMenu('+', " ", MENU_LINE_SIZE));
writeLog(padStringMenu('+', ("Device: " + string(DEVICE_ID) + " -- " + string(DESCRIPTION)), MENU_LINE_SIZE));
writeLog(padStringMenu('+', " ", MENU_LINE_SIZE));
writeLog(padStringMenu('+', ("Software ID: " + string(SOFTWARE_VERSION) + " -- Build time: " + __DATE__ + " " + __TIME__), MENU_LINE_SIZE));
writeLog(padStringMenu('+', " ", MENU_LINE_SIZE));
writeLog(padStringMenu('+', ("Hardware ID: " + string(HARDWARE_VERSION) + " -- 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(); newLine();
info("Created new log file"); info("Created new log file");
newLine(); newLine();
} }
/**
Logger::~Logger() { * \brief deconstructor
* \return void
*/
Logger::~Logger()
{
instanceFlag = false;
} }
/**
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; string tmp = getTimestamp() + " [INFO] " + s;
writeLog(tmp); 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; string tmp = getTimestamp() + " [WARNING] " + s;
writeLog(tmp); 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; string tmp = getTimestamp() + " [ERROR] " + s;
writeLog(tmp); 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; ofstream logFile;
Logger::mtxLog.lock(); //lock this section for other threads
logFile.open(this->logPath, ios_base::app); logFile.open(this->logPath, ios_base::app);
logFile << (s + "\n"); logFile << (s + "\n"); //append to existing file
logFile.close(); 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(" "); writeLog(" ");
} }
/**
string Logger::getTimestamp() { * \brief get timestamp (system time) as string
time_t rawtime; * \param void
* \return string timestamp (formatted)
*/
string Logger::getTimestamp()
{
struct tm * timeinfo; struct tm * timeinfo;
char buffer [80]; struct timeval tv;
time (&rawtime); int millisec;
timeinfo = localtime (&rawtime); char cpDate [80];
strftime (buffer,80,"%d/%m/%Y %T",timeinfo); 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; return buffer;
} }
/**
* \brief get MAC address (system first eth0 interface) as string
* \param void
* \return string MAC address (formatted)
*/
string Logger::getMacAddress() string Logger::getMacAddress()
{ {
struct ifreq ifr; struct ifreq ifr;
int s; int s = socket(AF_INET, SOCK_STREAM,0);
if ((s = socket(AF_INET, SOCK_STREAM,0)) < 0) {
//perror("socket");
//return -1;
}
strcpy(ifr.ifr_name, "eth0"); strcpy(ifr.ifr_name, "eth0");
if (ioctl(s, SIOCGIFHWADDR, &ifr) < 0) { if (ioctl(s, SIOCGIFHWADDR, &ifr) < 0)
//perror("ioctl"); {
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; unsigned char *hwaddr = (unsigned char *)ifr.ifr_hwaddr.sa_data;
char buffer [80]; char buffer [80];
sprintf(buffer,"%02X:%02X:%02X:%02X:%02X:%02X", hwaddr[0], hwaddr[1], hwaddr[2], sprintf(buffer,"%02X:%02X:%02X:%02X:%02X:%02X", hwaddr[0], hwaddr[1], hwaddr[2],
hwaddr[3], hwaddr[4], hwaddr[5]); hwaddr[3], hwaddr[4], hwaddr[5]);
close(s); close(s);
string tmp = buffer; string tmp = buffer;
//cout << tmp << endl;
return tmp; 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;
}
/**
* \brief return a instance of the logger
* \return logger obj
*/
Logger* Logger::logThis()
{
if (!instanceFlag)
{
single = new Logger(); //create new obj
instanceFlag = true;
return single;
}
else
{
return single; //return existing obj
}
}

View File

@ -1,3 +1,13 @@
/**
* @file logger.h
* @brief cppSimpleLogger Header
* @author hendrik schutter
* @date 04.09.2020
*/
#ifndef LOGGER_H_
#define LOGGER_H_
#include <time.h> #include <time.h>
#include <string.h> #include <string.h>
#include <iostream> #include <iostream>
@ -12,49 +22,59 @@
#include <fcntl.h> #include <fcntl.h>
#include <net/if.h> #include <net/if.h>
#include <unistd.h> #include <unistd.h>
#include <sys/time.h>
#include <math.h>
#include <mutex>
using namespace std; using namespace std;
#define MENU_LINE_SIZE 110 //Size of menu lines
#ifndef LOG_PATH
#define LOG_PATH "./test.txt"
#endif
struct sID { #ifndef DESCRIPTION
string description; #define DESCRIPTION "Software-Name - Copyright Company 2020" //use your values here
string deviceID; #endif
string softwareID;
string hardwareID;
} ;
#ifndef DEVICE_ID
#define DEVICE_ID "Device-Name" //use your values here
#endif
class Logger { #ifndef SOFTWARE_VERSION
#define SOFTWARE_VERSION "0.1.1.8" //use your values here
#endif
#ifndef HARDWARE_VERSION
#define HARDWARE_VERSION "7.77.9" //use your values here
#endif
class Logger
{
private: private:
string logPath; string logPath;
mutex mtxLog;
static bool instanceFlag;
static Logger *single;
string getTimestamp(); string getTimestamp();
void writeLog(string s); void writeLog(string s);
string getMacAddress(); string getMacAddress();
string padStringMenu(char cBorder, string text, uint8_t u8LineLenght);
string menuLine(char cBorder, uint8_t u8LineLenght);
Logger();
~Logger();
public: public:
Logger(string pLogPath, struct sID id);
~Logger();
void info(string s); void info(string s);
void warning(string s); void warning(string s);
void error(string s); void error(string s);
void newLine(); void newLine();
static Logger* logThis();
}; };
#endif // LOGGER_H_

BIN
myTest Executable file

Binary file not shown.

17
test.txt Normal file
View File

@ -0,0 +1,17 @@
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ +
+ Device: Device-Name -- Software-Name - Copyright Company 2020 +
+ +
+ Software ID: 0.1.1.8 -- Build time: Sep 7 2020 15:29:48 +
+ +
+ Hardware ID: 7.77.9 -- MAC: 9E:81:AE:7F:00:00 +
+ +
+ cppSimpleLogger -- available from https://git.mosad.xyz/localhorst/cppSimpleLogger -- Version: 0.2.1 +
+ +
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
07/09/2020 15:29:49.239 [INFO] Created new log file
07/09/2020 15:29:49.239 [INFO] Alle Systeme laufen!
07/09/2020 15:29:49.240 [WARNING] Alle Systeme laufen!
07/09/2020 15:29:49.292 [ERROR] Alle Systeme laufen!