-
Notifications
You must be signed in to change notification settings - Fork 45
/
logging.cpp
189 lines (164 loc) · 4.81 KB
/
logging.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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
// Licensed under the MIT License.
#ifndef __LINUX__
#include "evtx_logging.h"
#endif
#include "private.h"
#include <cassert>
#include <cstdarg>
#include <cstddef>
#include <cstring>
#include <limits>
#include <memory>
#include <new>
#include <string>
#include <vector>
#include <mutex>
#include "environment.h"
using namespace std;
sgx_ql_logging_function_t logger_callback = nullptr;
static sgx_ql_log_level_t debug_log_level = SGX_QL_LOG_NONE;
static bool debug_log_initialized = false;
static mutex log_init_mutex;
static const string LEVEL_ERROR = "ERROR";
static const string LEVEL_ERROR_ALT = "SGX_QL_LOG_ERROR";
static const string LEVEL_WARNING = "WARNING";
static const string LEVEL_WARNING_ALT = "SGX_QL_LOG_WARNING";
static const string LEVEL_INFO = "INFO";
static const string LEVEL_INFO_ALT = "SGX_QL_LOG_INFO";
static const string LEVEL_UNKNOWN = "UNKNOWN";
static inline bool convert_string_to_level(const string level, sgx_ql_log_level_t &sqx_ql_level)
{
if (level == LEVEL_ERROR || level == LEVEL_ERROR_ALT)
{
sqx_ql_level = SGX_QL_LOG_ERROR;
return true;
}
if (level == LEVEL_WARNING || level == LEVEL_WARNING_ALT)
{
sqx_ql_level = SGX_QL_LOG_WARNING;
return true;
}
if (level == LEVEL_INFO || level == LEVEL_INFO_ALT)
{
sqx_ql_level = SGX_QL_LOG_INFO;
return true;
}
return false;
}
static inline string log_level_string(const sgx_ql_log_level_t sgx_ql_level)
{
switch (sgx_ql_level)
{
case SGX_QL_LOG_INFO:
return LEVEL_INFO;
case SGX_QL_LOG_WARNING:
return LEVEL_WARNING;
case SGX_QL_LOG_ERROR:
return LEVEL_ERROR;
case SGX_QL_LOG_NONE:
return LEVEL_UNKNOWN;
default:
return LEVEL_UNKNOWN;
}
}
//
// Enable for debug logging via stdout
//
static inline void enable_debug_logging(string level)
{
sgx_ql_log_level_t sgx_level;
if (convert_string_to_level(level, sgx_level))
{
debug_log_level = sgx_level;
auto logging_enabled_message = "Debug Logging Enabled";
if (logger_callback != nullptr)
{
logger_callback(SGX_QL_LOG_INFO, logging_enabled_message);
}
else
{
printf(
"Azure Quote Provider: libdcap_quoteprov.so [%s]: %s\n",
log_level_string(SGX_QL_LOG_INFO).c_str(),
logging_enabled_message);
}
}
}
void init_debug_log()
{
std::lock_guard<std::mutex> lock(log_init_mutex);
if (!debug_log_initialized)
{
auto log_level = get_env_variable_no_log(ENV_AZDCAP_DEBUG_LOG);
if (!log_level.first.empty() && log_level.second.empty())
{
enable_debug_logging(log_level.first);
}
if (!log_level.second.empty())
{
printf(
"Azure Quote Provider: libdcap_quoteprov.so [%s]: %s\n",
log_level_string(SGX_QL_LOG_ERROR).c_str(),
log_level.second.c_str());
}
debug_log_initialized = true;
}
}
//
// Logging function which doesn't allocate buffer
//
void log_message(sgx_ql_log_level_t level, const char* message)
{
if (logger_callback != nullptr)
{
logger_callback(level, message);
}
else
{
init_debug_log();
if (debug_log_level != SGX_QL_LOG_NONE)
{
if (level <= debug_log_level)
{
printf("Azure Quote Provider: libdcap_quoteprov.so [%s]: %s\n", log_level_string(level).c_str(), message);
}
}
}
#ifndef __LINUX__
// Emitting Events only in Windows
if (check_install_event_log_source() == ERROR_SUCCESS)
{
switch (level)
{
case SGX_QL_LOG_INFO:
log_event_log_message(message, EVENTLOG_INFORMATION_TYPE);
break;
case SGX_QL_LOG_WARNING:
log_event_log_message(message, EVENTLOG_WARNING_TYPE);
break;
case SGX_QL_LOG_ERROR:
log_event_log_message(message, EVENTLOG_ERROR_TYPE);
break;
case SGX_QL_LOG_NONE:
break;
default:
break;
}
}
#endif
}
//
// Global logging function.
//
void log(sgx_ql_log_level_t level, const char* fmt, ...)
{
char message[512];
va_list args;
va_start(args, fmt);
#pragma warning(suppress : 25141) // all fmt buffers come from static strings
vsnprintf(message, sizeof(message), fmt, args);
va_end(args);
// ensure buf is always null-terminated
message[sizeof(message) - 1] = 0;
log_message(level, message);
}