Configurar e usar o registro em log no AWS SDK para C++ - AWS SDK para C++

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Configurar e usar o registro em log no AWS SDK para C++

O AWS SDK para C++ inclui registro em log configurável que gera um registro das ações realizadas pelo SDK durante a execução. Para habilitar o registro em log, defina o LogLevel de SDKOptions com o detalhamento apropriado para sua aplicação.

Aws::SDKOptions options; options.loggingOptions.logLevel = Aws::Utils::Logging::LogLevel::Info;

Há sete níveis de detalhamento para escolher. O valor padrão é Off e nenhum log será gerado. Trace vai gerar o maior nível de detalhes, e Fatal vai gerar o mínimo de mensagens relatando apenas condições de erro fatais.

Depois que o registro em log estiver habilitado em sua aplicação, o SDK vai gerar arquivos de log em seu diretório executável seguindo o padrão de nomenclatura padrão de aws_sdk_<date>.log. O arquivo de log gerado pela opção de nomeação de prefixo é transferido uma vez por hora para permitir o arquivamento ou a exclusão de arquivos de log.

As versões posteriores do SDK dependem cada vez mais das bibliotecas subjacentes do AWS Common Runtime (CRT). Essas bibliotecas oferecem funcionalidades comuns e operações básicas entre os SDKs. Todas as mensagens de log das bibliotecas CRT serão redirecionadas para o SDK para C++ por padrão. O nível de log e o sistema de registro em log específicos do SDK para C++ também se aplicam ao CRT.

No exemplo anterior, o CRT herdará LogLevel::Info e também registrará em log as mensagens em nível de Info no mesmo arquivo.

É possível controlar de forma independente o registro em log das bibliotecas do CRT, redirecionando sua saída para um arquivo de log separado ou definindo um nível de log diferente para as mensagens do CRT. Muitas vezes, pode ser benéfico reduzir o detalhamento das bibliotecas do CRT para que elas não sobrecarreguem os logs. Por exemplo, o nível de log somente para a saída do CRT pode ser definido como Warn da seguinte forma:

options.loggingOptions.crt_logger_create_fn = [](){ return Aws::MakeShared<Aws::Utils::Logging::DefaultCRTLogSystem>("CRTLogSystem", Aws::Utils::Logging::LogLevel::Warn); };

Ao usar opcionalmente o método InitializeAWSLogging, você pode controlar o nível de detalhamento e a saída de log do DefaultLogSystem. É possível configurar o prefixo do nome de arquivo de log ou redirecionar a saída para um fluxo em vez de para um arquivo.

Aws::Utils::Logging::InitializeAWSLogging( Aws::MakeShared<Aws::Utils::Logging::DefaultLogSystem>( "RunUnitTests", Aws::Utils::Logging::LogLevel::Trace, "aws_sdk_"));

Como alternativa, em vez de usar o DefaultLogSystem, você também pode usar esse método para fornecer sua própria implementação de registro em log.

InitializeAWSLogging(Aws::MakeShared<CustomLoggingSystem>());

Se você chamar o método InitializeAWSLogging, libere recursos no final do seu programa chamando ShutdownAWSLogging.

Aws::Utils::Logging::ShutdownAWSLogging();

Exemplo de teste de integração com registro em log

#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; }

Exemplo de subclasse de Aws::Utils::Logging::DefaultLogSystem para registro em log personalizado

O código a seguir demonstra como subclassificar a classe Aws::Utils::Logging::DefaultLogSystem, que faz parte do AWS SDK para C++. Este exemplo substitui a função virtual ProcessFormattedStatement para personalizar o registro em log.

Aws::Utils::Logging::DefaultLogSystem é uma das várias classes no AWS SDK para C++ em que essa subclasse Aws::Utils::Logging::LogSystemInterface é usada para registro em log 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; }

Veja o exemplo completo no GitHub.