クライアントはデフォルトでロガーを提供します。 アプリケーションに独自のロガーがある場合は、ログ管理が容易になるため、そちらを使用することを推奨します。

ロガーには、tablestore/util/logger.hpp で定義されているように、次の4つの要素があります。

  • Logger インターフェイス

    Logger は、ログの内容を Record オブジェクトに組み立てるために使用されます。この Record オブジェクトは、Sinker に転送され、Sinker によって書き出されます。 クライアントは Logger をツリー構造に編成します。そのルートは ClientOptions でユーザーが定義したロガーです。 リクエストロジックとネットワーキングロジックは、このルートロガーから派生した異なるサブロガーを使用します。

    class Logger
    {
    public:
    enum LogLevel
    {
        kDebug,
        kInfo,
        kError,
    };
    
    virtual ~Logger() {}
    virtual LogLevel level() const =0;
    virtual void record(LogLevel, const std::string&) =0;
    virtual Logger* spawn(const std::string& key) =0;
    virtual Logger* spawn(const std::string& key, LogLevel) =0;
    };
    				
    • level() は、Logger によって受け入れられたロググレードを返します。 低いグレードのログは Sinker に転送されません。
    • record() は、ログとそのグレードを受け入れ、それらを使用して、対応する Logger の Sinker に送信される Record オブジェクトを形成します。
    • spawn() は、サブロガーを派生させます。
  • Record インターフェイス

    Logger は Record オブジェクトを使用してログの内容を Sinker に転送します。

    Record インターフェイスはメソッド自体を提供しません。 Logger と Sinker は、Record クラスが提供するメソッドを決定します。

  • Sinker インターフェイス

    Sinker は Record オブジェクトの書き出しを担当しています。

    class Sinker
    {
    public:
    virtual ~Sinker() {}
    virtual void sink(Record*) =0;
    virtual void flush() =0;
    };
    				
    • sink() は、レコードを書き出します。 レコードはキャッシュにしか書き込めません。
    • flush() は、すべてのログが保存されていることを確認するためにキャッシュをクリアします。
  • SinkerCenter シングルトンオブジェクト

    SinkerCenter は、すべての Sinker オブジェクトを保持し、それらを特定のキーに関連付けます。

    class SinkerCenter
    {
    public:
    virtual ~SinkerCenter() {}
    static std::tr1::shared_ptr<SinkerCenter> singleton();
    
    virtual Sinker* registerSinker(const std::string& key, Sinker*) =0;
    virtual void flushAll() =0;
    };
    				
    • singleton() は、SinkerCenter シングルトンオブジェクトを取得します。
    • registerSinker() は、Sinker を SinkerCenter に登録します。
    • flushAll() は、SinkerCenter のすべての Sinker をクリアします。