Loading...
Searching...
No Matches
logger.cpp
1/*---------------------------------------------------------------------------*\
2*
3* bitpit
4*
5* Copyright (C) 2015-2021 OPTIMAD engineering Srl
6*
7* -------------------------------------------------------------------------
8* License
9* This file is part of bitpit.
10*
11* bitpit is free software: you can redistribute it and/or modify it
12* under the terms of the GNU Lesser General Public License v3 (LGPL)
13* as published by the Free Software Foundation.
14*
15* bitpit is distributed in the hope that it will be useful, but WITHOUT
16* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
17* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
18* License for more details.
19*
20* You should have received a copy of the GNU Lesser General Public License
21* along with bitpit. If not, see <http://www.gnu.org/licenses/>.
22*
23\*---------------------------------------------------------------------------*/
24
25#include <array>
26#include <cassert>
27#include <cctype>
28#include <cmath>
29#include <chrono>
30#include <cstdio>
31#include <ctime>
32#include <fstream>
33#include <iomanip>
34#include <iostream>
35#include <memory>
36#include <sstream>
37#include <functional>
38#include <sys/types.h>
39#include <sys/stat.h>
40#include <type_traits>
41
42#include "compiler.hpp"
43#include "fileHandler.hpp"
44#include "logger.hpp"
45
46namespace bitpit{
47
55
63LoggerBuffer::LoggerBuffer(int nProcesses, int rank, std::size_t bufferSize)
64 : m_buffer(bufferSize + 1),
65 m_nProcesses(nProcesses), m_rank(rank),
66 m_consoleEnabled(false), m_console(&std::cout),
67 m_fileEnabled(false), m_file(nullptr),
68 m_settings(std::make_shared<Settings>())
69{
70 // Set the buffer
71 char *bufferBegin = &m_buffer.front();
72 setp(bufferBegin, bufferBegin + m_buffer.size() - 1);
73
74 // Initialize console stream
76
77 // Initialize file stream
78 setFileEnabled(false);
79
80 // Set parallel data
81 if (m_nProcesses > 1) {
82 int nDigits = static_cast<int>(std::ceil(log10(m_nProcesses)));
83 std::ostringstream convert;
84 convert << std::setw(nDigits) << m_rank;
85 m_rankPrefix = "#" + convert.str();
86 } else {
87 m_rankPrefix = "";
88 }
89
90 // Default settings
91 m_settings->context = "";
92 m_settings->indentation = 0;
93 m_settings->consoleTimestampEnabled = false;
94 m_settings->fileTimestampEnabled = false;
95}
96
101{
102 sync();
103}
104
111{
112 return m_nProcesses;
113}
114
121{
122 return m_rank;
123}
124
136LoggerBuffer::int_type LoggerBuffer::overflow(int_type character)
137{
138 if (character != traits_type::eof()) {
139 // Write the character to the buffer and then increment pptr() by
140 // calling pbump(1). It's always safe to write the charater to the
141 // buffer because we reserved an extra char at the end of our buffer
142 // in the constructor.
143 assert(std::less_equal<char *>()(pptr(), epptr()));
144 *pptr() = character;
145 pbump(1);
146
147 // Flush the stream
148 if (sync() == 0) {
149 return character;
150 }
151 }
152
153 return traits_type::eof();
154}
155
161int LoggerBuffer::sync()
162{
163 return flush(false);
164}
165
173int LoggerBuffer::flush(bool terminate)
174{
175 // Get buffer information
176 const char *bufferBegin = pbase();
177 const char *bufferEnd = pptr();
178 if (bufferBegin == bufferEnd) {
179 return 0;
180 }
181
182 // Flush buffer a line at the time
183 static const std::string EMPTY_STRING = "";
184
185 const char *lineBegin = nullptr;
186 const char *lineEnd = bufferBegin;
187 while (lineEnd != bufferEnd) {
188 // Update line information
189 lineBegin = lineEnd;
190 for (lineEnd = lineBegin; lineEnd != bufferEnd; ++lineEnd) {
191 if (*lineEnd == '\n') {
192 lineEnd += 1;
193 break;
194 }
195 }
196
197 // Detect if a new line must be added at the end of the line
198 bool terminateLine = false;
199 if (terminate && (lineEnd == bufferEnd)) {
200 if (bufferBegin == bufferEnd) {
201 terminateLine = true;
202 } else if (*(bufferEnd - 1) != '\n') {
203 terminateLine = true;
204 }
205 }
206
207 // Get timestamp
208 std::string timestamp;
209 if (m_settings->consoleTimestampEnabled || m_settings->fileTimestampEnabled) {
210 timestamp = getTimestamp();
211 }
212
213 // Flush line to console
214 if (m_console && m_consoleEnabled) {
215 const std::string *consoleTimestamp;
216 if (m_settings->consoleTimestampEnabled) {
217 consoleTimestamp = &timestamp;
218 } else {
219 consoleTimestamp = &EMPTY_STRING;
220 }
221
222 int status = flushLine(*m_console, lineBegin, lineEnd, *consoleTimestamp, terminateLine);
223 if (status != 0) {
224 return status;
225 }
226 }
227
228 // Flush line to file
229 if (m_file && m_fileEnabled && m_file->is_open()) {
230 const std::string *fileTimestamp;
231 if (m_settings->fileTimestampEnabled) {
232 fileTimestamp = &timestamp;
233 } else {
234 fileTimestamp = &EMPTY_STRING;
235 }
236
237 int status = flushLine(*m_file, lineBegin, lineEnd, *fileTimestamp, terminateLine);
238 if (status != 0) {
239 return status;
240 }
241 }
242 }
243
244 // Reset the internal pointer
245 pbump(static_cast<int>(bufferBegin - bufferEnd));
246
247 return 0;
248}
249
263int LoggerBuffer::flushLine(std::ostream &stream, const char *begin, const char *end,
264 const std::string &timestamp, bool terminate)
265{
266 if (!timestamp.empty()) {
267 stream << "[" + timestamp + "] ";
268 if ((stream.rdstate() & std::ifstream::failbit) != 0) {
269 return -1;
270 }
271 }
272
273 if (!m_rankPrefix.empty()) {
274 stream << m_rankPrefix << " :: ";
275 if ((stream.rdstate() & std::ifstream::failbit) != 0) {
276 return -1;
277 }
278 }
279
280 if (!m_settings->context.empty()) {
281 stream << m_settings->context + " :: ";
282 if ((stream.rdstate() & std::ifstream::failbit) != 0) {
283 return -1;
284 }
285 }
286
287 for (int i = 0; i < m_settings->indentation; ++i) {
288 stream << " ";
289 if ((stream.rdstate() & std::ifstream::failbit) != 0) {
290 return -1;
291 }
292 }
293
294 stream.write(begin, end - begin);
295 if ((stream.rdstate() & std::ifstream::failbit) != 0) {
296 return -1;
297 }
298
299 if (terminate) {
300 stream << "\n";
301 if ((stream.rdstate() & std::ifstream::failbit) != 0) {
302 return -1;
303 }
304 }
305
306 return 0;
307}
308
315{
316 if (m_consoleEnabled == enabled) {
317 return;
318 }
319
320 flush(true);
321
322 m_consoleEnabled = enabled;
323}
324
330void LoggerBuffer::setConsoleStream(std::ostream *console)
331{
332 flush(true);
333
334 m_console = console;
335}
336
343{
344 return *m_console;
345}
346
357{
358 if (m_fileEnabled == enabled) {
359 return;
360 }
361
362 flush(true);
363
364 m_fileEnabled = enabled;
365}
366
372void LoggerBuffer::setFileStream(std::ofstream *file)
373{
374 flush(true);
375
376 m_file = file;
377}
378
385{
386 return *m_file;
387}
388
395{
396 return m_settings.get();
397}
398
404void LoggerBuffer::setSettings(const std::shared_ptr<Settings> &settings)
405{
406 if (settings.get() == m_settings.get()) {
407 return;
408 }
409
410 flush(true);
411
412 m_settings = settings;
413}
414
418std::string LoggerBuffer::getTimestamp() const
419{
420 static const std::string TIMESTAMP_FORMAT = "%Y-%m-%d %H:%M:%S";
421
422 auto currentClock = std::chrono::system_clock::now();
423 std::time_t currentTime = std::chrono::system_clock::to_time_t(currentClock);
424
425 auto seconds = std::chrono::duration_cast<std::chrono::seconds>(currentClock.time_since_epoch());
426 auto millisecs = std::chrono::duration_cast<std::chrono::milliseconds>(currentClock.time_since_epoch() - seconds);
427 std::array<char, 11> millisecsBuffer;
428 std::snprintf(millisecsBuffer.data(), millisecsBuffer.size(), "%03u", static_cast<unsigned int>(millisecs.count()));
429
430 std::string timestamp;
431 timestamp.resize(23);
432 std::strftime(&timestamp[0], timestamp.size(), TIMESTAMP_FORMAT.c_str(), localtime(&currentTime));
433 timestamp[19] = '.';
434 timestamp[20] = millisecsBuffer[0];
435 timestamp[21] = millisecsBuffer[1];
436 timestamp[22] = millisecsBuffer[2];
437
438 return timestamp;
439}
440
450
456Logger::Logger(const std::string &name, const std::shared_ptr<LoggerBuffer> &buffer)
457 : std::ios(nullptr), std::ostream(nullptr),
458 m_name(name),
459 m_buffer(buffer), m_bufferSettings(std::make_shared<LoggerBuffer::Settings>()),
460 m_defaultSeverity(log::LEVEL_INFO), m_defaultVisibility(log::VISIBILITY_MASTER),
461 m_consoleDisabledThreshold(log::LEVEL_NOTSET), m_consoleVerbosityThreshold(log::LEVEL_INFO),
462 m_fileDisabledThreshold(log::LEVEL_NOTSET), m_fileVerbosityThreshold(log::LEVEL_INFO)
463{
464 // St stream buffer
465 basic_ios<char>::rdbuf(m_buffer.get());
466
467 // Default settings
468 m_bufferSettings->context = "";
469 m_bufferSettings->indentation = 0;
470 m_bufferSettings->consoleTimestampEnabled = false;
471 m_bufferSettings->fileTimestampEnabled = true;
472}
473
492{
493 disableConsole(level);
494 disableFile(level);
495}
496
515{
516 m_consoleDisabledThreshold = level;
517}
518
537{
538 m_fileDisabledThreshold = level;
539}
540
547{
548 // Set default severity
549 assert(severity != log::Level::LEVEL_NOTSET);
550 m_defaultSeverity = severity;
551}
552
559{
560 return m_defaultSeverity;
561}
562
569{
570 setDefaultSeverity(priority);
571}
572
582
588void Logger::setDefaultVisibility(log::Visibility visibility)
589{
590 // Set default visibility
591 assert(visibility != log::VISIBILITY_NOTSET);
592 m_defaultVisibility = visibility;
593}
594
601{
602 return m_defaultVisibility;
603}
604
610void Logger::setVisibility(log::Visibility visibility)
611{
612 setDefaultVisibility(visibility);
613}
614
620log::Visibility Logger::getVisibility()
621{
622 return getDefaultVisibility();
623}
624
636{
637 setConsoleVerbosity(threshold);
638 setFileVerbosity(threshold);
639}
640
648{
651}
652
660{
661 return m_bufferSettings->consoleTimestampEnabled;
662}
663
670{
671 if (m_bufferSettings->consoleTimestampEnabled == enabled) {
672 return;
673 }
674
675 m_buffer->flush(true);
676
677 m_bufferSettings->consoleTimestampEnabled = enabled;
678}
679
690{
691 // Set verbosity threshold
692 m_consoleVerbosityThreshold = threshold;
693}
694
701void Logger::enableBufferStreams(log::Level severity, log::Visibility visibility)
702{
703 // Enable console stream
704 bool isConsoleEnabled = true;
705 if (severity <= m_consoleDisabledThreshold) {
706 isConsoleEnabled = false;
707 } else if (visibility == log::VISIBILITY_MASTER && (m_buffer->getRank() != 0)) {
708 isConsoleEnabled = false;
709 } else {
710 isConsoleEnabled = (severity >= m_consoleVerbosityThreshold);
711 }
712 m_buffer->setConsoleEnabled(isConsoleEnabled);
713
714 // Enable file stream
715 bool isFileEnabled = true;
716 if (severity <= m_fileDisabledThreshold) {
717 isFileEnabled = false;
718 } else if (visibility == log::VISIBILITY_MASTER && (m_buffer->getRank() != 0)) {
719 isFileEnabled = false;
720 } else {
721 isFileEnabled = (severity >= m_fileVerbosityThreshold);
722 }
723 m_buffer->setFileEnabled(isFileEnabled);
724}
725
736{
737 return m_consoleVerbosityThreshold;
738}
739
747{
748 return m_bufferSettings->fileTimestampEnabled;
749}
750
757{
758 if (m_bufferSettings->fileTimestampEnabled == enabled) {
759 return;
760 }
761
762 m_buffer->flush(true);
763
764 m_bufferSettings->fileTimestampEnabled = enabled;
765}
766
777{
778 // Set verbosity threshold
779 m_fileVerbosityThreshold = threshold;
780}
781
790{
791 return m_fileVerbosityThreshold;
792}
793
799void Logger::setContext(const std::string &context)
800{
801 if (m_bufferSettings->context == context) {
802 return;
803 }
804
805 m_buffer->flush(true);
806
807 m_bufferSettings->context = context;
808}
809
816{
817 return m_bufferSettings->context;
818}
819
826{
827 if (delta == 0) {
828 return;
829 }
830
831 m_buffer->flush(true);
832
833 m_bufferSettings->indentation += delta;
834}
835
842{
843 return m_bufferSettings->indentation;
844}
845
851std::string Logger::getName() const
852{
853 return m_name;
854}
855
861void Logger::println(const std::string &line)
862{
863 print(line + '\n');
864}
865
872void Logger::println(const std::string &line, log::Level severity)
873{
874 print(line + '\n', severity);
875}
876
883void Logger::println(const std::string &line, log::Visibility visibility)
884{
885 print(line + '\n', visibility);
886}
887
895void Logger::println(const std::string &line, log::Level severity, log::Visibility visibility)
896{
897 print(line + '\n', severity, visibility);
898}
899
905void Logger::print(const std::string &message)
906{
908}
909
916void Logger::print(const std::string &message, log::Level severity)
917{
918 print(message, severity, getDefaultVisibility());
919}
920
927void Logger::print(const std::string &message, log::Visibility visibility)
928{
929 print(message, getDefaultSeverity(), visibility);
930}
931
939void Logger::print(const std::string &message, log::Level severity, log::Visibility visibility)
940{
941 print<const std::string &>(message, severity, visibility);
942}
943
952
953/*
954 Initialize logger manager instance.
955*/
956std::unique_ptr<LoggerManager> LoggerManager::m_manager = nullptr;
957
958/*
959 Default name for the logger.
960*/
961std::string LoggerManager::BITPIT_LOG_NAME = "bitpit";
962
963/*
964 Default directory for the logger.
965*/
966std::string LoggerManager::BITPIT_LOG_DIRECTORY = ".";
967
971LoggerManager::LoggerManager()
972 : m_defaultName(BITPIT_LOG_NAME), m_defaultDirectory(BITPIT_LOG_DIRECTORY),
973 m_mode(log::MODE_SEPARATE)
974{
975
976}
977
982{
983 // Get a list of the loggers
984 std::vector<std::string> loggerNames;
985 loggerNames.reserve(m_loggers.size());
986 for (const auto &entry : m_loggers) {
987 loggerNames.push_back(entry.first);
988 }
989
990 // Destroy all the loggers
991 for (const std::string &name : loggerNames) {
992 destroy(name, true);
993 }
994}
995
1001LoggerManager & LoggerManager::manager()
1002{
1003 if (!m_manager) {
1004 m_manager = std::unique_ptr<LoggerManager>(new LoggerManager());
1005 }
1006
1007 return *m_manager;
1008}
1009
1025Logger & LoggerManager::cout(log::Level defaultSeverity, log::Visibility defaultVisibility)
1026{
1027 return cout(m_defaultName, defaultSeverity, defaultVisibility);
1028}
1029
1049Logger & LoggerManager::cout(const std::string &name, log::Level defaultSeverity, log::Visibility defaultVisibility)
1050{
1051 // Get the logger
1052 if (m_loggers.count(name) == 0) {
1053 if (!isInitialized()) {
1054 setMode(log::MODE_SEPARATE);
1055 }
1056
1057 if (name == m_defaultName) {
1058 _create(name, false, m_defaultDirectory, 1, 0);
1059 } else {
1060 create(name, false, m_defaultDirectory, 1, 0);
1061 }
1062 }
1063
1064 Logger &logger = *(m_loggers.at(name));
1065
1066 // Set default properties
1067 if (defaultSeverity != log::Level::LEVEL_NOTSET) {
1068 logger.setDefaultSeverity(defaultSeverity);
1069 }
1070
1071 if (defaultVisibility != log::VISIBILITY_NOTSET) {
1072 logger.setDefaultVisibility(defaultVisibility);
1073 }
1074
1075 // Return the logger
1076 return logger;
1077}
1078
1091Logger & LoggerManager::critical(log::Visibility defaultVisibility)
1092{
1093 return critical(m_defaultName, defaultVisibility);
1094}
1095
1112Logger & LoggerManager::critical(const std::string &name, log::Visibility defaultVisibility)
1113{
1114 return cout(name, log::Level::LEVEL_CRITICAL, defaultVisibility);
1115}
1116
1129Logger & LoggerManager::error(log::Visibility defaultVisibility)
1130{
1131 return error(m_defaultName, defaultVisibility);
1132}
1133
1150Logger & LoggerManager::error(const std::string &name, log::Visibility defaultVisibility)
1151{
1152 return cout(name, log::Level::LEVEL_ERROR, defaultVisibility);
1153}
1154
1167Logger & LoggerManager::warning(log::Visibility defaultVisibility)
1168{
1169 return warning(m_defaultName, defaultVisibility);
1170}
1171
1188Logger & LoggerManager::warning(const std::string &name, log::Visibility defaultVisibility)
1189{
1190 return cout(name, log::Level::LEVEL_WARNING, defaultVisibility);
1191}
1192
1205Logger & LoggerManager::info(log::Visibility defaultVisibility)
1206{
1207 return info(m_defaultName, defaultVisibility);
1208}
1209
1226Logger & LoggerManager::info(const std::string &name, log::Visibility defaultVisibility)
1227{
1228 return cout(name, log::Level::LEVEL_INFO, defaultVisibility);
1229}
1230
1243Logger & LoggerManager::debug(log::Visibility defaultVisibility)
1244{
1245 return debug(m_defaultName, defaultVisibility);
1246}
1247
1264Logger & LoggerManager::debug(const std::string &name, log::Visibility defaultVisibility)
1265{
1266 return cout(name, log::Level::LEVEL_DEBUG, defaultVisibility);
1267}
1268
1278 int nProcesses, int rank)
1279{
1280 initialize(mode, m_defaultName, reset, m_defaultDirectory, nProcesses, rank);
1281}
1282
1292void LoggerManager::initialize(log::Mode mode, bool reset, const std::string &directory,
1293 int nProcesses, int rank)
1294{
1295 initialize(mode, m_defaultName, reset, directory, nProcesses, rank);
1296}
1297
1308void LoggerManager::initialize(log::Mode mode, const std::string &name, bool reset,
1309 const std::string &directory,
1310 int nProcesses, int rank)
1311{
1312 if (isInitialized()) {
1313 log::cout().println("Logger initialization has to be called before creating the loggers.");
1314 return;
1315 }
1316
1317 // Set mode
1318 setMode(mode);
1319
1320 // Set the dafault data
1321 m_defaultName = name;
1322 m_defaultDirectory = directory;
1323
1324 // Create the logger
1325 _create(m_defaultName, reset, directory, nProcesses, rank);
1326}
1327
1336void LoggerManager::create(const std::string &name, bool reset,
1337 int nProcesses, int rank)
1338{
1339 create(name, reset, m_defaultDirectory, nProcesses, rank);
1340}
1341
1351void LoggerManager::create(const std::string &name, bool reset,
1352 const std::string &directory,
1353 int nProcesses, int rank)
1354{
1355 // Its not possible to create a log with the default name nor a log
1356 // with the same name of an existent logger nor a log with an empty
1357 // name
1358 if (exists(name)) {
1359 m_loggerUsers[name]++;
1360
1361 cout(name) << "Detected an attemp to create the logger \"" << name << "\" twice" << std::endl;
1362 cout(name) << "The previously created logger will be used." << std::endl;
1363 return;
1364 } else if (name == m_defaultName) {
1365 cout(m_defaultName) << "Detected an attemp to overwrite the default logger" << std::endl;
1366 cout(m_defaultName) << "The name of the default logger is \"" << name << "\"" << std::endl;
1367 return;
1368 } else if (name == "") {
1369 cout() << "Detected an attemp to create a logger with an empty name" << std::endl;
1370 return;
1371 }
1372
1373 // Create the logger
1374 if (m_mode == log::MODE_SEPARATE) {
1375 _create(name, reset, directory, nProcesses, rank);
1376 } else {
1377 Logger &defaultLogger = cout(m_defaultName);
1378 _create(name, defaultLogger.m_buffer);
1379 }
1380}
1381
1393bool LoggerManager::destroy(const std::string &name, bool force)
1394{
1395 if (!exists(name)) {
1396 return false;
1397 }
1398
1399 // Decrement the users
1400 int &nUsers = m_loggerUsers[name];
1401 nUsers--;
1402
1403 // If the logger has no users we can delete it
1404 if (nUsers == 0 || force) {
1405 // Remove the logger from the manager
1406 m_loggers.erase(name);
1407 m_loggerUsers.erase(name);
1408
1409 // If the logger has it own file stream, delete it
1410 if (m_fileStreams.count(name) > 0) {
1411 // Close the stream
1412 std::ofstream &fileStream = *(m_fileStreams.at(name));
1413 fileStream.close();
1414
1415 // Remove the stream
1416 m_fileStreams.erase(name);
1417 }
1418
1419 return true;
1420 } else {
1421 return false;
1422 }
1423}
1424
1431bool LoggerManager::exists(const std::string &name) const
1432{
1433 return (m_loggers.count(name) != 0);
1434}
1435
1447{
1448 return (m_loggers.size() > 0);
1449}
1450
1466{
1467 if (isInitialized()) {
1468 cout().println("The policy has to be set before creating the loggers.");
1469 return false;
1470 }
1471
1472 m_mode = mode;
1473 return true;
1474}
1475
1482{
1483 return m_mode;
1484}
1485
1495void LoggerManager::_create(const std::string &name, bool reset,
1496 const std::string &directory,
1497 int nProcesses, int rank)
1498{
1499 // Get the file path
1500 FileHandler fileHandler;
1501 fileHandler.setDirectory(directory);
1502 fileHandler.setName(name);
1503 fileHandler.setAppendix("log");
1504 fileHandler.setParallel(nProcesses > 1);
1505 if (nProcesses > 1) {
1506 fileHandler.setBlock(rank);
1507 }
1508
1509 std::string filePath = fileHandler.getPath();
1510
1511 // Create the file stream
1512 std::ios_base::openmode fileMode;
1513 if (reset) {
1514 fileMode = std::ofstream::out;
1515 } else {
1516 fileMode = std::ofstream::app;
1517 }
1518
1519 m_fileStreams[name] = std::unique_ptr<std::ofstream>(new std::ofstream());
1520 std::ofstream &fileStream = *(m_fileStreams.at(name));
1521 fileStream.rdbuf()->pubsetbuf(0, 0);
1522 fileStream.open(filePath, fileMode);
1523
1524 // Use cout as console stream
1525 std::ostream &consoleStream = std::cout;
1526
1527 // Create the buffer
1528 std::shared_ptr<LoggerBuffer> buffer = std::make_shared<LoggerBuffer>(nProcesses, rank, 256);
1529 buffer->setFileStream(&fileStream);
1530 buffer->setConsoleStream(&consoleStream);
1531
1532 // Create the logger
1533 _create(name, buffer);
1534}
1535
1542void LoggerManager::_create(const std::string &name, std::shared_ptr<LoggerBuffer> &buffer)
1543{
1544 m_loggers[name] = std::unique_ptr<Logger>(new Logger(name, buffer));
1545 m_loggerUsers[name] = 1;
1546}
1547
1559{
1560 for (auto &entry : m_loggers) {
1561 entry.second->setVerbosities(threshold);
1562 }
1563}
1564
1575{
1576 for (auto &entry : m_loggers) {
1577 entry.second->setConsoleVerbosity(threshold);
1578 }
1579}
1580
1591{
1592 for (auto &entry : m_loggers) {
1593 entry.second->setFileVerbosity(threshold);
1594 }
1595}
1596
1603{
1604 return m_defaultName;
1605}
1606
1613{
1614 return m_defaultDirectory;
1615}
1616
1617// Logger global functions
1618namespace log {
1630
1663
1670
1678
1686
1687 // Generic global functions
1688
1695 {
1696 return LoggerManager::manager();
1697 }
1698
1718
1735 Logger & cout(const std::string &name, log::Level defaultSeverity, log::Visibility defaultVisibility)
1736 {
1738 }
1739
1752 {
1754 }
1755
1769 Logger & critical(const std::string &name, log::Visibility defaultVisibility)
1770 {
1771 return manager().critical(name, defaultVisibility);
1772 }
1773
1786 Logger & error(log::Visibility defaultVisibility)
1787 {
1789 }
1790
1804 Logger & error(const std::string &name, log::Visibility defaultVisibility)
1805 {
1806 return manager().error(name, defaultVisibility);
1807 }
1808
1822 {
1824 }
1825
1839 Logger & warning(const std::string &name, log::Visibility defaultVisibility)
1840 {
1841 return manager().warning(name, defaultVisibility);
1842 }
1843
1856 Logger & info(log::Visibility defaultVisibility)
1857 {
1858 return manager().info(defaultVisibility);
1859 }
1860
1874 Logger & info(const std::string &name, log::Visibility defaultVisibility)
1875 {
1876 return manager().info(name, defaultVisibility);
1877 }
1878
1891 Logger & debug(log::Visibility defaultVisibility)
1892 {
1894 }
1895
1909 Logger & debug(const std::string &name, log::Visibility defaultVisibility)
1910 {
1911 return manager().debug(name, defaultVisibility);
1912 }
1913
1914 // Manipulators global functions
1915
1923 Logger & setContext(Logger &logger, const std::string &context)
1924 {
1925 logger.setContext(context);
1926
1927 return logger;
1928 }
1929
1942
1950 Logger & setDefaultSeverity(Logger &logger, const log::Level &severity)
1951 {
1952 logger.setDefaultSeverity(severity);
1953
1954 return logger;
1955 }
1956
1969
1978 {
1980
1981 return logger;
1982 }
1983
1996
2004 Logger & setDefaultVisibility(Logger &logger, const log::Visibility &visibility)
2005 {
2007
2008 return logger;
2009 }
2010
2023
2031 Logger & setVisibility(Logger &logger, const log::Visibility &visibility)
2032 {
2034
2035 return logger;
2036 }
2037
2050
2059 Logger & setVerbosities(Logger &logger, const log::Level &threshold)
2060 {
2061 logger.setVerbosities(threshold);
2062
2063 return logger;
2064 }
2065
2079
2087 Logger & setConsoleVerbosity(Logger &logger, const log::Level &threshold)
2088 {
2089 logger.setConsoleVerbosity(threshold);
2090
2091 return logger;
2092 }
2093
2106
2114 Logger & setFileVerbosity(Logger &logger, const log::Level &threshold)
2115 {
2116 logger.setFileVerbosity(threshold);
2117
2118 return logger;
2119 }
2120
2133
2143 Logger & disable(Logger &logger, const log::Level &level)
2144 {
2145 logger.disable(level);
2146
2147 return logger;
2148 }
2149
2164
2174 Logger & disableConsole(Logger &logger, const log::Level &level)
2175 {
2176 logger.disableConsole(level);
2177
2178 return logger;
2179 }
2180
2195
2205 Logger & disableFile(Logger &logger, const log::Level &level)
2206 {
2207 logger.disableFile(level);
2208
2209 return logger;
2210 }
2211
2226
2234 Logger & setIndentation(Logger &logger, const int &delta)
2235 {
2236 logger.setIndentation(delta);
2237
2238 return logger;
2239 }
2240
2250 {
2252 }
2253}
2254
2255}
Creates file names and checks status.
std::string getPath() const
void setParallel(bool p_)
void setDirectory(const std::string &d_)
void setName(const std::string &n_)
void setBlock(int b_)
void setAppendix(const std::string &a_)
std::ofstream & getFileStream()
Definition logger.cpp:384
LoggerBuffer(int nProcesses, int rank, std::size_t bufferSize=256)
Definition logger.cpp:63
void setFileEnabled(bool enabled)
Definition logger.cpp:356
void setSettings(const std::shared_ptr< Settings > &settings)
Definition logger.cpp:404
int getProcessCount() const
Definition logger.cpp:110
const Settings * getSettings() const
Definition logger.cpp:394
void setFileStream(std::ofstream *file)
Definition logger.cpp:372
void setConsoleEnabled(bool enabled)
Definition logger.cpp:314
std::ostream & getConsoleStream()
Definition logger.cpp:342
int flush(bool terminate)
Definition logger.cpp:173
int getRank() const
Definition logger.cpp:120
void setConsoleStream(std::ostream *console)
Definition logger.cpp:330
Manager for the loggers.
Definition logger.hpp:234
void create(const std::string &name, bool reset=false, int nProcesses=1, int rank=0)
Definition logger.cpp:1336
bool setMode(log::Mode mode)
Definition logger.cpp:1465
bool exists(const std::string &name) const
Definition logger.cpp:1431
Logger & debug(log::Visibility visibility=log::VISIBILITY_NOTSET)
Definition logger.cpp:1243
bool destroy(const std::string &name, bool force=false)
Definition logger.cpp:1393
void setVerbosities(log::Level threshold)
Definition logger.cpp:1558
Logger & critical(log::Visibility visibility=log::VISIBILITY_NOTSET)
Definition logger.cpp:1091
std::string getDefaultDirectory() const
Definition logger.cpp:1612
log::Mode getMode() const
Definition logger.cpp:1481
Logger & cout(log::Level defualtSeverity=log::Level::LEVEL_NOTSET, log::Visibility defualtVisibility=log::VISIBILITY_NOTSET)
Definition logger.cpp:1025
Logger & warning(log::Visibility visibility=log::VISIBILITY_NOTSET)
Definition logger.cpp:1167
static LoggerManager & manager()
Definition logger.cpp:1001
Logger & error(log::Visibility visibility=log::VISIBILITY_NOTSET)
Definition logger.cpp:1129
void setFileVerbosity(log::Level threshold)
Definition logger.cpp:1590
std::string getDefaultName() const
Definition logger.cpp:1602
Logger & info(log::Visibility visibility=log::VISIBILITY_NOTSET)
Definition logger.cpp:1205
bool isInitialized() const
Definition logger.cpp:1446
void setConsoleVerbosity(log::Level threshold)
Definition logger.cpp:1574
void initialize(log::Mode mode, bool reset, int nProcesses, int rank)
Definition logger.cpp:1277
Message logger.
Definition logger.hpp:143
void setDefaultVisibility(log::Visibility visibility)
Definition logger.cpp:588
void setDefaultSeverity(log::Level severity)
Definition logger.cpp:546
void setVerbosities(log::Level threshold)
Definition logger.cpp:635
void setConsoleTimestampEnabled(bool enabled)
Definition logger.cpp:669
void setFileVerbosity(log::Level threshold)
Definition logger.cpp:776
log::Level getDefaultSeverity()
Definition logger.cpp:558
std::string getContext()
Definition logger.cpp:815
void setConsoleVerbosity(log::Level threshold)
Definition logger.cpp:689
void setPriority(log::Priority priority)
Definition logger.cpp:568
bool isConsoleTimestampEnabled() const
Definition logger.cpp:659
void disable(log::Level=log::Level::LEVEL_CRITICAL)
Definition logger.cpp:491
log::Visibility getDefaultVisibility()
Definition logger.cpp:600
log::Level getFileVerbosity()
Definition logger.cpp:789
void setIndentation(int delta)
Definition logger.cpp:825
void disableConsole(log::Level=log::Level::LEVEL_CRITICAL)
Definition logger.cpp:514
bool isFileTimestampEnabled() const
Definition logger.cpp:746
void setVisibility(log::Visibility visibility)
Definition logger.cpp:610
void setFileTimestampEnabled(bool enabled)
Definition logger.cpp:756
int getIndentation()
Definition logger.cpp:841
void println(const std::string &message)
Definition logger.cpp:861
void disableFile(log::Level=log::Level::LEVEL_CRITICAL)
Definition logger.cpp:536
std::string getName() const
Definition logger.cpp:851
void print(const std::string &message)
Definition logger.cpp:905
void setContext(const std::string &context)
Definition logger.cpp:799
void setTimestampEnabled(bool enabled)
Definition logger.cpp:647
log::Level getConsoleVerbosity()
Definition logger.cpp:735
log::Visibility getVisibility()
Definition logger.cpp:620
log::Priority getPriority()
Definition logger.cpp:578
The namespace 'log' contains routines for interacting with the message logger.
Definition logger.cpp:1618
LoggerManipulator< log::Level > defaultSeverity(const log::Level &severity)
Definition logger.cpp:1965
Logger & cout(log::Level defaultSeverity, log::Visibility defaultVisibility)
Definition logger.cpp:1714
Level Priority
Definition logger.hpp:78
LoggerManipulator< log::Visibility > defaultVisibility(const log::Visibility &visibility)
Definition logger.cpp:2019
LoggerManipulator< log::Level > verbosities(const log::Level &threshold)
Definition logger.cpp:2075
Logger & setPriority(Logger &logger, const log::Priority &priority)
Definition logger.cpp:1977
LoggerManipulator< log::Visibility > visibility(const log::Visibility &visibility)
Definition logger.cpp:2046
Logger & critical(log::Visibility defaultVisibility)
Definition logger.cpp:1751
Logger & disable(Logger &logger, const log::Level &level)
Definition logger.cpp:2143
LoggerManipulator< log::Level > consoleVerbosity(const log::Level &threshold)
Definition logger.cpp:2102
Logger & setDefaultSeverity(Logger &logger, const log::Level &severity)
Definition logger.cpp:1950
LoggerManipulator< log::Priority > priority(const log::Priority &priority)
Definition logger.cpp:1992
Logger & error(log::Visibility defaultVisibility)
Definition logger.cpp:1786
Logger & warning(log::Visibility defaultVisibility)
Definition logger.cpp:1821
LoggerManipulator< log::Level > fileVerbosity(const log::Level &threshold)
Definition logger.cpp:2129
Logger & debug(log::Visibility defaultVisibility)
Definition logger.cpp:1891
LoggerManipulator< int > indent(int delta)
Definition logger.cpp:2249
Logger & setFileVerbosity(Logger &logger, const log::Level &threshold)
Definition logger.cpp:2114
Logger & setVisibility(Logger &logger, const log::Visibility &visibility)
Definition logger.cpp:2031
Logger & info(log::Visibility defaultVisibility)
Definition logger.cpp:1856
Logger & disableConsole(Logger &logger, const log::Level &level)
Definition logger.cpp:2174
Logger & setDefaultVisibility(Logger &logger, const log::Visibility &visibility)
Definition logger.cpp:2004
LoggerManager & manager()
Definition logger.cpp:1694
Logger & setVerbosities(Logger &logger, const log::Level &threshold)
Definition logger.cpp:2059
Logger & setIndentation(Logger &logger, const int &delta)
Definition logger.cpp:2234
LoggerManipulator< std::string > context(const std::string &context)
Definition logger.cpp:1938
Logger & disableFile(Logger &logger, const log::Level &level)
Definition logger.cpp:2205
Logger & setConsoleVerbosity(Logger &logger, const log::Level &threshold)
Definition logger.cpp:2087
Logger & setContext(Logger &logger, const std::string &context)
Definition logger.cpp:1923