@@ -32,14 +32,17 @@ namespace
32
32
33
33
thread_local char s_tbuf[16384 ];
34
34
35
+ const size_t ENCODE_LEN = sizeof (uint64_t );
36
+
35
37
} // end namespace
36
38
37
- const uint32_t sinsp_logger::OT_NONE = 0 ;
38
- const uint32_t sinsp_logger::OT_STDOUT = 1 ;
39
- const uint32_t sinsp_logger::OT_STDERR = (OT_STDOUT << 1 );
40
- const uint32_t sinsp_logger::OT_FILE = (OT_STDERR << 1 );
41
- const uint32_t sinsp_logger::OT_CALLBACK = (OT_FILE << 1 );
42
- const uint32_t sinsp_logger::OT_NOTS = (OT_CALLBACK << 1 );
39
+ const uint32_t sinsp_logger::OT_NONE = 0 ;
40
+ const uint32_t sinsp_logger::OT_STDOUT = 1 ;
41
+ const uint32_t sinsp_logger::OT_STDERR = (OT_STDOUT << 1 );
42
+ const uint32_t sinsp_logger::OT_FILE = (OT_STDERR << 1 );
43
+ const uint32_t sinsp_logger::OT_CALLBACK = (OT_FILE << 1 );
44
+ const uint32_t sinsp_logger::OT_NOTS = (OT_CALLBACK << 1 );
45
+ const uint32_t sinsp_logger::OT_ENCODE_SEV = (OT_NOTS << 1 );
43
46
44
47
sinsp_logger::sinsp_logger ():
45
48
m_file(nullptr ),
@@ -101,6 +104,11 @@ void sinsp_logger::disable_timestamps()
101
104
m_flags |= sinsp_logger::OT_NOTS;
102
105
}
103
106
107
+ void sinsp_logger::add_encoded_severity ()
108
+ {
109
+ m_flags |= sinsp_logger::OT_ENCODE_SEV;
110
+ }
111
+
104
112
void sinsp_logger::add_callback_log (const sinsp_logger_callback callback)
105
113
{
106
114
const sinsp_logger_callback old_cb = m_callback.exchange (callback);
@@ -165,19 +173,11 @@ void sinsp_logger::log(std::string msg, const severity sev)
165
173
166
174
if (gettimeofday (&ts, nullptr ) == 0 )
167
175
{
168
- const std::string::size_type ts_length = 22 ;
169
- char ts_buf[ts_length + 1 ];
176
+ const std::string::size_type ts_length = sizeof ( " 31-12 23:59:59.999999 " ) ;
177
+ char ts_buf[ts_length];
170
178
struct tm time_info = {};
171
179
172
180
gmtime_r (&ts.tv_sec , &time_info);
173
-
174
- //
175
- // This formatted string is ts_length bytes long:
176
- //
177
- // 1 2
178
- // "1234567890123456789012
179
- // "xx-xx xx:xx:xx.xxxxxx "
180
- //
181
181
snprintf (ts_buf,
182
182
sizeof (ts_buf),
183
183
" %.2d-%.2d %.2d:%.2d:%.2d.%.6d " ,
@@ -189,10 +189,18 @@ void sinsp_logger::log(std::string msg, const severity sev)
189
189
(int )ts.tv_usec );
190
190
191
191
ts_buf[sizeof (ts_buf) - 1 ] = ' \0 ' ;
192
- msg.insert (0 , ts_buf, ts_length );
192
+ msg.insert (0 , ts_buf);
193
193
}
194
194
}
195
195
196
+ if (m_flags & sinsp_logger::OT_ENCODE_SEV)
197
+ {
198
+ char sev_buf[ENCODE_LEN + 1 ];
199
+ strncpy (sev_buf, encode_severity (sev), sizeof (sev_buf));
200
+ sev_buf[sizeof (sev_buf) - 1 ] = 0 ;
201
+ msg.insert (0 , sev_buf);
202
+ }
203
+
196
204
if (is_callback ())
197
205
{
198
206
cb = m_callback;
@@ -250,3 +258,57 @@ const char* sinsp_logger::format(const char* const fmt, ...)
250
258
251
259
return s_tbuf;
252
260
}
261
+
262
+ namespace {
263
+ // All severity strings should be ENCODE_LEN chars long
264
+ const char * SEV_LEVELS[] = {
265
+ " SEV_DEF " ,
266
+ " SEV_FAT " ,
267
+ " SEV_CRI " ,
268
+ " SEV_ERR " ,
269
+ " SEV_WAR " ,
270
+ " SEV_NOT " ,
271
+ " SEV_INF " ,
272
+ " SEV_DEB " ,
273
+ " SEV_TRA "
274
+ };
275
+
276
+ static_assert (sizeof (SEV_LEVELS) == sizeof (*SEV_LEVELS) * ((size_t )(sinsp_logger::SEV_MAX) + 1 ),
277
+ " severity array must have SEV_MAX+1 elements" );
278
+ }
279
+
280
+ const char * sinsp_logger::encode_severity (const sinsp_logger::severity sev)
281
+ {
282
+ const char * ret;
283
+ auto sev_int = (size_t )sev;
284
+ if (sev_int > SEV_MAX)
285
+ {
286
+ sev_int = 0 ;
287
+ }
288
+
289
+ ret = SEV_LEVELS[sev_int];
290
+ assert (strlen (ret) == ENCODE_LEN);
291
+ return ret;
292
+ }
293
+
294
+ size_t sinsp_logger::decode_severity (const std::string &str, severity& sev)
295
+ {
296
+ if (str.length () < ENCODE_LEN)
297
+ {
298
+ return 0 ;
299
+ }
300
+
301
+ const char * msg = str.c_str ();
302
+
303
+ // we don't really expect "SEV_DEF " messages so skip severity 0
304
+ for (size_t i = SEV_MIN; i <= SEV_MAX; ++i)
305
+ {
306
+ if (!strncmp (msg, SEV_LEVELS[i], ENCODE_LEN))
307
+ {
308
+ sev = static_cast <severity>(i);
309
+ return ENCODE_LEN;
310
+ }
311
+ }
312
+
313
+ return 0 ;
314
+ }
0 commit comments