アプリケーションがログ機能を利用できるようにする最も簡単な方法は、ログメッセージを受信するクラス/関数を登録することです。彼らがそのメッセージで何をするかは完全にアプリケーション次第です。
C / C ++を使用すると、ライブラリで以下を使用できます。
typedef void (*LogMessageReceiver)(char const* message,
void* user_data);
void registerLogMessageReceiver(LogMessageReceiver receiver,
void* user_data);
アプリケーションはを呼び出して関数を登録できますregisterLogMessageReceiver
。適切なuser_data
。コードベースのロギングセクションで、適切なメッセージと登録済みのを使用してその関数を必ず呼び出す必要がありますuser_data
。
Cについて心配する必要がない場合は、メッセージの受信者としてクラスを使用できます。
struct LogMessageReceiver
{
virtual ~LogMessageReceiver() {}
virtual void receive(std::string const& message) = 0;
};
ライブラリに関数を追加して、アプリケーションがログメッセージレシーバーを登録できるようにします。
void registerLogMessageReceiver(LogMessageReceiver* receiver);
アプリケーションはLogMessageReceiver
、上記の関数を呼び出すことによってを登録できます。登録済みのの所有権に関して、いくつかのポリシー決定を行う必要がありますLogMessageReceiver
。ライブラリーがレシーバーの所有権を取得する場合、それdelete
はポインターでなければなりません。ライブラリがレシーバーの所有権を取得しない場合は、アプリケーションdelete
がレシーバーを処理する必要があります。
クラスをログメッセージレシーバーとして使用するuser_data
とregisterLogMessageReceiver
、のサブタイプがLogMessageReceiver
機能に役立つデータを自由に保持できるため、でビットを省略できます。receive
関数で追加のユーザーデータを渡す必要はありません。
そこからは、ロギングメカニズムがどの程度高度であるかに応じて、より複雑になる可能性があります。
たとえば、さまざまなログレベルを設定できます:Concise、Normal、Verbose、またはLoggingLevel1、LoggingLevel2、...、LoggingLevelN。
その場合、アプリケーションが使用したいロギングのレベルを制御できるようにする必要があります。
単純化したロギングメカニズムを超えて決定すると、選択肢は無限に広がります。ここでそれらを掘り下げることは意味がありません。