用戶端預設提供一個日誌記錄器。如果您的應用有自己的日誌記錄器,為了便於管理日誌,建議您使用自己的日誌記錄器。

日誌記錄器有以下四個元素,定義在tablestore/util/logger.hpp

  • Logger介面

    Logger負責將日誌的內容組裝成Record對象,並轉交給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()接受一條日誌及其等級,組成Record對象後交給Logger對應的Sinker。
    • spawn()派生一個子日誌記錄器。
  • Record介面

    Record對象用於Logger向Sinker傳遞日誌內容。

    Record介面本身沒有任何方法。具體的Record類提供怎樣的方法由Logger與Sinker約定。

  • Sinke介面

    Sinker負責將Record對象寫出。

    class Sinker
    {
    public:
    virtual ~Sinker() {}
    virtual void sink(Record*) =0;
    virtual void flush() =0;
    };
    
    • sink(),寫出一條Record。可以只是寫到某個緩衝中。
    • 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(),在SinkerCenter中註冊一個Sinker。
    • flushAll(),將SinkerCenter中的所有Sinker都刷一遍。