Gems/AWSNativeSDKInit/Code/Source/Clients/AWSLogSystemInterface.cpp (115 lines of code) (raw):
/*
* Copyright (c) Contributors to the Open 3D Engine Project.
* For complete copyright and license terms please see the LICENSE at the root of this distribution.
*
* SPDX-License-Identifier: Apache-2.0 OR MIT
*
*/
#include "AWSLogSystemInterface.h"
#include <AzCore/base.h>
#include <AzCore/Console/IConsole.h>
#include <AzCore/Interface/Interface.h>
#include <AzCore/Module/Environment.h>
#include <stdarg.h>
#if defined(PLATFORM_SUPPORTS_AWS_NATIVE_SDK)
AZ_PUSH_DISABLE_WARNING(4251 4996, "-Wunknown-warning-option")
#include <aws/core/utils/logging/AWSLogging.h>
#include <aws/core/utils/logging/DefaultLogSystem.h>
#include <aws/core/utils/logging/ConsoleLogSystem.h>
AZ_POP_DISABLE_WARNING
#endif
namespace AWSNativeSDKInit
{
AZ_CVAR(int, bg_awsLogLevel, -1, nullptr, AZ::ConsoleFunctorFlags::Null,
"AWSLogLevel used to control verbosity of logging system. Off = 0, Fatal = 1, Error = 2, Warn = 3, Info = 4, Debug = 5, Trace = 6");
const char* AWSLogSystemInterface::AWS_API_LOG_PREFIX = "AwsApi-";
const int AWSLogSystemInterface::MAX_MESSAGE_LENGTH = 4096;
const char* AWSLogSystemInterface::MESSAGE_FORMAT = "[AWS] %s - %s";
const char* AWSLogSystemInterface::ERROR_WINDOW_NAME = "AwsNativeSDK";
AWSLogSystemInterface::AWSLogSystemInterface(Aws::Utils::Logging::LogLevel logLevel)
: m_logLevel(logLevel)
{
}
/**
* Gets the currently configured log level for this logger.
*/
Aws::Utils::Logging::LogLevel AWSLogSystemInterface::GetLogLevel() const
{
Aws::Utils::Logging::LogLevel newLevel = m_logLevel;
if (auto console = AZ::Interface<AZ::IConsole>::Get(); console != nullptr)
{
int awsLogLevel = -1;
console->GetCvarValue("bg_awsLogLevel", awsLogLevel);
if (awsLogLevel >= 0)
{
newLevel = static_cast<Aws::Utils::Logging::LogLevel>(awsLogLevel);
}
}
return newLevel;
}
/**
* Does a printf style output to the output stream. Don't use this, it's unsafe. See LogStream
*/
void AWSLogSystemInterface::Log(Aws::Utils::Logging::LogLevel logLevel, const char* tag, const char* formatStr, ...)
{
if (!ShouldLog(logLevel))
{
return;
}
char message[MAX_MESSAGE_LENGTH];
va_list mark;
va_start(mark, formatStr);
azvsnprintf(message, MAX_MESSAGE_LENGTH, formatStr, mark);
va_end(mark);
ForwardAwsApiLogMessage(logLevel, tag, message);
}
/**
* Writes the stream to the output stream.
*/
void AWSLogSystemInterface::LogStream(Aws::Utils::Logging::LogLevel logLevel, const char* tag, const Aws::OStringStream &messageStream)
{
if(!ShouldLog(logLevel))
{
return;
}
ForwardAwsApiLogMessage(logLevel, tag, messageStream.str().c_str());
}
bool AWSLogSystemInterface::ShouldLog(Aws::Utils::Logging::LogLevel logLevel)
{
#if defined(PLATFORM_SUPPORTS_AWS_NATIVE_SDK)
Aws::Utils::Logging::LogLevel newLevel = GetLogLevel();
if (newLevel != m_logLevel)
{
SetLogLevel(newLevel);
}
#endif
return (logLevel <= m_logLevel);
}
void AWSLogSystemInterface::SetLogLevel(Aws::Utils::Logging::LogLevel newLevel)
{
#if defined(PLATFORM_SUPPORTS_AWS_NATIVE_SDK)
Aws::Utils::Logging::ShutdownAWSLogging();
Aws::Utils::Logging::InitializeAWSLogging(Aws::MakeShared<AWSLogSystemInterface>("AWS", newLevel));
m_logLevel = newLevel;
#endif
}
void AWSLogSystemInterface::ForwardAwsApiLogMessage(Aws::Utils::Logging::LogLevel logLevel, const char* tag, const char* message)
{
#if defined(PLATFORM_SUPPORTS_AWS_NATIVE_SDK)
switch (logLevel)
{
case Aws::Utils::Logging::LogLevel::Off:
break;
case Aws::Utils::Logging::LogLevel::Fatal:
AZ::Debug::Trace::Instance().Error(__FILE__, __LINE__, AZ_FUNCTION_SIGNATURE, AWSLogSystemInterface::ERROR_WINDOW_NAME, MESSAGE_FORMAT, tag, message);
break;
case Aws::Utils::Logging::LogLevel::Error:
AZ::Debug::Trace::Instance().Error(__FILE__, __LINE__, AZ_FUNCTION_SIGNATURE, AWSLogSystemInterface::ERROR_WINDOW_NAME, MESSAGE_FORMAT, tag, message);
break;
case Aws::Utils::Logging::LogLevel::Warn:
AZ::Debug::Trace::Instance().Warning(__FILE__, __LINE__, AZ_FUNCTION_SIGNATURE, AWSLogSystemInterface::ERROR_WINDOW_NAME, MESSAGE_FORMAT, tag, message);
break;
case Aws::Utils::Logging::LogLevel::Info:
AZ::Debug::Trace::Instance().Printf(AWSLogSystemInterface::ERROR_WINDOW_NAME, MESSAGE_FORMAT, tag, message);
break;
case Aws::Utils::Logging::LogLevel::Debug:
AZ::Debug::Trace::Instance().Printf(AWSLogSystemInterface::ERROR_WINDOW_NAME, MESSAGE_FORMAT, tag, message);
break;
case Aws::Utils::Logging::LogLevel::Trace:
AZ::Debug::Trace::Instance().Printf(AWSLogSystemInterface::ERROR_WINDOW_NAME, MESSAGE_FORMAT, tag, message);
break;
default:
break;
}
#endif
}
void AWSLogSystemInterface::Flush()
{
#if defined(PLATFORM_SUPPORTS_AWS_NATIVE_SDK)
// No-op AZ Debug Trace doesn't have a flush API
#endif
}
}