Log Macro with Netmode and Colour
Contents
Overview
Macro that adds the current netmode and colour to logging, as well as making it easier to use.
Not recommended as a replacement for UE_LOG, but as a quick'n dirty tool for rapid iteration.
YourProject.h
#define NETMODE_WORLD (((GEngine == nullptr) || (GetWorld() == nullptr)) ? TEXT("") \
: (GEngine->GetNetMode(GetWorld()) == NM_Client) ? TEXT("[Client] ") \
: (GEngine->GetNetMode(GetWorld()) == NM_ListenServer) ? TEXT("[ListenServer] ") \
: (GEngine->GetNetMode(GetWorld()) == NM_DedicatedServer) ? TEXT("[DedicatedServer] ") \
: TEXT("[Standalone] "))
#if _MSC_VER
#define FUNC_NAME TEXT(__FUNCTION__)
#else // FIXME - GCC?
#define FUNC_NAME TEXT(__func__)
#endif
#define TRACE(Format, ...) \
{ \
SET_WARN_COLOR(COLOR_CYAN);\
const FString Msg = FString::Printf(TEXT(Format), ##__VA_ARGS__); \
if (Msg == "") \
{ \
UE_LOG(LogYourCategory, Log, TEXT("%s%s() : %s"), NETMODE_WORLD, FUNC_NAME, *GetNameSafe(this));\
} \
else \
{ \
UE_LOG(LogYourCategory, Log, TEXT("%s%s() : %s"), NETMODE_WORLD, FUNC_NAME, *Msg);\
} \
CLEAR_WARN_COLOR();\
}
#define TRACESTATIC(Format, ...) \
{ \
SET_WARN_COLOR(COLOR_CYAN);\
const FString Msg = FString::Printf(TEXT(Format), ##__VA_ARGS__); \
UE_LOG(LogYourCategory, Log, TEXT("%s() : %s"), FUNC_NAME, *Msg);\
CLEAR_WARN_COLOR();\
}
#define TRACEWARN(Format, ...) \
{ \
SET_WARN_COLOR( COLOR_YELLOW );\
const FString Msg = FString::Printf(TEXT(Format), ##__VA_ARGS__); \
UE_LOG(LogYourCategory, Log, TEXT("**WARNING** %s%s() : %s"), NETMODE_WORLD, FUNC_NAME, *Msg);\
CLEAR_WARN_COLOR();\
}
#define TRACEERROR(Format, ...) \
{ \
SET_WARN_COLOR( COLOR_RED );\
const FString Msg = FString::Printf(TEXT(Format), ##__VA_ARGS__); \
UE_LOG(LogYourCategory, Log, TEXT("**ERROR** %s%s() : %s"), NETMODE_WORLD, FUNC_NAME, *Msg);\
CLEAR_WARN_COLOR();\
}
#define SCREENDEBUG(Format, ...) \
{ \
const FString Msg = FString::Printf(TEXT(Format), ##__VA_ARGS__); \
if (Msg == "") \
{ \
TCHAR StdMsg[MAX_SPRINTF] = TEXT(""); \
FCString::Sprintf(StdMsg, TEXT("%s%s() : %s"), NETMODE_WORLD, FUNC_NAME, *GetNameSafe(this)); \
GEngine->AddOnScreenDebugMessage(-1, 10.0f, FColor::White, StdMsg); \
} \
else \
{ \
GEngine->AddOnScreenDebugMessage(-1, 10.0f, FColor::White, Msg); \
} \
}
YourProject.cpp
DEFINE_LOG_CATEGORY( LogYourCategory );
Examples
Function logging
Usage:
void USomeClass::WithSomeFunction()
{
TRACE("");
}
Output:
LogYourCategory: [Standalone] USomeClass::WithSomeFunction() :
Variable logging
Usage:
void USomeClass::WithSomeFunction()
{
TRACE("Name: %s, Health %d, DistanceToEnemy: %f", *PlayerName.ToString(), Health, GetDistance(EnemyLoc));
}
Output:
LogYourCategory: [Client] USomeClass::WithSomeFunction() : Name: DudeGuy, Health 76, DistanceToEnemy: 128.0512
Credits
Spoof - original implementation.
Kris - simplification & netmode.