

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\$1\$1
<a name="logging"></a>

AWS SDK para C\$1\$1 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\$1\$1 de forma predeterminada. El nivel de registro y el sistema de registro que especifique para el SDK para C\$1\$1 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étodo`InitializeAWSLogging`, 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\$1\$1. 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\$1\$1 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](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/cpp/example_code/sdk-customization/override_default_logger.cpp) en GitHub.