Skip to content

Commit 4a6b619

Browse files
committed
simplify, more error checking and more tests
1 parent 70bd652 commit 4a6b619

File tree

3 files changed

+343
-218
lines changed

3 files changed

+343
-218
lines changed

src/libs/logging/ascent_logging.cpp

+111-77
Original file line numberDiff line numberDiff line change
@@ -31,41 +31,32 @@ using namespace conduit;
3131
namespace ascent
3232
{
3333

34+
//-----------------------------------------------------------------------------
35+
// main logger instance
36+
//-----------------------------------------------------------------------------
3437
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"};
4238

4339
//-----------------------------------------------------------------------------
44-
Logger::Scope::Scope(Logger *lgr, const std::string &name)
40+
Logger::Scope::Scope(Logger &lgr, const std::string &name)
4541
: m_lgr(lgr),
4642
m_name(name)
4743
{
48-
if(m_lgr != nullptr)
49-
{
50-
m_lgr->log_block_begin(m_name);
51-
}
44+
m_lgr.log_block_begin(m_name);
5245
}
5346

5447
//-----------------------------------------------------------------------------
5548
Logger::Scope::~Scope()
5649
{
57-
if(m_lgr != nullptr)
58-
{
59-
m_lgr->log_block_end(m_name);
60-
}
50+
m_lgr.log_block_end(m_name);
6151
}
6252

6353
//-----------------------------------------------------------------------------
6454
Logger::Logger()
65-
: m_indent_level(0),
55+
: m_log_open(false),
56+
m_indent_level(0),
6657
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)
6960
{
7061
m_key_counters.push(std::map<std::string,int>());
7162
}
@@ -76,72 +67,111 @@ Logger::~Logger()
7667
close();
7768
}
7869

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+
7983
//-----------------------------------------------------------------------------
8084
void
8185
Logger::open(const std::string &ofpattern)
8286
{
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+
8396
// multi node case, assumes file pattern includes "rank"
84-
std::string ofname;
8597
if(rank() > -1)
8698
{
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()));
89101
}
90102
else
91103
{
92-
ofname = ofpattern;
104+
m_log_fname = ofpattern;
93105
}
94106

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);
96109

97-
if(!m_ofstream.is_open())
110+
if(!m_log_stream.is_open())
98111
{
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__);
100115
}
116+
m_log_open = true;
117+
log_message(Logger::DEBUG,conduit_fmt::format("opened log file: {}", m_log_fname));
101118
}
102119

103120
//-----------------------------------------------------------------------------
104121
bool
105-
Logger::is_open()
122+
Logger::is_log_open()
106123
{
107-
return m_ofstream.is_open();
124+
return m_log_open;
108125
}
109126

110127
//-----------------------------------------------------------------------------
111128
void
112129
Logger::close()
113130
{
114-
if(m_ofstream.is_open())
131+
if(is_log_open())
115132
{
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 = "";
117137
}
138+
139+
reset();
118140
}
119141

120142
//-----------------------------------------------------------------------------
121143
void
122144
Logger::flush()
123145
{
124-
m_ofstream << std::flush;
146+
if(is_log_open())
147+
{
148+
log_stream() << std::flush;
149+
}
125150
}
126151

127152
//-----------------------------------------------------------------------------
128153
void
129154
Logger::log_block_begin(const std::string &name)
130155
{
156+
// skip if log is not open
157+
if(!is_log_open())
158+
{
159+
return;
160+
}
161+
131162
// make sure we have a unique key name
132-
133163
int key_count = m_key_counters.top()[name]++;
134164

135-
stream() << m_indent_string <<"-\n";
165+
log_stream() << m_indent_string <<"-\n";
136166
set_indent_level(indent_level()+1);
137167

138168
if(key_count == 0)
139169
{
140-
stream() << m_indent_string << name << ":\n";
170+
log_stream() << m_indent_string << name << ":\n";
141171
}
142172
else
143173
{
144-
stream() << m_indent_string << name << "_" << key_count <<":\n";
174+
log_stream() << m_indent_string << name << "_" << key_count <<":\n";
145175
}
146176
set_indent_level(indent_level()+1);
147177
// add timer for new level
@@ -154,8 +184,14 @@ Logger::log_block_begin(const std::string &name)
154184
void
155185
Logger::log_block_end(const std::string &name)
156186
{
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";
159195
set_indent_level(indent_level()-2);
160196
m_key_counters.pop();
161197
m_timers.pop();
@@ -168,17 +204,17 @@ Logger::log_message(int level,
168204
const std::string &file,
169205
int line)
170206
{
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-
177207
// echo if equal or above echo threshold
178208
if(level >= echo_threshold())
179209
{
180210
log_message(level, msg, file, line, std::cout, false);
181211
}
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+
}
182218
}
183219

184220

@@ -214,17 +250,17 @@ void
214250
Logger::log_message(int level,
215251
const std::string &msg)
216252
{
217-
// log if equal or above logging threshold
218-
if(level >= log_threshold())
219-
{
220-
log_message(level, msg, stream(), true);
221-
}
222-
223253
// echo if equal or above echo threshold
224254
if(level >= echo_threshold())
225255
{
226256
log_message(level, msg, std::cout, false);
227257
}
258+
259+
// log if equal or above logging threshold
260+
if(level >= log_threshold())
261+
{
262+
log_message(level, msg, log_stream(), true);
263+
}
228264
}
229265

230266
//-----------------------------------------------------------------------------
@@ -302,71 +338,69 @@ Logger::set_rank(int rank)
302338
void
303339
Logger::set_log_threshold(int level)
304340
{
305-
m_level_threshold = level;
341+
m_log_threshold = level;
306342
}
307343

308344
//-----------------------------------------------------------------------------
309345
int
310346
Logger::log_threshold() const
311347
{
312-
return m_level_threshold;
348+
return m_log_threshold;
313349
}
314350

315351
//-----------------------------------------------------------------------------
316352
void
317353
Logger::set_echo_threshold(int level)
318354
{
319-
m_echo_level_threshold = level;
355+
m_echo_threshold = level;
320356
}
321357

322358
//-----------------------------------------------------------------------------
323359
int
324360
Logger::echo_threshold() const
325361
{
326-
return m_echo_level_threshold;
362+
return m_echo_threshold;
327363
}
328364

329365
//-----------------------------------------------------------------------------
330366
std::ostream &
331-
Logger::stream()
367+
Logger::log_stream()
332368
{
333-
return m_ofstream;
369+
return m_log_stream;
334370
}
335371

336372
//-----------------------------------------------------------------------------
337-
Logger *
373+
Logger &
338374
Logger::instance()
339375
{
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;
355377
}
356378

357379
//-----------------------------------------------------------------------------
358-
const std::string &
380+
std::string
359381
Logger::level_string(int level)
360382
{
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)
362392
{
363-
level = Logger::UNKNOWN;
393+
level = Logger::NONE;
364394
}
365-
else if(level > Logger::LEGENDARY)
395+
switch(level)
366396
{
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;
368403
}
369-
return m_level_strings[level];
370404
}
371405

372406
//-----------------------------------------------------------------------------

0 commit comments

Comments
 (0)