diff options
| author | Peter LaFosse <peter@vector35.com> | 2022-02-01 11:35:10 -0500 |
|---|---|---|
| committer | Peter LaFosse <peter@vector35.com> | 2022-03-16 08:05:27 -0400 |
| commit | 5ce116e4d1d3c30537f3635c06d7a0c619e55e43 (patch) | |
| tree | dd96aa9d6b55b26dd247cd0b7e4d0bdfc6a15681 /log.cpp | |
| parent | efb5d8ba056fbae3f57a80f813a18c4a6da60f28 (diff) | |
Add support for structured logging
Diffstat (limited to 'log.cpp')
| -rw-r--r-- | log.cpp | 156 |
1 files changed, 144 insertions, 12 deletions
@@ -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); +} |
