3

アプリケーション用の単純なロガーがあります。(簡略化された)インターフェースは次のとおりです。

class ILogger
{
public:

    virtual void LogUnsafe(const LogPriority& priority, const boost::format& message) = 0;

    virtual void Log(const LogPriority& priority, const boost::format& message)
    {
        if (priority <= logPriority_)
        {
            std::unique_lock<std::mutex> lock(loggerMutex_);
            LogUnsafe(priority, message);
        }
    }

    void Log(const LogPriority& priority, const std::string& message)
    {
        Log(priority, boost::format(message));
    }

    template<typename T, typename... Args>
    void Log(const LogPriority& priority, boost::format &format, const T &v, Args... args)
    {
        Log(priority, boost::format(format) % v, args ...);
    }

    template<typename... Args>
    void Log(const LogPriority& priority, const char *format, Args... args)
    {
        boost::format fmt(format);
        Log(priority, fmt, args ...);
    }
};

ここで、(エラーを簡単に検出するために) すべてのログ メッセージに行と関数の情報を含める必要があります (__LINE__とを使用__FUNCTION__)。合理的には、関数の引数として渡す必要があります。そして、いつものように、ログメッセージを書くたびにそれらすべてのマクロを入力したくありません。だからここで困ってます。すべてのログメッセージに明示的に書き込まずに、ログ機能にエレガントに渡すにはどうすればよいですか?

前もって感謝します。

4

2 に答える 2

4

これを行うための「最も優れた」方法は、Neil が上で説明したように、マクロを介して作成されたログ オブジェクトを使用することです。これの「良い」点は、サイトで利用可能なすべての情報がカプセル化されているため、さまざまなロガーに渡すことができることです。たとえば、ネットワーク経由で送信し、ディスクやシステム モニター (Windows イベント ログなど) に送信する "ロガー" のチェーンを作成できます。また、プロデューサー/コンシューマー ロギング スレッドを使用してパフォーマンスを向上させることもできます。

class LogEntry{

    LogEntry(const boost::format& traceMsg, const unsigned int lineNumber, const std::string& file){
        //set members
    }

    std::string print(){
        // Do print logic... 
    }

    // Getters... Allow the logger instance build its own log from the info.
}

次にマクロを使用します。

#define LOG( format ) sendToLogQueue( LogEntry( format, __LINE__, std::string(__FILE__) ) );
于 2013-05-13T10:40:35.507 に答える
3

従来の方法は、ログコールをマクロで包み、コードでのみマクロを使用することです。

例えば

#ifdef NDEBUG
#define LOG(priority, message) \
   Log(priority,message)
...
#else
#define LOG(priority, message) \
   Log(priority, message, __FILE__, __LINE__)
...
#endif

void function()
{
   LOG(PRI1, "Message");
}

次に、常に LOG マクロを使用します。

于 2013-05-13T10:21:11.143 に答える