added multithreding and milliseconds
This commit is contained in:
		@ -1,36 +1,38 @@
 | 
			
		||||
/**
 | 
			
		||||
 * @file    MainExample.cpp
 | 
			
		||||
 * @brief   example using logger
 | 
			
		||||
 * @author  hendrik schutter
 | 
			
		||||
 * @date    04.09.2020
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#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";
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1,2 +1,5 @@
 | 
			
		||||
# cppSimpleLogger
 | 
			
		||||
 | 
			
		||||
## build example
 | 
			
		||||
 | 
			
		||||
clear && g++ -Wall logger.cpp MainExample.cpp -o myTest && ./myTest
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										217
									
								
								logger.cpp
									
									
									
									
									
								
							
							
						
						
									
										217
									
								
								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;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										40
									
								
								logger.h
									
									
									
									
									
								
							
							
						
						
									
										40
									
								
								logger.h
									
									
									
									
									
								
							@ -1,3 +1,10 @@
 | 
			
		||||
/**
 | 
			
		||||
 * @file    logger.h
 | 
			
		||||
 * @brief   cppSimpleLogger Header
 | 
			
		||||
 * @author  hendrik schutter
 | 
			
		||||
 * @date    04.09.2020
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <time.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <iostream>
 | 
			
		||||
@ -12,35 +19,32 @@
 | 
			
		||||
#include <fcntl.h>
 | 
			
		||||
#include <net/if.h>
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#include <sys/time.h>
 | 
			
		||||
#include <math.h>
 | 
			
		||||
#include <mutex>
 | 
			
		||||
 | 
			
		||||
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();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user