summaryrefslogtreecommitdiff
path: root/log.cpp
diff options
context:
space:
mode:
authorPeter LaFosse <peter@vector35.com>2022-02-01 11:35:10 -0500
committerPeter LaFosse <peter@vector35.com>2022-03-16 08:05:27 -0400
commit5ce116e4d1d3c30537f3635c06d7a0c619e55e43 (patch)
treedd96aa9d6b55b26dd247cd0b7e4d0bdfc6a15681 /log.cpp
parentefb5d8ba056fbae3f57a80f813a18c4a6da60f28 (diff)
Add support for structured logging
Diffstat (limited to 'log.cpp')
-rw-r--r--log.cpp156
1 files changed, 144 insertions, 12 deletions
diff --git a/log.cpp b/log.cpp
index ba4bf2a2..0c6916b9 100644
--- a/log.cpp
+++ b/log.cpp
@@ -21,16 +21,16 @@
#define _CRT_SECURE_NO_WARNINGS
#include <stdarg.h>
#include <stdio.h>
+#include <thread>
#include "binaryninjaapi.h"
using namespace BinaryNinja;
using namespace std;
-
-void LogListener::LogMessageCallback(void* ctxt, BNLogLevel level, const char* msg)
+void LogListener::LogMessageCallback(void* ctxt, size_t session, BNLogLevel level, const char* msg, const char* logger_name, size_t tid)
{
LogListener* listener = (LogListener*)ctxt;
- listener->LogMessage(level, msg);
+ listener->LogMessage(session, level, msg, logger_name, tid);
}
@@ -75,7 +75,7 @@ void LogListener::UpdateLogListeners()
}
-static void PerformLog(BNLogLevel level, const char* fmt, va_list args)
+static void PerformLog(size_t session, BNLogLevel level, const string& logger_name, size_t tid, const char* fmt, va_list args)
{
#if defined(_MSC_VER)
int len = _vscprintf(fmt, args);
@@ -85,13 +85,13 @@ static void PerformLog(BNLogLevel level, const char* fmt, va_list args)
if (!msg)
return;
if (vsnprintf(msg, len + 1, fmt, args) >= 0)
- BNLog(level, "%s", msg);
+ BNLog(session, level, logger_name.c_str(), tid, "%s", msg);
free(msg);
#else
char* msg;
if (vasprintf(&msg, fmt, args) < 0)
return;
- BNLog(level, "%s", msg);
+ BNLog(session, level, logger_name.c_str(), tid, "%s", msg);
free(msg);
#endif
}
@@ -101,7 +101,7 @@ void BinaryNinja::Log(BNLogLevel level, const char* fmt, ...)
{
va_list args;
va_start(args, fmt);
- PerformLog(level, fmt, args);
+ PerformLog(0, level, "", 0, fmt, args);
va_end(args);
}
@@ -110,7 +110,7 @@ void BinaryNinja::LogDebug(const char* fmt, ...)
{
va_list args;
va_start(args, fmt);
- PerformLog(DebugLog, fmt, args);
+ PerformLog(0, DebugLog, "", 0, fmt, args);
va_end(args);
}
@@ -119,7 +119,7 @@ void BinaryNinja::LogInfo(const char* fmt, ...)
{
va_list args;
va_start(args, fmt);
- PerformLog(InfoLog, fmt, args);
+ PerformLog(0, InfoLog, "", 0, fmt, args);
va_end(args);
}
@@ -128,7 +128,7 @@ void BinaryNinja::LogWarn(const char* fmt, ...)
{
va_list args;
va_start(args, fmt);
- PerformLog(WarningLog, fmt, args);
+ PerformLog(0, WarningLog, "", 0, fmt, args);
va_end(args);
}
@@ -137,7 +137,7 @@ void BinaryNinja::LogError(const char* fmt, ...)
{
va_list args;
va_start(args, fmt);
- PerformLog(ErrorLog, fmt, args);
+ PerformLog(0, ErrorLog, "", 0, fmt, args);
va_end(args);
}
@@ -146,7 +146,7 @@ void BinaryNinja::LogAlert(const char* fmt, ...)
{
va_list args;
va_start(args, fmt);
- PerformLog(AlertLog, fmt, args);
+ PerformLog(0, AlertLog, "", 0, fmt, args);
va_end(args);
}
@@ -173,3 +173,135 @@ void BinaryNinja::CloseLogs()
{
BNCloseLogs();
}
+
+size_t Logger::GetThreadId() const
+{
+ return std::hash<std::thread::id>{}(std::this_thread::get_id());
+}
+
+Logger::Logger(BNLogger* logger)
+{
+ m_object = logger;
+}
+
+
+Logger::Logger(const string& loggerName, size_t sessionId)
+{
+ m_object = BNLogCreateLogger(loggerName.c_str(), sessionId);
+}
+
+
+void Logger::Log(BNLogLevel level, const char* fmt, ...)
+{
+ va_list args;
+ va_start(args, fmt);
+ PerformLog(GetSessionId(), level, GetName(), GetThreadId(), fmt, args);
+ va_end(args);
+}
+
+
+void Logger::LogDebug(const char* fmt, ...)
+{
+ va_list args;
+ va_start(args, fmt);
+ PerformLog(GetSessionId(), DebugLog, GetName(), GetThreadId(), fmt, args);
+ va_end(args);
+}
+
+
+void Logger::LogInfo(const char* fmt, ...)
+{
+ va_list args;
+ va_start(args, fmt);
+ PerformLog(GetSessionId(), InfoLog, GetName(), GetThreadId(), fmt, args);
+ va_end(args);
+}
+
+
+void Logger::LogWarn(const char* fmt, ...)
+{
+ va_list args;
+ va_start(args, fmt);
+ PerformLog(GetSessionId(), WarningLog, GetName(), GetThreadId(), fmt, args);
+ va_end(args);
+}
+
+
+void Logger::LogError(const char* fmt, ...)
+{
+ va_list args;
+ va_start(args, fmt);
+ PerformLog(GetSessionId(), ErrorLog, GetName(), GetThreadId(), fmt, args);
+ va_end(args);
+}
+
+
+void Logger::LogAlert(const char* fmt, ...)
+{
+ va_list args;
+ va_start(args, fmt);
+ PerformLog(GetSessionId(), AlertLog, GetName(), GetThreadId(), fmt, args);
+ va_end(args);
+}
+
+
+string Logger::GetName()
+{
+ char* name = BNLoggerGetName(m_object);
+ string result = name;
+ BNFreeString(name);
+ return result;
+}
+
+
+size_t Logger::GetSessionId()
+{
+ return BNLoggerGetSessionId(m_object);
+}
+
+
+Ref<Logger> LogRegistry::CreateLogger(const std::string& loggerName, size_t sessionId)
+{
+ return new Logger(BNLogCreateLogger(loggerName.c_str(), sessionId));
+}
+
+
+Ref<Logger> LogRegistry::GetLogger(const std::string& loggerName, size_t sessionId)
+{
+ return new Logger(BNLogGetLogger(loggerName.c_str(), sessionId));
+}
+
+
+vector<string> LogRegistry::GetLoggerNames()
+{
+ size_t count = 0;
+ char** names = BNLogGetLoggerNames(&count);
+ vector<string> result;
+ result.reserve(count);
+ for (size_t i = 0; i < count; ++i)
+ result.push_back(names[i]);
+ BNFreeStringList(names, count);
+ return result;
+}
+
+
+struct RegisterLoggerCallbackContext
+{
+ std::function<void(const string&)> func;
+};
+
+
+static void RegisterLoggerCallbackHelper(const char* name, void* ctxt)
+{
+ RegisterLoggerCallbackContext* cb = (RegisterLoggerCallbackContext*)ctxt;
+ cb->func(name);
+}
+
+
+void LogRegistry::RegisterLoggerCallback(const std::function<void(const string&)>& cb)
+{
+ // we leak this LoggerCallback but since you can't unregister them it doesn't really matter
+ auto loggerCallback = new RegisterLoggerCallbackContext;
+ loggerCallback->func = cb;
+ BNLogRegisterLoggerCallback(RegisterLoggerCallbackHelper, loggerCallback);
+}