LoggerInterface Manual
The logger interface allows to create new custom loggers for specific tasks and to access existing loggers. Loggers are presented in the "Console" window in Cinema 4D and registered at the maxon::Loggers registry.
Messages can be sent to the default logger using ApplicationOutput() .
A new custom logger can be created with maxon::LoggerRef::Create() and is then registered at maxon::Loggers . A logger type defines the target of the logger (see Logger Types ).
A custom logger is configured with:
// define logger ID const maxon::Id loggerID { "net.maxonexample.logger" };
// check if a logger with that ID already exists if (! maxon::Loggers::Get (loggerID)) { // create the new logger and store it in a global variable for later access // make sure to set this object to nullptr when Cinema shuts down iferr (g_exampleLogger = maxon::LoggerRef::Create()) { // if the logger could not be created, use the default logger instead g_exampleLogger = maxon::Loggers::Default(); } else { // if the logger could be created // add the logger type "Application" to display logged messages in the "Console" window g_exampleLogger.AddLoggerType( maxon::TARGETAUDIENCE::ALL , maxon::LoggerTypes::Application()) iferr_return ;
// define logger name g_exampleLogger.SetName( "Example Logger" _s); // insert the logger in the "Loggers" registry maxon::Loggers::Insert(loggerID, g_exampleLogger) iferr_return ;
// this message must be send to update the console window const maxon::Int32 BFM_REBUILDCONSOLETREE = 334295845; SpecialEventAdd (BFM_REBUILDCONSOLETREE); } }
// This example shows how to free the logger reference.
// make sure to also remove the entry of your logger from Loggers. maxon::Loggers::Erase( maxon::Id { "net.maxonexample.logger" }) iferr_ignore ( "" ); }
A message is sent to a custom logger using the Write() function:
// write to a custom logger referenced in g_exampleLogger g_exampleLogger.Write( maxon::TARGETAUDIENCE::ALL , "Foo" _s, MAXON_SOURCE_LOCATION , maxon::WRITEMETA::CRITICAL ) iferr_return ;
// or write to the logger by getting the logger using the logger ID
// get logger const maxon::Id loggerId { "net.maxonexample.logger" }; const maxon::LoggerRef logger = maxon::Loggers::Get (loggerId); logger.Write( maxon::TARGETAUDIENCE::ALL , "Bar" _s, MAXON_SOURCE_LOCATION , maxon::WRITEMETA::DEFAULT ) iferr_return ;
All existing loggers are registered at maxon::Loggers . These three loggers are there for public use:
A logger type implements the actual processing of a given message e.g. if that message is displayed in the GUI or written to a file.
Logger types are based on maxon::LoggerTypeInterface :
maxon::UserLoggerTypeInterface is the logger type that displays the message in Cinema 4D 's "Console" window:
maxon::FileLoggerTypeInterface is the logger type that writes the message to a file:
// get default logger const maxon::LoggerRef defaultLogger = maxon::Loggers::Default(); for ( const auto & logger : defaultLogger.GetLoggerTypes()) { const maxon::LoggerTypeRef loggerType = logger.GetFirst(); // get first element of the pair
if (loggerType.IsInstanceOf<maxon::UserLoggerTypeRef>()) { const maxon::UserLoggerTypeRef userLoggerType = maxon::Cast<maxon::UserLoggerTypeRef>(loggerType);// iterate over all lines sent to the logger userLoggerType.Iterate([]( maxon::LoggerLine & line) -> maxon::Result<void> { DiagnosticOutput ( "Line: @" , line. _str ); return maxon::OK ; }) iferr_return ; } }