Files
UnrealEngine/Engine/Source/Programs/UnrealVirtualizationTool/Private/OverrideOutputDevice.cpp
2025-05-18 13:04:45 +08:00

86 lines
2.0 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "OverrideOutputDevice.h"
#include "Logging/StructuredLog.h"
#include "Misc/CoreDelegates.h"
#include "UnrealVirtualizationTool.h"
namespace UE
{
FOverrideOutputDevice::FOverrideOutputDevice()
{
OriginalLog = GWarn;
GWarn = this;
// If this was created before the output devices were initialized we need to register for a
// callback when they are initialized so that we can override them.
if (OriginalLog == nullptr)
{
OnInitHandle = FCoreDelegates::OnOutputDevicesInit.AddLambda([this]()
{
OriginalLog = GWarn;
GWarn = this;
});
}
}
FOverrideOutputDevice::~FOverrideOutputDevice()
{
GWarn = OriginalLog;
if (OnInitHandle.IsValid())
{
FCoreDelegates::OnOutputDevicesInit.Remove(OnInitHandle);
OnInitHandle.Reset();
}
}
void FOverrideOutputDevice::Serialize(const TCHAR* V, ELogVerbosity::Type Verbosity, const FName& Category, double Time)
{
#if !NO_LOGGING
if (ShouldFilterMessage(Verbosity, Category))
{
Verbosity = ELogVerbosity::Log;
}
#endif // !NO_LOGGING
FFeedbackContextAnsi::Serialize(V, Verbosity, Category, Time);
}
void FOverrideOutputDevice::SerializeRecord(const UE::FLogRecord& Record)
{
#if !NO_LOGGING
if (ShouldFilterMessage(Record.GetVerbosity(), Record.GetCategory()))
{
UE::FLogRecord LocalRecord = Record;
LocalRecord.SetVerbosity(ELogVerbosity::Log);
return FFeedbackContextAnsi::SerializeRecord(LocalRecord);
}
#endif // !NO_LOGGING
FFeedbackContextAnsi::SerializeRecord(Record);
}
bool FOverrideOutputDevice::ShouldFilterMessage(ELogVerbosity::Type Verbosity, const FName& Category)
{
#if !NO_LOGGING
// We only want 'LogVirtualizationTool' messages in display
if (Verbosity == ELogVerbosity::Display && Category != LogVirtualizationTool.GetCategoryName())
{
return true;
}
// Suppress errors from our reporting systems
if (Verbosity == ELogVerbosity::Error && Category == LogOutputDevice.GetCategoryName())
{
return true;
}
#endif // !NO_LOGGING
return false;
}
} // namespace UE