Skip to content

Logging

ERS has built-in support to log messages at different levels of priority, enabling easy filtering of different messages. From least to most urgent, they are:

Name Short name
Trace T
Debug D
Info I
Warning W
Error E
Critical C

To log to each of these levels, the following functions can be used. Additionally, the log level can be set to only show messages of a certain level or up in the output.

// Only message of the info, warning, error and critical level are shown
Ers::Logger::SetLogLevel(Ers::Logger::LogLevel::Info);

Ers::Logger::Trace("Message");                                // Not shown
Ers::Logger::Debug("Message");                                // Not shown
Ers::Logger::Info(std::format("Message {}", 2));              // Logs: "Message 2"
Ers::Logger::Warning(std::format("Message {:.2f}", 1.2345f)); // Logs: "Message 1.23"
Ers::Logger::Error(std::format("{1} Message {0} {0}", 1, 2)); // Logs: "2 Message 1 1"
Ers::Logger::Critical("Message");                             // Logs: "Message"
// Only message of the info, warning, error and critical level are shown
Logger.SetLogLevel(LogLevel.Info);

Logger.Trace("Message");                   // Not shown
Logger.Debug("Message");                   // Not shown
Logger.Info("Message {0}", 2);             // Logs: "Message 2"
Logger.Warning("Message {0:F2}", 1.2345f); // Logs: "Message 1.23"
Logger.Error("{1} Message {0} {0}", 1, 2); // Logs: "2 Message 1 1"
Logger.Critical("Message");                // Logs: "Message"

C# tip

Notice how, in C#, it's possible to use the same features as the String.Format method to easily create a formatted string.

The output is formatted as the short name of the log level between square brackets, the thread ID, and then the log message.

[I] Thread [52044] Message 2
[W] Thread [52044] Message 1.23
[E] Thread [52044] 2 Message 1 1
[C] Thread [52044] Message

Extending the logging

Using the Ers::Logger::AddCallback function, it's possible to register a callback function that is called every time a message is logged in ERS. This can be useful when additional logic needs to be performed when a message is logged. For example, it may be used to write log messages to a file.

If a callback is no longer necessary, it can be removed again using the Logger::RemoveCallback function and the callback index that is returned by Logger::AddCallback.

void HandleLogMessage(Ers::Logger::LogLevel level, const char* message)
{
    // Do something with the logged message here
}

int main()
{
    Ers::Initialize();

    const size_t callbackIndex = Ers::Logger::AddCallback(&HandleLogMessage);

    // Later
    Ers::Logger::RemoveCallback(callbackIndex);

    Ers::Uninitialize();
    return 0;
}
static void HandleLogMessage(LogLevel level, string message)
{
    // Do something with the logged message here
}

static void Main(string[] args)
{
    ERS.Initialize();

    nuint callbackIndex = Logger.AddCallback(HandleLogMessage);

    // Later
    Logger.RemoveCallback(callbackIndex);

    ERS.Uninitialize();
}
Was this page helpful?