static void writeLogRecord (const char *record) { if (logFile) { lockStream(logFile); { TimeValue now; char buffer[0X20]; size_t length; unsigned int milliseconds; getCurrentTime(&now); length = formatSeconds(buffer, sizeof(buffer), "%Y-%m-%d@%H:%M:%S", now.seconds); milliseconds = now.nanoseconds / NSECS_PER_MSEC; fprintf(logFile, "%.*s.%03u ", (int)length, buffer, milliseconds); } { char name[0X40]; size_t length = formatThreadName(name, sizeof(name)); if (length) fprintf(logFile, "[%s] ", name); } fputs(record, logFile); fputc('\n', logFile); flushStream(logFile); unlockStream(logFile); } }
void logData (int level, LogDataFormatter *formatLogData, const void *data) { const char *prefix = NULL; if (level & LOG_FLG_CATEGORY) { int category = level & LOG_MSK_CATEGORY; if (!logCategoryFlags[category]) return; level = categoryLogLevel; { const LogCategoryEntry *ctg = &logCategoryTable[category]; prefix = ctg->prefix; } } { int write = level <= systemLogLevel; int print = level <= stderrLogLevel; if (write || print) { int oldErrno = errno; char record[0X1000]; STR_BEGIN(record, sizeof(record)); if (prefix) STR_PRINTF("%s: ", prefix); { size_t sublength = formatLogData(STR_NEXT, STR_LEFT, data); STR_ADJUST(sublength); } STR_END if (write) { writeLogRecord(record); #if defined(WINDOWS) if (windowsEventLog != INVALID_HANDLE_VALUE) { const char *strings[] = {record}; ReportEvent(windowsEventLog, toWindowsEventType(level), 0, 0, NULL, ARRAY_COUNT(strings), 0, strings, NULL); } #elif defined(__MSDOS__) #elif defined(__ANDROID__) __android_log_write(toAndroidLogPriority(level), PACKAGE_TARNAME, record); #elif defined(HAVE_SYSLOG_H) if (syslogOpened) syslog(level, "%s", record); #endif /* write system log */ } if (print) { FILE *stream = stderr; lockStream(stream); if (logPrefixStack) { const char *prefix = logPrefixStack->prefix; if (*prefix) { fputs(prefix, stream); fputs(": ", stream); } } fputs(record, stream); fputc('\n', stream); flushStream(stream); unlockStream(stream); } errno = oldErrno; } }