| 1 | /// ----------------------------------------*- mode: C++; -*--
|
---|
| 2 | /// @file logfile.cpp
|
---|
| 3 | /// Implementation of a logging stream
|
---|
| 4 | /// ----------------------------------------------------------
|
---|
| 5 | /// $Id: logfile.cpp 2549 2007-04-02 22:17:37Z bless $
|
---|
| 6 | /// $HeadURL: https://svn.ipv6.tm.uka.de/nsis/protlib/trunk/src/logfile.cpp $
|
---|
| 7 | // ===========================================================
|
---|
| 8 | //
|
---|
| 9 | // Copyright (C) 2005-2007, all rights reserved by
|
---|
| 10 | // - Institute of Telematics, Universitaet Karlsruhe (TH)
|
---|
| 11 | //
|
---|
| 12 | // More information and contact:
|
---|
| 13 | // https://projekte.tm.uka.de/trac/NSIS
|
---|
| 14 | //
|
---|
| 15 | // This program is free software; you can redistribute it and/or modify
|
---|
| 16 | // it under the terms of the GNU General Public License as published by
|
---|
| 17 | // the Free Software Foundation; version 2 of the License
|
---|
| 18 | //
|
---|
| 19 | // This program is distributed in the hope that it will be useful,
|
---|
| 20 | // but WITHOUT ANY WARRANTY; without even the implied warranty of
|
---|
| 21 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
---|
| 22 | // GNU General Public License for more details.
|
---|
| 23 | //
|
---|
| 24 | // You should have received a copy of the GNU General Public License along
|
---|
| 25 | // with this program; if not, write to the Free Software Foundation, Inc.,
|
---|
| 26 | // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
---|
| 27 | //
|
---|
| 28 | // ===========================================================
|
---|
| 29 | #include "logfile.h"
|
---|
| 30 | #include <iostream>
|
---|
| 31 | #include <iomanip>
|
---|
| 32 | #include <new>
|
---|
| 33 |
|
---|
| 34 | #include <time.h>
|
---|
| 35 | #include <sys/time.h> // gettimeofday
|
---|
| 36 |
|
---|
| 37 | namespace protlib {
|
---|
| 38 |
|
---|
| 39 | using namespace std;
|
---|
| 40 |
|
---|
| 41 | namespace log {
|
---|
| 42 |
|
---|
| 43 | const char *const ANSIcolorcode[]= {
|
---|
| 44 | "[0m", // clear, off; reset; clears all colors and styles (to white on black)
|
---|
| 45 | "[1m", // bold_on
|
---|
| 46 | "[3m", // italics_on
|
---|
| 47 | "[4m", // underline_on
|
---|
| 48 | "[7m", // inverse_on
|
---|
| 49 | "[9m", // strikethrough_on
|
---|
| 50 | "[22m", // bold_off
|
---|
| 51 | "[23m", // italics_off
|
---|
| 52 | "[24m", // underline_off
|
---|
| 53 | "[27m", // inverse_off
|
---|
| 54 | "[29m", // strikethrough_off
|
---|
| 55 | "[30m", // black
|
---|
| 56 | "[31m", // red
|
---|
| 57 | "[32m", // green
|
---|
| 58 | "[33m", // yellow
|
---|
| 59 | "[34m", // blue
|
---|
| 60 | "[35m", // magenta
|
---|
| 61 | "[36m", // cyan
|
---|
| 62 | "[37m", // white
|
---|
| 63 | "[39m", // default
|
---|
| 64 | "[40m", // bg_black
|
---|
| 65 | "[41m", // bg_red
|
---|
| 66 | "[42m", // bg_green
|
---|
| 67 | "[43m", // bg_yellow
|
---|
| 68 | "[44m", // bg_blue
|
---|
| 69 | "[45m", // bg_magenta
|
---|
| 70 | "[46m", // bg_cyan
|
---|
| 71 | "[47m", // bg_white
|
---|
| 72 | "[49m" // bg_default
|
---|
| 73 | };
|
---|
| 74 |
|
---|
| 75 | const char* color[num_colors+1];
|
---|
| 76 |
|
---|
| 77 | const char *const logclass_str[]=
|
---|
| 78 | {
|
---|
| 79 | " ZERO ",
|
---|
| 80 | "*ERROR*",
|
---|
| 81 | "WARNING",
|
---|
| 82 | " EVENT ",
|
---|
| 83 | " INFO ",
|
---|
| 84 | " DEBUG ",
|
---|
| 85 | " EXPERT"
|
---|
| 86 | };
|
---|
| 87 |
|
---|
| 88 |
|
---|
| 89 | const char *const logseveritylevel_str[]=
|
---|
| 90 | {
|
---|
| 91 | "EMERG ",
|
---|
| 92 | "ALERT ",
|
---|
| 93 | "CRITIC",
|
---|
| 94 | "LEVEL3",
|
---|
| 95 | "NORMAL",
|
---|
| 96 | "LEVEL5",
|
---|
| 97 | "LEVEL6",
|
---|
| 98 | "LEVEL7",
|
---|
| 99 | "UNIMP ",
|
---|
| 100 | "LEVEL9",
|
---|
| 101 | "LEVELA",
|
---|
| 102 | "LEVELB",
|
---|
| 103 | "LEVELC",
|
---|
| 104 | "LEVELD",
|
---|
| 105 | "LEVELE",
|
---|
| 106 | "-ALL- "
|
---|
| 107 | };
|
---|
| 108 |
|
---|
| 109 |
|
---|
| 110 | /** set logging destination to new filename
|
---|
| 111 | * @return true if logfile could be opened for given name
|
---|
| 112 | */
|
---|
| 113 | bool
|
---|
| 114 | logfile::set_dest(const char* filename, bool quiet)
|
---|
| 115 | {
|
---|
| 116 | // lock everything
|
---|
| 117 | pthread_mutex_lock(&logmutex);
|
---|
| 118 |
|
---|
| 119 | if (logstream && !quiet)
|
---|
| 120 | {
|
---|
| 121 | (*logstream) << color[blue] << timenow() << '[' << getpid() << "] Redirecting Log output to \"" << filename << '\"' << endl;
|
---|
| 122 | (*logstream) << color[blue] << timenow()
|
---|
| 123 | << '[' << getpid() << "] <<<<<<<<<<<<<<<<<<<<<<<< *** LOG STOP *** <<<<<<<<<<<<<<<<<<<<<<<<"
|
---|
| 124 | << color[off] << endl;
|
---|
| 125 | }
|
---|
| 126 |
|
---|
| 127 | // delete old stream
|
---|
| 128 | if (logstream!= &cout)
|
---|
| 129 | delete logstream;
|
---|
| 130 |
|
---|
| 131 | // allocate new stream
|
---|
| 132 | if (strlen(filename))
|
---|
| 133 | logstream= new(nothrow) ofstream(filename);
|
---|
| 134 | else
|
---|
| 135 | logstream= &cout;
|
---|
| 136 |
|
---|
| 137 | pthread_mutex_unlock(&logmutex);
|
---|
| 138 |
|
---|
| 139 | if (!logstream)
|
---|
| 140 | {
|
---|
| 141 | cerr << "Could not open logfile " << filename << endl;
|
---|
| 142 | return false;
|
---|
| 143 | }
|
---|
| 144 | else
|
---|
| 145 | {
|
---|
| 146 | (*logstream) << color[blue] << timenow()
|
---|
| 147 | << '[' << getpid() << "] >>>>>>>>>>>>>>>>>>>>>>>> *** LOG START *** >>>>>>>>>>>>>>>>>>>>>>>>"
|
---|
| 148 | << color[off] << endl;
|
---|
| 149 | }
|
---|
| 150 | return true;
|
---|
| 151 | }
|
---|
| 152 |
|
---|
| 153 |
|
---|
| 154 | ostream&
|
---|
| 155 | logfile::logstart(logclass_t logclass, loglevel_t severity_level,
|
---|
| 156 | const string& modname,
|
---|
| 157 | const char* file,
|
---|
| 158 | const char* func,
|
---|
| 159 | int line)
|
---|
| 160 | {
|
---|
| 161 | // lock logstream for writing, must be unlocked by logfile.end()
|
---|
| 162 | int mtxlck_ret= 0;
|
---|
| 163 | if ( (mtxlck_ret= pthread_mutex_lock(&logmutex)) )
|
---|
| 164 | {
|
---|
| 165 | cerr << color[red] << "logfile::logstart() ERROR while locking mutex - return code:" << mtxlck_ret << "/" << strerror(mtxlck_ret) << endl;
|
---|
| 166 | }
|
---|
| 167 |
|
---|
| 168 | if ( logstream )
|
---|
| 169 | {
|
---|
| 170 | (*logstream) << (logclass==ERROR_LOG ? color[bold_on] : "")
|
---|
| 171 | << (logclass==WARNING_LOG ? color[magenta] :
|
---|
| 172 | (logclass==ERROR_LOG ? color[red] : color[off])
|
---|
| 173 | )
|
---|
| 174 | << timenow()
|
---|
| 175 | << '-' << getpid() << (logclass!=ERROR_LOG ? '-' : '*')
|
---|
| 176 | << color[bold_on] << logclass_str[logclass>>4] << (logclass==ERROR_LOG ? color[bold_on] : color[bold_off])
|
---|
| 177 | << (logclass!=ERROR_LOG ? '/' : '*') << hex << severity_level << dec
|
---|
| 178 | << ": " << color[bold_on] << left << setfill(' ') << setw(15) << modname << color[bold_off] << right << " " << color[off];
|
---|
| 179 | }
|
---|
| 180 |
|
---|
| 181 | return (*logstream);
|
---|
| 182 | }
|
---|
| 183 |
|
---|
| 184 |
|
---|
| 185 | } // end namespace log
|
---|
| 186 |
|
---|
| 187 | } // end namespace protlib
|
---|