@@ -31,41 +31,32 @@ using namespace conduit;
31
31
namespace ascent
32
32
{
33
33
34
+ // -----------------------------------------------------------------------------
35
+ // main logger instance
36
+ // -----------------------------------------------------------------------------
34
37
Logger Logger::m_instance;
35
- Logger *Logger::m_active_instance = nullptr ;
36
- std::vector<std::string> Logger::m_level_strings = {" unset" ,
37
- " debug" ,
38
- " info" ,
39
- " warn" ,
40
- " error" ,
41
- " legendary" };
42
38
43
39
// -----------------------------------------------------------------------------
44
- Logger::Scope::Scope (Logger * lgr, const std::string &name)
40
+ Logger::Scope::Scope (Logger & lgr, const std::string &name)
45
41
: m_lgr(lgr),
46
42
m_name (name)
47
43
{
48
- if (m_lgr != nullptr )
49
- {
50
- m_lgr->log_block_begin (m_name);
51
- }
44
+ m_lgr.log_block_begin (m_name);
52
45
}
53
46
54
47
// -----------------------------------------------------------------------------
55
48
Logger::Scope::~Scope ()
56
49
{
57
- if (m_lgr != nullptr )
58
- {
59
- m_lgr->log_block_end (m_name);
60
- }
50
+ m_lgr.log_block_end (m_name);
61
51
}
62
52
63
53
// -----------------------------------------------------------------------------
64
54
Logger::Logger ()
65
- : m_indent_level(0 ),
55
+ : m_log_open(false ),
56
+ m_indent_level (0 ),
66
57
m_rank(-1 ),
67
- m_level_threshold( INFO),
68
- m_echo_level_threshold(LEGENDARY )
58
+ m_log_threshold(Logger:: INFO),
59
+ m_echo_threshold(Logger::NONE )
69
60
{
70
61
m_key_counters.push (std::map<std::string,int >());
71
62
}
@@ -76,72 +67,111 @@ Logger::~Logger()
76
67
close ();
77
68
}
78
69
70
+ // -----------------------------------------------------------------------------
71
+ void
72
+ Logger::reset ()
73
+ {
74
+ m_indent_level = 0 ;
75
+ m_log_threshold = Logger::INFO;
76
+ m_echo_threshold = Logger::NONE;
77
+ // reset our stacks
78
+ m_timers = std::stack<Timer>();
79
+ m_key_counters = std::stack<std::map<std::string,int >>();
80
+ m_key_counters.push (std::map<std::string,int >());
81
+ }
82
+
79
83
// -----------------------------------------------------------------------------
80
84
void
81
85
Logger::open (const std::string &ofpattern)
82
86
{
87
+ if (is_log_open ())
88
+ {
89
+ std::string emsg = conduit_fmt::format (" [FATAL_ERROR] failed to open log with pattern: {}, logger already has {} open." ,
90
+ ofpattern, m_log_fname);
91
+ throw conduit::Error (emsg,
92
+ __FILE__,
93
+ __LINE__);
94
+ }
95
+
83
96
// multi node case, assumes file pattern includes "rank"
84
- std::string ofname;
85
97
if (rank () > -1 )
86
98
{
87
- ofname = conduit_fmt::format (ofpattern,
88
- conduit_fmt::arg (" rank" ,rank ()));
99
+ m_log_fname = conduit_fmt::format (ofpattern,
100
+ conduit_fmt::arg (" rank" ,rank ()));
89
101
}
90
102
else
91
103
{
92
- ofname = ofpattern;
104
+ m_log_fname = ofpattern;
93
105
}
94
106
95
- m_ofstream.open (ofname.c_str ());
107
+ // open append (consequtive ascent open use cases)
108
+ m_log_stream.open (m_log_fname.c_str (),std::ios_base::app);
96
109
97
- if (!m_ofstream .is_open ())
110
+ if (!m_log_stream .is_open ())
98
111
{
99
- std::cerr << " [ERROR] Failed to open log file: " << ofname << std::endl;
112
+ throw conduit::Error (conduit_fmt::format (" [FATAL_ERROR] Failed to open log file: {} " , m_log_fname),
113
+ __FILE__,
114
+ __LINE__);
100
115
}
116
+ m_log_open = true ;
117
+ log_message (Logger::DEBUG,conduit_fmt::format (" opened log file: {}" , m_log_fname));
101
118
}
102
119
103
120
// -----------------------------------------------------------------------------
104
121
bool
105
- Logger::is_open ()
122
+ Logger::is_log_open ()
106
123
{
107
- return m_ofstream. is_open () ;
124
+ return m_log_open ;
108
125
}
109
126
110
127
// -----------------------------------------------------------------------------
111
128
void
112
129
Logger::close ()
113
130
{
114
- if (m_ofstream. is_open ())
131
+ if (is_log_open ())
115
132
{
116
- m_ofstream.close ();
133
+ log_message (Logger::DEBUG,conduit_fmt::format (" closing log file: {}" , m_log_fname));
134
+ m_log_stream.close ();
135
+ m_log_open = false ;
136
+ m_log_fname = " " ;
117
137
}
138
+
139
+ reset ();
118
140
}
119
141
120
142
// -----------------------------------------------------------------------------
121
143
void
122
144
Logger::flush ()
123
145
{
124
- m_ofstream << std::flush;
146
+ if (is_log_open ())
147
+ {
148
+ log_stream () << std::flush;
149
+ }
125
150
}
126
151
127
152
// -----------------------------------------------------------------------------
128
153
void
129
154
Logger::log_block_begin (const std::string &name)
130
155
{
156
+ // skip if log is not open
157
+ if (!is_log_open ())
158
+ {
159
+ return ;
160
+ }
161
+
131
162
// make sure we have a unique key name
132
-
133
163
int key_count = m_key_counters.top ()[name]++;
134
164
135
- stream () << m_indent_string <<" -\n " ;
165
+ log_stream () << m_indent_string <<" -\n " ;
136
166
set_indent_level (indent_level ()+1 );
137
167
138
168
if (key_count == 0 )
139
169
{
140
- stream () << m_indent_string << name << " :\n " ;
170
+ log_stream () << m_indent_string << name << " :\n " ;
141
171
}
142
172
else
143
173
{
144
- stream () << m_indent_string << name << " _" << key_count <<" :\n " ;
174
+ log_stream () << m_indent_string << name << " _" << key_count <<" :\n " ;
145
175
}
146
176
set_indent_level (indent_level ()+1 );
147
177
// add timer for new level
@@ -154,8 +184,14 @@ Logger::log_block_begin(const std::string &name)
154
184
void
155
185
Logger::log_block_end (const std::string &name)
156
186
{
157
- stream () << m_indent_string <<" -\n " ;
158
- stream () << m_indent_string << " time_elapsed: " << m_timers.top ().elapsed () << " \n " ;
187
+ // skip if log is not open
188
+ if (!is_log_open ())
189
+ {
190
+ return ;
191
+ }
192
+
193
+ log_stream () << m_indent_string <<" -\n " ;
194
+ log_stream () << m_indent_string << " time_elapsed: " << m_timers.top ().elapsed () << " \n " ;
159
195
set_indent_level (indent_level ()-2 );
160
196
m_key_counters.pop ();
161
197
m_timers.pop ();
@@ -168,17 +204,17 @@ Logger::log_message(int level,
168
204
const std::string &file,
169
205
int line)
170
206
{
171
- // log if equal or above logging threshold
172
- if (level >= log_threshold ())
173
- {
174
- log_message (level, msg, file, line, stream (), true );
175
- }
176
-
177
207
// echo if equal or above echo threshold
178
208
if (level >= echo_threshold ())
179
209
{
180
210
log_message (level, msg, file, line, std::cout, false );
181
211
}
212
+
213
+ // log if equal or above logging threshold
214
+ if (level >= log_threshold ())
215
+ {
216
+ log_message (level, msg, file, line, log_stream (), true );
217
+ }
182
218
}
183
219
184
220
@@ -214,17 +250,17 @@ void
214
250
Logger::log_message (int level,
215
251
const std::string &msg)
216
252
{
217
- // log if equal or above logging threshold
218
- if (level >= log_threshold ())
219
- {
220
- log_message (level, msg, stream (), true );
221
- }
222
-
223
253
// echo if equal or above echo threshold
224
254
if (level >= echo_threshold ())
225
255
{
226
256
log_message (level, msg, std::cout, false );
227
257
}
258
+
259
+ // log if equal or above logging threshold
260
+ if (level >= log_threshold ())
261
+ {
262
+ log_message (level, msg, log_stream (), true );
263
+ }
228
264
}
229
265
230
266
// -----------------------------------------------------------------------------
@@ -302,71 +338,69 @@ Logger::set_rank(int rank)
302
338
void
303
339
Logger::set_log_threshold (int level)
304
340
{
305
- m_level_threshold = level;
341
+ m_log_threshold = level;
306
342
}
307
343
308
344
// -----------------------------------------------------------------------------
309
345
int
310
346
Logger::log_threshold () const
311
347
{
312
- return m_level_threshold ;
348
+ return m_log_threshold ;
313
349
}
314
350
315
351
// -----------------------------------------------------------------------------
316
352
void
317
353
Logger::set_echo_threshold (int level)
318
354
{
319
- m_echo_level_threshold = level;
355
+ m_echo_threshold = level;
320
356
}
321
357
322
358
// -----------------------------------------------------------------------------
323
359
int
324
360
Logger::echo_threshold () const
325
361
{
326
- return m_echo_level_threshold ;
362
+ return m_echo_threshold ;
327
363
}
328
364
329
365
// -----------------------------------------------------------------------------
330
366
std::ostream &
331
- Logger::stream ()
367
+ Logger::log_stream ()
332
368
{
333
- return m_ofstream ;
369
+ return m_log_stream ;
334
370
}
335
371
336
372
// -----------------------------------------------------------------------------
337
- Logger *
373
+ Logger &
338
374
Logger::instance ()
339
375
{
340
- return m_active_instance;
341
- }
342
-
343
- // -----------------------------------------------------------------------------
344
- void
345
- Logger::activate ()
346
- {
347
- m_active_instance = &m_instance;
348
- }
349
-
350
- // -----------------------------------------------------------------------------
351
- void
352
- Logger::deactivate ()
353
- {
354
- m_active_instance = nullptr ;
376
+ return m_instance;
355
377
}
356
378
357
379
// -----------------------------------------------------------------------------
358
- const std::string &
380
+ std::string
359
381
Logger::level_string (int level)
360
382
{
361
- if (level < Logger::UNKNOWN )
383
+ if (level < Logger::ALL )
384
+ {
385
+ level = Logger::ALL;
386
+ }
387
+ else if (level < Logger::DEBUG)
388
+ {
389
+ level = Logger::DEBUG;
390
+ }
391
+ else if (level > Logger::ERROR)
362
392
{
363
- level = Logger::UNKNOWN ;
393
+ level = Logger::NONE ;
364
394
}
365
- else if (level > Logger::LEGENDARY )
395
+ switch (level)
366
396
{
367
- level = Logger::LEGENDARY;
397
+ case Logger::ALL: return " all" ; break ;
398
+ case Logger::DEBUG: return " debug" ; break ;
399
+ case Logger::INFO: return " info" ; break ;
400
+ case Logger::WARN: return " warn" ; break ;
401
+ case Logger::ERROR: return " error" ; break ;
402
+ case Logger::NONE: return " none" ; break ;
368
403
}
369
- return m_level_strings[level];
370
404
}
371
405
372
406
// -----------------------------------------------------------------------------
0 commit comments