UE4 UE5

【UE4】【UE5】UE_LOGをエラーコードを指定して出力するようにラップしました

・ログ出力を通常のUE_LOGを出しつつ、出力したメッセージ(エラーとワーニング)をArrayに残し必要な時にとりだしたい。
・可変引数があっても同様に処理できるようにする。
・エラーコードでメッセージはテーブルで一括管理したい。
・エラーメッセージに固有のプレフィックスを残したい。


UE4_LOGをオーバーラップする

#define MY_LOG( CategoryName, Verbosity, Code, Format , … )\
{ \
auto UE_LOG_noinline_lambda=[](const auto& LCategoryName, const auto& LFromat, const auto&… UE_LOG_Args) FORCENOINLINE
{ \
FString Message; \
MessageLog( Message, LCategoryName.GetCategoryName(), ELogVerbosity::Verbosity, LCode, LFormat, UE_LOG_Args) ; \
UE_LOG ( CategoryName, Verbosity, TEXT("%s"), *Mesage ); \
}; \
UE_LOG_noinline_lambda( CategoryName, Code, Format, ##VA_ARGS); \
}

コード全般



FString MyMessageLog(FString& ErrorMessage, const FLogCategoryName& Category, ELogVerbosity::Type Verbosity, const int32 Code, const TCHAR* Fmt, … )
{
if( !bInit)
MyMessageInit();
TCHAR Message[4096];
FString *MessageFmt;


if( ( Code & 0xFFFFF) == 0 )
{
    // 0x0000の時は引数のメッセージを採用
    ErrorMessage = Fmt;
    return ErrorMessage;
}
else
{
    // 存在しなかったコードはエラー
    MessageFmt = MessageMap.Find(Code & 0xFFFFF);
    if( MessageFmt == nullptr )
    {
        ErrorMessage = *FString::Printf(TEXT("Error code not found [0x%05x]"), Code & 0xFFFFF );
        return ErrorMessage;
    }
}


// エラーとワーニングの時だけコードを付加
if( Verbosity == ELogVerbosity::Error || Verbosity == ELogVerbosity::Warning )
{
FString MyString( MessageFmt->GetCharArray());
const TCHAR* TFmt = *MyString;
GET_VARARGS(Message, UE_ARRAY_COUNT(Message), UE_ARRAY_COUNT(Message) - 1, Fmt, TFmt);
ErrorMessage = FString::Printf(TEXT("0x08x:"), Code & 0xFFFFF, LOGTYPE<<24 );
ErrorMessage += FString("[Error]:");
ErrorMessage += Message;
m_MessageLog.Add(FString(ErrorMessage));
}
return(ErrorMessage);
}

-UE4, UE5