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