-
Notifications
You must be signed in to change notification settings - Fork 21
/
Logger.cpp
127 lines (108 loc) · 3.18 KB
/
Logger.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
//////////////////////////////////////////////////////////////////////////////
// Copyright 2017-2020 Lawrence Livermore National Security, LLC and other
// UMAP Project Developers. See the top-level LICENSE file for details.
//
// SPDX-License-Identifier: LGPL-2.1-only
//////////////////////////////////////////////////////////////////////////////
#include "umap/util/Logger.hpp"
#include <iostream> // for std::cout, std::cerr
#include <mutex>
#include <stdlib.h> // for getenv()
#include <strings.h> // for strcasecmp()
#include <sys/types.h>
#include <sys/syscall.h>
#include <unistd.h>
namespace Umap {
static const char* env_name = "UMAP_LOG_LEVEL";
static const char* env_name_no_timestamp = "UMAP_LOG_NO_TIMESTAMP_LEVEL";
static message::Level defaultLevel = message::Info;
std::mutex g_logging_mutex;
Logger* Logger::s_Logger = nullptr;
static const std::string MessageLevelName[ message::Num_Levels ] = {
"ERROR",
"WARNING",
"INFO",
"DEBUG"
};
Logger::Logger(bool log_with_timestamp) noexcept
: m_log_timestamp(log_with_timestamp)
{
// by default, all message streams are disabled
for ( int i=0 ; i < message::Num_Levels ; ++i )
m_isEnabled[ i ] = false;
}
Logger::~Logger() noexcept
{
}
void Logger::setLoggingMsgLevel( message::Level level ) noexcept
{
for ( int i=0 ; i < message::Num_Levels ; ++i )
m_isEnabled[ i ] = (i<= level) ? true : false;
}
void Logger::logMessage( message::Level level,
const std::string& message,
const std::string& fileName,
int line ) noexcept
{
if ( !logLevelEnabled( level ) )
return; /* short-circuit */
std::lock_guard<std::mutex> guard(g_logging_mutex);
if (m_log_timestamp) {
std::cout
<< getpid() << ":"
<< syscall(__NR_gettid) << " "
<< "[" << MessageLevelName[ level ] << "]"
<< "[" << fileName << ":" << line << "]:"
<< message
<< std::endl;
}
else {
std::cout
<< message
<< std::endl;
}
}
void Logger::initialize()
{
if ( s_Logger != nullptr )
return;
message::Level level = defaultLevel;
char* enval = getenv(env_name);
char* enval_no_timestamp = getenv(env_name_no_timestamp);
bool log_with_timestamp = true;
if ( enval != NULL || enval_no_timestamp != NULL ) {
if (enval_no_timestamp != NULL) {
enval = enval_no_timestamp;
log_with_timestamp = false;
}
bool level_found = false;
for ( int i = 0; i < message::Num_Levels; ++i ) {
if ( strcasecmp( enval, MessageLevelName[ i ].c_str() ) == 0 ) {
level_found = true;
level = (message::Level)i;
break;
}
}
if (! level_found ) {
std::cerr << "No matching logging levels for: " << enval << "\n";
std::cerr << "Available levels are:\n";
for ( int i = 0; i < message::Num_Levels; ++i ) {
std::cerr << "\t" << MessageLevelName[ i ] << "\n";
}
}
}
s_Logger = new Logger(log_with_timestamp);
s_Logger->setLoggingMsgLevel(level);
}
void Logger::finalize()
{
delete s_Logger;
s_Logger = nullptr;
}
Logger* Logger::getActiveLogger()
{
if ( s_Logger == nullptr )
Logger::initialize();
return s_Logger;
}
} /* namespace umap */