

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# AWS SDK for C\$1\$1 でのログ記録の設定と使用
<a name="logging"></a>

AWS SDK for C\$1\$1 には、実行中に SDK によって実行されたアクションの記録を生成する、設定可能なログ記録が含まれています。ログ記録を有効にするには、`SDKOptions` の `LogLevel` をアプリケーションに適した詳細レベルに設定します。

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

7 つの詳細レベルから選択できます。デフォルトは `Off` で、ログは生成されません。`Trace` に設定すると、最も詳細なログが出力され、`Fatal` に設定すると、致命的なエラー状態のみをレポートする最小限のメッセージが生成されます。

アプリケーションでログ記録が有効になると、SDK によって `aws_sdk_<date>.log` というデフォルトの命名パターンに従って、実行可能ファイルのディレクトリにログファイルが生成されます。プレフィックス命名オプションによって生成されたログファイルは、ログファイルのアーカイブや削除ができるように、1 時間ごとにローテーションされます。

SDK の後期バージョンでは、基盤となる AWS 共通ランタイム (CRT) ライブラリへの依存度が高まっています。これらのライブラリは、各種 SDK 間で共通の機能や基本的なオペレーションを提供します。CRT ライブラリからのすべてのログメッセージは、デフォルトで SDK for C\$1\$1 にリダイレクトされます。SDK for C\$1\$1 に指定したログレベルとログ記録システムは、CRT にも適用されます。

前の例では、CRT は `LogLevel::Info` を継承し、`Info` レベルのメッセージも同じファイルに記録します。

CRT ライブラリのログ記録は、出力を別のログファイルにリダイレクトするか、CRT からのメッセージに別のログレベルを設定することで、個別に制御できます。多くの場合、CRT ライブラリの詳細レベルを下げることで、ログが過剰にならないようにするのが有効です。例えば、CRT 出力*のみ*のログレベルを次のように `Warn` に設定できます。

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

オプションでメソッド `InitializeAWSLogging` を使用することで、`DefaultLogSystem` の詳細レベルとログ出力先を制御できます。ログファイル名のプレフィックスを設定したり、出力先をファイルではなくストリームに変更したりすることもできます。

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

または、`DefaultLogSystem` を使用する代わりに、この方法を使用して独自のログ記録実装を提供することもできます。

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

メソッド `InitializeAWSLogging` を呼び出す場合は、プログラムの終了時に `ShutdownAWSLogging` を呼び出してリソースを解放します。

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

 **ログ記録を使用した統合テストの例** 

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

 **カスタムログ記録のための `Aws::Utils::Logging::DefaultLogSystem` のサブクラスの例** 

 次のコードは、AWS SDK for C\$1\$1 の一部である `Aws::Utils::Logging::DefaultLogSystem` クラスを継承する方法を示しています。この例では、`ProcessFormattedStatement` 仮想関数をオーバーライドしてログ記録をカスタマイズしています。

 `Aws::Utils::Logging::DefaultLogSystem` は、AWS SDK for C\$1\$1 内でカスタムログ記録のために `Aws::Utils::Logging::LogSystemInterface` を継承しているクラスの 1 つです。

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

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/cpp/example_code/sdk-customization/override_default_logger.cpp) で完全な例をご覧ください。