客户端默认提供一个日志记录器。如果您的应用有自己的日志记录器,为了便于管理日志,建议您使用自己的日志记录器。

日志记录器有以下四个元素,定义在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都刷一遍。