Skip to content

Commit ef3e2b9

Browse files
Add jbpf-like logger (#73)
1 parent 1ac6ad2 commit ef3e2b9

File tree

2 files changed

+83
-6
lines changed

2 files changed

+83
-6
lines changed

src/logger/jrtc_logging.c

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,30 @@
55
#include <stdarg.h>
66
#include <stdio.h>
77
#include <string.h>
8+
#include <time.h>
9+
#include <sys/time.h>
810

911
static const char* STR[] = {FOREACH_LOG_LEVEL(GENERATE_STRING)};
1012

1113
void
1214
jrtc_default_va_logging(const char* domain, jrtc_logging_level level, const char* s, va_list arg)
1315
{
14-
char output[LOGGING_BUFFER_LEN];
15-
snprintf(output, LOGGING_BUFFER_LEN, "%s %s%s", domain, STR[level], s);
16-
1716
if (level >= jrtc_logger_level) {
17+
char output[LOGGING_BUFFER_LEN];
18+
19+
// Get current time in milliseconds
20+
struct timeval tv;
21+
gettimeofday(&tv, NULL);
22+
23+
// Format the timestamp
24+
char timestamp[64];
25+
struct tm* tm_info = gmtime(&tv.tv_sec);
26+
strftime(timestamp, sizeof(timestamp), "%Y-%m-%dT%H:%M:%S", tm_info);
27+
snprintf(timestamp + strlen(timestamp), sizeof(timestamp) - strlen(timestamp), ".%06ldZ", tv.tv_usec);
28+
29+
// Add timestamp and log level
30+
snprintf(output, LOGGING_BUFFER_LEN, "%s %s%s%s", timestamp, domain, STR[level], s);
31+
1832
FILE* where = level >= INFO ? stderr : stdout;
1933
vfprintf(where, output, arg);
2034
fflush(where);
@@ -26,7 +40,17 @@ jrtc_default_logging(const char* domain, jrtc_logging_level level, const char* s
2640
{
2741
if (level >= jrtc_logger_level) {
2842
char output[LOGGING_BUFFER_LEN];
29-
snprintf(output, LOGGING_BUFFER_LEN, "%s %s%s", domain, STR[level], s);
43+
// Get current time in milliseconds
44+
struct timeval tv;
45+
gettimeofday(&tv, NULL);
46+
47+
// Format the timestamp
48+
char timestamp[64];
49+
struct tm* tm_info = gmtime(&tv.tv_sec);
50+
strftime(timestamp, sizeof(timestamp), "%Y-%m-%dT%H:%M:%S", tm_info);
51+
snprintf(timestamp + strlen(timestamp), sizeof(timestamp) - strlen(timestamp), ".%06ldZ", tv.tv_usec);
52+
53+
snprintf(output, LOGGING_BUFFER_LEN, "%s %s %s", timestamp, domain, s);
3054
va_list ap;
3155
va_start(ap, s);
3256
FILE* where = level >= INFO ? stderr : stdout;

src/logger/jrtc_logging.h

Lines changed: 55 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@
77
#include <stddef.h>
88
#include <stdarg.h>
99
#include <stdio.h>
10+
#include <stdlib.h>
11+
#include <ctype.h>
12+
#include <string.h>
1013

1114
#pragma once
1215
#ifdef __cplusplus
@@ -39,13 +42,63 @@ extern "C"
3942
#define _STR(x) _VAL(x)
4043
#define _VAL(x) #x
4144

45+
static inline const char*
46+
get_file_name(const char* file)
47+
{
48+
const char* p = strrchr(file, '/');
49+
return p ? p + 1 : file;
50+
}
51+
52+
static inline char*
53+
get_domain(const char* file)
54+
{
55+
const char* p = strstr(file, "src/");
56+
if (p) {
57+
p += 4; // Move past "src/"
58+
const char* q = strchr(p, '/');
59+
if (q) {
60+
size_t len = q - p;
61+
char* domain = (char*)malloc(len + 1);
62+
if (!domain) {
63+
return NULL; // Indicate failure
64+
}
65+
memcpy(domain, p, len);
66+
domain[len] = '\0';
67+
// make it uppercase
68+
for (size_t i = 0; i < len; i++) {
69+
domain[i] = toupper(domain[i]);
70+
}
71+
return domain;
72+
}
73+
}
74+
return NULL;
75+
}
76+
4277
// Function to generate the log prefix dynamically
4378
static inline const char*
4479
get_log_prefix(const char* file, const char* func, int line, const char* level)
4580
{
4681
static char buffer[256];
47-
snprintf(buffer, sizeof(buffer), "[%s:%s:%s:%d]", level, file, func, line);
48-
return buffer;
82+
char* domain = get_domain(file);
83+
// we may want to cache this, but for now we will just check the env var each time
84+
int JRTC_VERBOSE_LOGGING = getenv("JRTC_VERBOSE_LOGGING") != NULL;
85+
if (JRTC_VERBOSE_LOGGING) {
86+
if (domain) {
87+
snprintf(buffer, sizeof(buffer), "[JRTC][%s]:%s:%s:%d", domain, get_file_name(file), func, line);
88+
} else {
89+
snprintf(buffer, sizeof(buffer), "[JRTC]:%s:%s:%d", get_file_name(file), func, line);
90+
}
91+
free(domain);
92+
return buffer;
93+
} else {
94+
if (domain) {
95+
snprintf(buffer, sizeof(buffer), "[JRTC][%s]", domain);
96+
} else {
97+
snprintf(buffer, sizeof(buffer), "[JRTC]");
98+
}
99+
free(domain);
100+
return buffer;
101+
}
49102
}
50103

51104
// Define macros using the helper function

0 commit comments

Comments
 (0)