Log manager SDK protocol

This commit is contained in:
Adam Honse
2026-05-06 17:43:13 -05:00
parent 4d379b97c6
commit 32f0f1a9a2
9 changed files with 461 additions and 77 deletions

View File

@@ -15,6 +15,9 @@
#include "filesystem.h"
#include "JsonUtils.h"
#include "LogManager.h"
#include "NetworkClient.h"
#include "NetworkServer.h"
#include "ResourceManager.h"
const char* LogManager::LOG_CODES[] = {"Fatal", "Error", "Warning", "Info", "Verbose", "Debug", "Trace", "Dialog"};
@@ -139,6 +142,14 @@ void LogManager::Configure(json config, const filesystem::path& config_dir)
\*-----------------------------------------------------*/
std::lock_guard<std::recursive_mutex> guard(entry_mutex);
/*-----------------------------------------------------*\
| Close the log file if it is already open |
\*-----------------------------------------------------*/
if(log_stream.is_open())
{
log_stream.close();
}
/*-----------------------------------------------------*\
| If the log is not open, create a new log file |
\*-----------------------------------------------------*/
@@ -215,18 +226,7 @@ void LogManager::Configure(json config, const filesystem::path& config_dir)
/*-----------------------------------------------------*\
| Check loglevel configuration |
\*-----------------------------------------------------*/
if(config.contains("loglevel"))
{
const json& loglevel_obj = config["loglevel"];
/*-------------------------------------------------*\
| Set the log level if configured |
\*-------------------------------------------------*/
if(loglevel_obj.is_number_integer())
{
loglevel = loglevel_obj;
}
}
loglevel = JsonUtils::JsonGetInt(config, "loglevel", LL_INFO);
/*-----------------------------------------------------*\
| Check log console configuration |
@@ -244,6 +244,11 @@ void LogManager::Configure(json config, const filesystem::path& config_dir)
\*---------------------------------------------------------*/
void LogManager::ClearLogBuffer()
{
if(ResourceManager::get()->IsLocalClient() && (ResourceManager::get()->GetLocalClient()->GetSupportsProfileManagerAPI()))
{
ResourceManager::get()->GetLocalClient()->LogManager_ClearLogBuffer();
}
all_messages.clear();
}
@@ -265,7 +270,7 @@ unsigned int LogManager::GetVerbosity()
return(verbosity);
}
void LogManager::SetLogLevel(unsigned int level)
void LogManager::SetLogLevel(unsigned int level, bool local_only)
{
/*-----------------------------------------------------*\
| Check that the new log level is valid, otherwise set |
@@ -276,6 +281,14 @@ void LogManager::SetLogLevel(unsigned int level)
level = LL_TRACE;
}
/*-----------------------------------------------------*\
| Set the server's log level if local client |
\*-----------------------------------------------------*/
if(!local_only && ResourceManager::get()->IsLocalClient() && (ResourceManager::get()->GetLocalClient()->GetSupportsLogManagerAPI()))
{
ResourceManager::get()->GetLocalClient()->LogManager_SetLogLevel(level);
}
LOG_DEBUG("[%s] LogLevel set to %d", LOGMANAGER, level);
/*-----------------------------------------------------*\
@@ -325,13 +338,73 @@ void LogManager::LogEntry(const char* filename, int line, unsigned int level, co
va_end(va);
}
void LogManager::LogEntry_va(const char* filename, int line, unsigned int level, const char* fmt, va_list va)
void LogManager::LogEntry_message(PLogMessage message)
{
/*-----------------------------------------------------*\
| Lock the entry mutex while adding an entry |
\*-----------------------------------------------------*/
std::lock_guard<std::recursive_mutex> guard(entry_mutex);
/*-----------------------------------------------------*\
| If this is a dialog message, call the dialog show |
| callback |
\*-----------------------------------------------------*/
if(message->level == LL_DIALOG)
{
for(size_t idx = 0; idx < LogManagerCallbacks.size(); idx++)
{
LogManagerCallbacks[idx](LogManagerCallbackArgs[idx], LOGMANAGER_UPDATE_REASON_SHOW_DIALOG, message);
}
}
else
{
for(size_t idx = 0; idx < LogManagerCallbacks.size(); idx++)
{
LogManagerCallbacks[idx](LogManagerCallbackArgs[idx], LOGMANAGER_UPDATE_REASON_LOG_ENTRY, message);
}
}
/*-----------------------------------------------------*\
| If the message is within the current verbosity, print |
| it on the screen |
\*-----------------------------------------------------*/
if(message->level <= verbosity || message->level == LL_DIALOG)
{
std::cout << std::left << "[" << std::setw(10) << message->timestamp << "]";
std::cout << std::left << "[" << std::setw(7) << LOG_CODES[message->level] << "]";
if(print_source)
{
std::cout << " [" << message->filename << ":" << message->line << "]";
}
std::cout << message->text;
std::cout << std::endl;
}
/*-----------------------------------------------------*\
| Add the message to the logfile queue |
\*-----------------------------------------------------*/
temp_messages.push_back(message);
if(log_console_enabled)
{
all_messages.push_back(message);
NetworkServer* server = ResourceManager::get()->GetServer();
if(server)
{
server->SignalLogManagerLoggedEntry(*message);
}
}
/*-----------------------------------------------------*\
| Flush the queues |
\*-----------------------------------------------------*/
flush();
}
void LogManager::LogEntry_va(const char* filename, int line, unsigned int level, const char* fmt, va_list va)
{
/*-----------------------------------------------------*\
| If a critical message occurs, enable source |
| printing and set loglevel and verbosity to highest |
@@ -376,55 +449,7 @@ void LogManager::LogEntry_va(const char* filename, int line, unsigned int level,
message->text.erase(std::remove(message->text.begin(), message->text.end(), '\r'), message->text.end());
}
/*-----------------------------------------------------*\
| If this is a dialog message, call the dialog show |
| callback |
\*-----------------------------------------------------*/
if(level == LL_DIALOG)
{
for(size_t idx = 0; idx < LogManagerCallbacks.size(); idx++)
{
LogManagerCallbacks[idx](LogManagerCallbackArgs[idx], LOGMANAGER_UPDATE_REASON_SHOW_DIALOG, message);
}
}
else
{
for(size_t idx = 0; idx < LogManagerCallbacks.size(); idx++)
{
LogManagerCallbacks[idx](LogManagerCallbackArgs[idx], LOGMANAGER_UPDATE_REASON_LOG_ENTRY, message);
}
}
/*-----------------------------------------------------*\
| If the message is within the current verbosity, print |
| it on the screen |
\*-----------------------------------------------------*/
if(level <= verbosity || level == LL_DIALOG)
{
std::cout << std::left << "[" << std::setw(10) << message->timestamp << "]";
std::cout << std::left << "[" << std::setw(7) << LOG_CODES[message->level] << "]";
if(print_source)
{
std::cout << " [" << message->filename << ":" << message->line << "]";
}
std::cout << message->text;
std::cout << std::endl;
}
/*-----------------------------------------------------*\
| Add the message to the logfile queue |
\*-----------------------------------------------------*/
temp_messages.push_back(message);
if(log_console_enabled)
{
all_messages.push_back(message);
}
/*-----------------------------------------------------*\
| Flush the queues |
\*-----------------------------------------------------*/
flush();
LogEntry_message(message);
}
/*---------------------------------------------------------*\