in sdk/userspace/utils/log.c [164:279]
static void _log(enum log_level level, const char *file, int line,
const char *func, const char *format, va_list ap,
int error_number)
{
struct timespec ts;
time_t ts_s;
unsigned long ts_us;
struct tm tm;
void *p;
int rc;
char message[LOG_MESSAGE_LENGTH_MAX];
size_t message_length = 0;
size_t t_len;
bool logged = false;
/* time */
rc = clock_gettime(CLOCK_REALTIME, &ts);
assert(!rc);
ts_s = ts.tv_sec;
p = gmtime_r(&ts_s, &tm);
assert(p);
t_len = strftime(&message[message_length],
sizeof(message) - message_length, "%Y-%m-%dT%T", &tm);
if (!t_len) {
internal_log("strftime() failed");
rc = 0;
}
message_length += t_len;
ts_us = ts.tv_nsec / 1000;
rc = snprintf(&message[message_length],
sizeof(message) - message_length, ".%06luZ, ", ts_us);
if ((size_t)rc >= sizeof(message) - message_length) {
internal_log("snprintf() us failed");
rc = 0;
}
message_length += rc;
/* name */
rc = snprintf(&message[message_length],
sizeof(message) - message_length, "%s, ", priv.name);
if ((size_t)rc >= sizeof(message) - message_length) {
internal_log("snprintf() name failed");
rc = 0;
}
message_length += rc;
/* log level */
rc = snprintf(&message[message_length],
sizeof(message) - message_length,
"%s, ", str_log_level(level));
if ((size_t)rc >= sizeof(message) - message_length) {
internal_log("snprintf() log level failed");
rc = 0;
}
message_length += rc;
/* file, line, func */
rc = snprintf(&message[message_length],
sizeof(message) - message_length,
"%s +%d: %s(): ", file, line, func);
if ((size_t)rc >= sizeof(message) - message_length) {
internal_log("snprintf() file +line: func() failed");
rc = 0;
}
message_length += rc;
/* prefix */
if (priv_prefix[0]) {
rc = snprintf(&message[message_length],
sizeof(message) - message_length,
"%s: ", priv_prefix);
if ((size_t)rc >= sizeof(message) - message_length) {
internal_log("snprintf() prefix failed");
rc = 0;
}
message_length += rc;
}
/* message */
rc = vsnprintf(&message[message_length],
sizeof(message) - message_length, format, ap);
if ((size_t)rc >= sizeof(message) - message_length) {
internal_log("vsnprintf() message failed");
rc = 0;
}
message_length += rc;
/* error message */
if (error_number) {
rc = snprintf(&message[message_length],
sizeof(message) - message_length, ": %s",
str_error_number(error_number));
if ((size_t)rc >= sizeof(message) - message_length) {
internal_log("snprintf() error message failed");
rc = 0;
}
message_length += rc;
}
/* newline */
rc = snprintf(&message[message_length],
sizeof(message) - message_length,
"\n");
if ((size_t)rc >= sizeof(message) - message_length) {
internal_log("snprintf() \\n failed");
rc = 0;
}
message_length += rc;
for (size_t i = 0; i < priv.nr_loggers; i++) {
int rc;
rc = priv.loggers[i]->log(level, message);
if (!rc) {
logged = true;
continue;
}
internal_log("Could not log a message via the %s logger: %s",
priv.loggers[i]->name, str_error_number(-rc));
}
if (!logged)
stdout_log(level, message);
}