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
|
---|