Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.
Configuración y uso de registros en el AWS SDK para C++
AWS SDK para C++ incluye un registro configurable que genera un registro de las acciones realizadas por el SDK durante la ejecución. Para habilitar el registro, defina el SDKOptions de LogLevel con la nivel de detalle adecuado para su aplicación.
Aws::SDKOptions options; options.loggingOptions.logLevel = Aws::Utils::Logging::LogLevel::Info;
Hay siete niveles de detalle entre los que puede elegir. El valor predeterminado es Off y no se generará ningún registro. Trace generará el mayor nivel de detalle y Fatal generará la menor cantidad de mensajes que informen solo de situaciones de error graves.
Una vez activado el registro en la aplicación, el SDK generará los archivos de registro en el directorio del ejecutable siguiendo el patrón de nomenclatura predeterminado de aws_sdk_<date>.log. El archivo de registro generado por la opción de nomenclatura de prefijos se transfiere una vez por hora para poder archivar o eliminar los archivos de registro.
Las versiones posteriores del SDK dependen cada vez más de las bibliotecas AWS Common Runtime (CRT) subyacentes. Estas bibliotecas proporcionan funciones comunes y operaciones básicas entre los SDK. Todos los mensajes de registro de las bibliotecas CRT se redirigirán al SDK para C++ de forma predeterminada. El nivel de registro y el sistema de registro que especifique para el SDK para C++ se aplicarán también al CRT.
En el ejemplo anterior, el CRT heredará LogLevel::Info y registrará también los mensajes del nivel Info en el mismo archivo.
Puede controlar de forma independiente el registro de las bibliotecas CRT, ya sea redirigiendo su salida a un archivo de registro independiente o configurando un nivel de registro diferente para los mensajes del CRT. A menudo, puede resultar práctico reducir el nivel de detalle de las bibliotecas CRT para que no sobrecarguen los registros. Por ejemplo, el nivel de registro solo para la salida CRT se puede establecer en Warn de la siguiente manera:
options.loggingOptions.crt_logger_create_fn = [](){ return Aws::MakeShared<Aws::Utils::Logging::DefaultCRTLogSystem>("CRTLogSystem", Aws::Utils::Logging::LogLevel::Warn); };
Si opta por utilizar el métodoInitializeAWSLogging, puede controlar el nivel de detalle y la salida de registro del DefaultLogSystem. Puede configurar el prefijo del nombre del archivo de registro o redireccionar la salida a un flujo en lugar de a un archivo.
Aws::Utils::Logging::InitializeAWSLogging( Aws::MakeShared<Aws::Utils::Logging::DefaultLogSystem>( "RunUnitTests", Aws::Utils::Logging::LogLevel::Trace, "aws_sdk_"));
O también, en lugar de usar el DefaultLogSystem, puede usar este método para proporcionar su propia implementación de registro.
InitializeAWSLogging(Aws::MakeShared<CustomLoggingSystem>());
Si llama al método InitializeAWSLogging, libere los recursos al final de su programa llamando a ShutdownAWSLogging.
Aws::Utils::Logging::ShutdownAWSLogging();
Ejemplo de prueba de integración con registro
#include <aws/external/gtest.h> #include <aws/core/utils/memory/stl/AWSString.h> #include <aws/core/utils/logging/DefaultLogSystem.h> #include <aws/core/utils/logging/AWSLogging.h> #include <iostream> int main(int argc, char** argv) { Aws::Utils::Logging::InitializeAWSLogging( Aws::MakeShared<Aws::Utils::Logging::DefaultLogSystem>( "RunUnitTests", Aws::Utils::Logging::LogLevel::Trace, "aws_sdk_")); ::testing::InitGoogleTest(&argc, argv); int exitCode = RUN_ALL_TESTS(); Aws::Utils::Logging::ShutdownAWSLogging(); return exitCode; }
Ejemplo de subclase de Aws::Utils::Logging::DefaultLogSystem para un registro personalizado
El siguiente código muestra cómo subclasificar la clase Aws::Utils::Logging::DefaultLogSystem, que forma parte del AWS SDK para C++. En este ejemplo, se anula la función ProcessFormattedStatement virtual para personalizar el registro.
Aws::Utils::Logging::DefaultLogSystem es una de las diversas clases de AWS SDK para C++ que subclasifica Aws::Utils::Logging::LogSystemInterface para un registro personalizado.
class LogSystemOverride : public Aws::Utils::Logging::DefaultLogSystem { public: explicit LogSystemOverride(Aws::Utils::Logging::LogLevel logLevel, const Aws::String &logPrefix) : DefaultLogSystem(logLevel, logPrefix), mLogToStreamBuf(false) {} const Aws::Utils::Stream::SimpleStreamBuf &GetStreamBuf() const { return mStreamBuf; } void setLogToStreamBuf(bool logToStreamBuf) { mLogToStreamBuf = logToStreamBuf; } protected: void ProcessFormattedStatement(Aws::String &&statement) override { if (mLogToStreamBuf) { std::lock_guard<std::mutex> lock(mStreamMutex); mStreamBuf.sputn(statement.c_str(), statement.length()); } DefaultLogSystem::ProcessFormattedStatement(std::move(statement)); } private: Aws::Utils::Stream::SimpleStreamBuf mStreamBuf; // Use a mutex when writing to the buffer because // ProcessFormattedStatement can be called from multiple threads. std::mutex mStreamMutex; std::atomic<bool> mLogToStreamBuf; };
int main(int argc, char **argv) { Aws::SDKOptions options; options.loggingOptions.logLevel = Aws::Utils::Logging::LogLevel::Trace; auto logSystemOverride = Aws::MakeShared<LogSystemOverride>("AllocationTag", options.loggingOptions.logLevel, options.loggingOptions.defaultLogPrefix); options.loggingOptions.logger_create_fn = [logSystemOverride]() { return logSystemOverride; }; Aws::InitAPI(options); // Call Aws::InitAPI only once in an application. { Aws::Client::ClientConfiguration clientConfig; // Optional: Set to the AWS Region (overrides config file). // clientConfig.region = "us-east-1"; Aws::S3::S3Client s3Client(clientConfig); logSystemOverride->setLogToStreamBuf(true); auto outcome = s3Client.ListBuckets(); if (!outcome.IsSuccess()) { std::cerr << "ListBuckets error: " << outcome.GetError().GetExceptionName() << " " << outcome.GetError().GetMessage() << std::endl; } logSystemOverride->setLogToStreamBuf(false); std::cout << "Log for ListBuckets" << std::endl; std::cout << logSystemOverride->GetStreamBuf().str() << std::endl; } Aws::ShutdownAPI(options); return 0; }
Consulte el ejemplo completo