2020-09-04 23:57:32 +02:00
/**
* @ file logger . cpp
* @ brief cppSimpleLogger implementation
* @ author hendrik schutter
* @ date 04.09 .2020
*/
2018-10-16 23:34:45 +02:00
2020-09-04 23:57:32 +02:00
# include "logger.h"
2018-10-16 23:34:45 +02:00
using namespace std ;
2020-09-07 15:31:09 +02:00
string version = " 0.2.1 " ; //logger version
bool Logger : : instanceFlag = false ;
Logger * Logger : : single = NULL ;
2018-10-17 17:03:07 +02:00
2020-09-04 23:57:32 +02:00
/**
* \ brief create new logger instance
* \ param path to log file
* \ param struct with data
* \ return instance of Logger
*/
2020-09-07 15:31:09 +02:00
Logger : : Logger ( )
2020-09-04 23:57:32 +02:00
{
2020-09-07 15:31:09 +02:00
this - > logPath = LOG_PATH ;
2018-10-17 17:03:07 +02:00
2020-09-04 23:57:32 +02:00
writeLog ( menuLine ( ' + ' , MENU_LINE_SIZE ) ) ;
writeLog ( padStringMenu ( ' + ' , " " , MENU_LINE_SIZE ) ) ;
2020-09-07 15:31:09 +02:00
writeLog ( padStringMenu ( ' + ' , ( " Device: " + string ( DEVICE_ID ) + " -- " + string ( DESCRIPTION ) ) , MENU_LINE_SIZE ) ) ;
2020-09-04 23:57:32 +02:00
writeLog ( padStringMenu ( ' + ' , " " , MENU_LINE_SIZE ) ) ;
2020-09-07 15:31:09 +02:00
writeLog ( padStringMenu ( ' + ' , ( " Software ID: " + string ( SOFTWARE_VERSION ) + " -- Build time: " + __DATE__ + " " + __TIME__ ) , MENU_LINE_SIZE ) ) ;
2020-09-04 23:57:32 +02:00
writeLog ( padStringMenu ( ' + ' , " " , MENU_LINE_SIZE ) ) ;
2020-09-07 15:31:09 +02:00
writeLog ( padStringMenu ( ' + ' , ( " Hardware ID: " + string ( HARDWARE_VERSION ) + " -- MAC: " + getMacAddress ( ) ) , MENU_LINE_SIZE ) ) ;
2020-09-04 23:57:32 +02:00
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 ) ) ;
2018-10-17 17:03:07 +02:00
newLine ( ) ;
info ( " Created new log file " ) ;
newLine ( ) ;
}
2020-09-04 23:57:32 +02:00
/**
2020-09-07 15:31:09 +02:00
* \ brief deconstructor
* \ return void
2020-09-04 23:57:32 +02:00
*/
Logger : : ~ Logger ( )
{
2020-09-07 15:31:09 +02:00
instanceFlag = false ;
2018-10-17 17:03:07 +02:00
}
2020-09-04 23:57:32 +02:00
/**
* \ brief log info
* \ param log - text as string
* \ return void
*/
void Logger : : info ( string s )
{
2018-10-17 17:03:07 +02:00
string tmp = getTimestamp ( ) + " [INFO] " + s ;
writeLog ( tmp ) ;
}
2020-09-04 23:57:32 +02:00
/**
* \ brief log warning
* \ param log - text as string
* \ return void
*/
void Logger : : warning ( string s )
{
2018-10-17 17:03:07 +02:00
string tmp = getTimestamp ( ) + " [WARNING] " + s ;
writeLog ( tmp ) ;
}
2020-09-04 23:57:32 +02:00
/**
* \ brief log error
* \ param log - text as string
* \ return void
*/
void Logger : : error ( string s )
{
2018-10-17 17:03:07 +02:00
string tmp = getTimestamp ( ) + " [ERROR] " + s ;
writeLog ( tmp ) ;
}
2020-09-04 23:57:32 +02:00
/**
* \ brief write to log file
* \ param log as string
* \ return void
*/
void Logger : : writeLog ( string s )
{
2018-10-17 17:03:07 +02:00
ofstream logFile ;
2020-09-04 23:57:32 +02:00
Logger : : mtxLog . lock ( ) ; //lock this section for other threads
2018-10-17 17:03:07 +02:00
logFile . open ( this - > logPath , ios_base : : app ) ;
2020-09-04 23:57:32 +02:00
logFile < < ( s + " \n " ) ; //append to existing file
2018-10-17 17:03:07 +02:00
logFile . close ( ) ;
2020-09-04 23:57:32 +02:00
Logger : : mtxLog . unlock ( ) ; //unlock this section for other threads
2018-10-17 17:03:07 +02:00
}
2020-09-04 23:57:32 +02:00
/**
* \ brief write new line to log file
* \ return void
*/
void Logger : : newLine ( )
{
2018-10-17 17:03:07 +02:00
writeLog ( " " ) ;
}
2020-09-04 23:57:32 +02:00
/**
* \ brief get timestamp ( system time ) as string
* \ param void
* \ return string timestamp ( formatted )
*/
string Logger : : getTimestamp ( )
{
2018-10-17 17:03:07 +02:00
struct tm * timeinfo ;
2020-09-04 23:57:32 +02:00
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 ) ;
2018-10-17 17:03:07 +02:00
return buffer ;
}
2020-09-04 23:57:32 +02:00
/**
* \ brief get MAC address ( system first eth0 interface ) as string
* \ param void
* \ return string MAC address ( formatted )
*/
2018-10-17 17:03:07 +02:00
string Logger : : getMacAddress ( )
{
struct ifreq ifr ;
2020-09-04 23:57:32 +02:00
int s = socket ( AF_INET , SOCK_STREAM , 0 ) ;
2018-10-17 17:03:07 +02:00
strcpy ( ifr . ifr_name , " eth0 " ) ;
2020-09-04 23:57:32 +02:00
if ( ioctl ( s , SIOCGIFHWADDR , & ifr ) < 0 )
{
strcpy ( ifr . ifr_name , " eno1 " ) ;
2018-10-17 17:03:07 +02:00
}
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 ;
2020-09-04 23:57:32 +02:00
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 ) ;
2018-10-17 17:03:07 +02:00
2020-09-04 23:57:32 +02:00
for ( uint8_t i = 0 ; i < u8Padding ; i + + )
{
result . append ( " " ) ;
}
2018-10-17 17:03:07 +02:00
2020-09-04 23:57:32 +02:00
result . append ( text ) ;
2018-10-17 17:03:07 +02:00
2020-09-04 23:57:32 +02:00
while ( ( uint8_t ) result . length ( ) < ( u8LineLenght - 1 ) )
{
result . append ( " " ) ;
}
result . append ( string ( 1 , cBorder ) ) ;
return result ;
2018-10-17 17:03:07 +02:00
}
2020-09-04 23:57:32 +02:00
/**
* \ 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 ) ;
2018-10-17 17:03:07 +02:00
2020-09-04 23:57:32 +02:00
while ( ( uint8_t ) result . length ( ) < u8LineLenght )
{
result . append ( string ( 1 , cBorder ) ) ;
}
return result ;
}
2018-10-17 17:03:07 +02:00
2020-09-07 15:31:09 +02:00
/**
* \ 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
}
}
2018-10-17 17:03:07 +02:00