00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #include "logfile.h"
00030 #include <iostream>
00031 #include <iomanip>
00032 #include <new>
00033
00034 #include <time.h>
00035 #include <sys/time.h>
00036
00037 namespace protlib {
00038
00039 using namespace std;
00040
00041 namespace log {
00042
00043 const char *const ANSIcolorcode[]= {
00044 "[0m",
00045 "[1m",
00046 "[3m",
00047 "[4m",
00048 "[7m",
00049 "[9m",
00050 "[22m",
00051 "[23m",
00052 "[24m",
00053 "[27m",
00054 "[29m",
00055 "[30m",
00056 "[31m",
00057 "[32m",
00058 "[33m",
00059 "[34m",
00060 "[35m",
00061 "[36m",
00062 "[37m",
00063 "[39m",
00064 "[40m",
00065 "[41m",
00066 "[42m",
00067 "[43m",
00068 "[44m",
00069 "[45m",
00070 "[46m",
00071 "[47m",
00072 "[49m"
00073 };
00074
00075 const char* color[num_colors+1];
00076
00077 const char *const logclass_str[]=
00078 {
00079 " ZERO ",
00080 "*ERROR*",
00081 "WARNING",
00082 " EVENT ",
00083 " INFO ",
00084 " DEBUG ",
00085 " EXPERT"
00086 };
00087
00088
00089 const char *const logseveritylevel_str[]=
00090 {
00091 "EMERG ",
00092 "ALERT ",
00093 "CRITIC",
00094 "LEVEL3",
00095 "NORMAL",
00096 "LEVEL5",
00097 "LEVEL6",
00098 "LEVEL7",
00099 "UNIMP ",
00100 "LEVEL9",
00101 "LEVELA",
00102 "LEVELB",
00103 "LEVELC",
00104 "LEVELD",
00105 "LEVELE",
00106 "-ALL- "
00107 };
00108
00109
00113 bool
00114 logfile::set_dest(const char* filename, bool quiet)
00115 {
00116
00117 pthread_mutex_lock(&logmutex);
00118
00119 if (logstream && !quiet)
00120 {
00121
00122
00123
00124
00125 }
00126
00127
00128 if (logstream!= &cout)
00129 delete logstream;
00130
00131
00132 if (strlen(filename))
00133 logstream= new(nothrow) ofstream(filename);
00134 else
00135 logstream= &cout;
00136
00137 pthread_mutex_unlock(&logmutex);
00138
00139 if (!logstream)
00140 {
00141 cerr << "Could not open logfile " << filename << endl;
00142 return false;
00143 }
00144 else
00145 {
00146
00147
00148
00149 }
00150 return true;
00151 }
00152
00153
00154 ostream&
00155 logfile::logstart(logclass_t logclass, loglevel_t severity_level,
00156 const string& modname,
00157 const char* file,
00158 const char* func,
00159 int line)
00160 {
00161
00162 int mtxlck_ret= 0;
00163 if ( (mtxlck_ret= pthread_mutex_lock(&logmutex)) )
00164 {
00165 cerr << color[red] << "logfile::logstart() ERROR while locking mutex - return code:" << mtxlck_ret << "/" << strerror(mtxlck_ret) << endl;
00166 }
00167
00168 if ( logstream )
00169 {
00170 (*logstream) << (logclass==ERROR_LOG ? color[bold_on] : "")
00171 << (logclass==WARNING_LOG ? color[magenta] :
00172 (logclass==ERROR_LOG ? color[red] : color[off])
00173 )
00174 << timenow()
00175 << '-' << getpid() << (logclass!=ERROR_LOG ? '-' : '*')
00176 << color[bold_on] << logclass_str[logclass>>4] << (logclass==ERROR_LOG ? color[bold_on] : color[bold_off])
00177 << (logclass!=ERROR_LOG ? '/' : '*') << hex << severity_level << dec
00178 << ": " << color[bold_on] << left << setfill(' ') << setw(15) << modname << color[bold_off] << right << " " << color[off];
00179 }
00180
00181 return (*logstream);
00182 }
00183
00184
00185 }
00186
00187 }